書接上文,我們從master 分支的最新版 (HEAD) 建立一個 hotfixes 分支,執行指令:git checkout -b hotfixes
git branch
git checkout -b hotfixes
![](https://news.xinpengboligang.com/upload/keji/3fe693f2251e2e494c8f05d85ebbe55f.jpeg)
修改 a.txt 的第一行,把原本的 1 修改為 bugfixed: 1,並建立版本。然後切換回 master 分支:
type a.txt
notepad a.txt
git add .
git commit -m "a.txt bug fixed"
git checkout master
git branch
接著,我們在 master 分支修改 a.txt 的第一行,把原本的1修改為 bugfixed by gitsou: 1,並建立版本。
type a.txt
notepad a.txt
type a.txt
git add .
git commit -m "a.txt bug fixed by gitsou"
現在,我們兩個分支都同時修改了 a.txt 的文件內容,而且都在同一行,這樣的修改方式,勢必引發沖突。我們就馬上來體驗一下。
git status
git merge hotfixes
git status
![](https://news.xinpengboligang.com/upload/keji/95d391fc26fc832240894be692dd7022.jpeg)
沒錯,真的沖突了,而且 Git 告訴我要自己修正 (fix) 這個沖突 (conflicts)。我們用 git status 可以看出目前發生沖突的文件有哪些,而且你也可以看到這個文件位於 Unmerged paths 這個區段。
查看沖突的內容
當你發生沖突的時候,切莫慌張,先執行git diff自動比對出到底哪些文件發生沖突了。
解決沖突狀態的方法
我先來說說解決沖突狀態的方法,其實很簡單,直接輸入 git add . 把目前工作目錄的狀態加入到索引之中,就可以取消這些 Unmerged 文件的沖突狀態。
如果你很懶,遇到沖突什麼都不改,直接執行 git add . 再加上 git commit 的話,確實會解決沖突,但所 commit 的版本將會包含這些沖突的表示文字,如果你身處一個開發團隊,肯定會被罵翻到臭頭,請你千萬不要這麼做!
![](https://news.xinpengboligang.com/upload/keji/65470941f738e4968ac5379f5288fa3c.jpeg)
做錯了?沒關系,隻要執行 git reset --hard ORIG_HEAD 就可以回到上一版,然後再重新合並一次引發相同的沖突。
![](https://news.xinpengboligang.com/upload/keji/2bb15104c30612f5739ecbe6100e9525.jpeg)
找出沖突的文件
當合並發生沖突時的文件數量很少時,或許直接打 git diff 可以看得出差異,但如果是兩個比較大的分支發生沖突的話,很有可能會有一大堆文件有沖突的狀況。這時你可能會想一個一個文件的來查看沖突的狀況,這時你可以用以下兩種 Git 指令找出沖突的文件:
- • 執行 git status
- • 執行 git ls-files -u
![](https://news.xinpengboligang.com/upload/keji/4f7bbdd9b0ae2398b151633cfdabaeb7.jpeg)
找到之後再用 git diff [filepath] 就可以僅比對其中一個文件了:
![](https://news.xinpengboligang.com/upload/keji/e8a17d31796db1c25d779972d527a3e7.jpeg)
真正解決沖突
真的要解決沖突,你必須手動把這些沖突的文件改好。不過,如果這時使用 SourceTree 來修復沖突的文件,那生命將會美好許多。
我們開啟 SourceTree 並進入文件狀態節點,在文件清單中按下鼠標右鍵,這時有個解決沖突的選單,這裡你就能選擇你要用我的沖突或是用其他人沖突 來解決這個文件的沖突狀態。所謂我的就是你當前工作目錄的那個分支 (master),而他的就是被我們指定合並進來的那個分支 (hotfixes)。
![](https://news.xinpengboligang.com/upload/keji/eccb1ede1d87d71c394feb92802e5e6e.jpeg)
如果選 我的沖突的話,他還會出現一個確認合並的視窗,你按下 OK 之後,SourceTree 就會自動將文件中發生沖突的那些段落,修改成我的版本:
![](https://news.xinpengboligang.com/upload/keji/7d5bdbaa1ad9a41affe71b1eaee79b10.jpeg)
請註意:當你利用 SourceTree 幫你解決沖突後,該文件也會直接加入到索引之中 (git add .``),但不會幫你執行 git commit `動作,所以你還要自己多做這一步。
輸入一些版本消息後,就可以執行 Commit 動作 (Commit 按鈕在視窗下角)。
來看解決沖突並合並後的 commit graph 如下:
![](https://news.xinpengboligang.com/upload/keji/4488e534d8778b5ba6cecea425a1128e.jpeg)