1. 程式人生 > >Git 分支管理與衝突解決

Git 分支管理與衝突解決

目錄:

  • Git 分支管理:本地分支、遠端倉庫分支
  • 合併模式
  • 衝突解決:本地衝突、推送衝突

Git 分支提供了並行工作的功能。 假設你準備同時學習 Git 和 SVN,你可以用兩個分支分別來學習,完成之後進行合併,你就掌握了兩種工具的使用了。 Git 和 GitHub 的基本操作可以參考我的這篇部落格Git 和 GitHub 使用。

1. 分支管理

檢視分支          git brance

建立分支          git branch dev      # dev 是分支名

切換分支          git checkout dev

建立+切換         git checkout -b dev

合併分支        git merge dev         #分支 dev 合併到 master
刪除分支        git branch -d dev    #已合併的分支

強行刪除分支         git branch -D dev    #分支未合併 
 檢視分支圖            git log --graph


遠端倉庫的分支

當你從遠端倉庫克隆時,實際上 Git 自動把本地的 master 分支和遠端的master分支對應起來了,並且,遠端倉庫的預設名稱是origin

如果要在遠端倉庫的其他分支 (如  dev分支)上開發,就必須建立遠端 origin/dev

分支到本地:

git checkout -b dev origin/dev       #建立遠端倉庫的分支到本地,必須先克隆或關聯一個遠端分支

本地分支和遠端分支的名字最好一致。

推送成功之後, GitHub 上的 MyRepos 倉庫 dev 分支上增加了一個檔案。


2. 分支合併模式

  • Fast forward 模式

預設模式,在這種模式下, 刪除分支後,會丟掉分支資訊,看不到合併記錄.。並不是任何情況都能用這種模式。

  • 普通模式

加上 --no-ff 引數就是普通模式。在普通模式下, Git 會在 merge 時生成一個新的 commit,這樣從分支歷史上就可以看出分支資訊。

普通模式


快進模式

分支圖

在分支圖中, 紅線是子分支 dev, 綠線是主分支 master. 子主分支分別提交了一次修改, 在將 dev 合併到 master 時發生衝突, 修改衝突檔案內容之後再提交。

3. 解決衝突
如果兩個分支都分別有了新的提交,Git 無法執行“快速合併”,只能試圖把各自的修改合併起來,但這種合併就可能會有衝突。必須手動解決衝突後再提交。git status 也可以告訴我們衝突的檔案。

內容衝突

兩個分支對同一檔案的內容進行了修改並分別提交, 如果合併失敗, 就必須手動解決衝突, 修改檔案的內容之後再進行提交。

在衝突內容中, Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容. 檔案的內容可以協商修改。

樹衝突

一個分支修改了內容, 另個一分支刪除了檔案, 在試圖合併時就會出現樹衝突。假設子分支(如 dev)是要合併到主分支 master 的, 處理的方法有:

  • 放棄 dev 的修改:強制刪除 dev 分支, 然後提交即可。
  • 放棄 master 的修改----分下面兩種情況:
  1. master 修改了內容, dev 刪除了檔案: 在 master 分支中刪除該檔案, 然後提交;
  2. master 刪除了檔案, dev 修改了內容: 在 master 分支中新增被修改的檔案, 然後提交。

master 修改了內容, dev 刪除了檔案:

master 刪除了檔案, dev 修改了內容:

對於檔案的移動(在 Git 倉庫目錄範圍內)和重新命名, Git 都可以自動合併

遠端倉庫推送衝突

     從遠端分支抓取最新的提交          git pull 

建立本地分支與遠端分支的連線        git branch --set-upstream dev origin/dev        # dev 為分支名

如果推送出現衝突, 先將遠端分支最新的提交抓取下來, 在本地解決衝突之後再推送。解決衝突的方法與本地衝突完全相同。

參考:

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013760174128707b935b0be6fc4fc6ace66c4f15618f8d000