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 的修改----分下面兩種情況:
- master 修改了內容, dev 刪除了檔案: 在 master 分支中刪除該檔案, 然後提交;
- 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