Git-合並基本觀念與沖突合並

2024年2月6日 19点热度 0人点赞

書接上文,我們從master 分支的最新版 (HEAD) 建立一個 hotfixes 分支,執行指令:git checkout -b hotfixes

git branch
git checkout -b hotfixes

修改 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

沒錯,真的沖突了,而且 Git 告訴我要自己修正 (fix) 這個沖突 (conflicts)。我們用 git status 可以看出目前發生沖突的文件有哪些,而且你也可以看到這個文件位於 Unmerged paths 這個區段。

查看沖突的內容

當你發生沖突的時候,切莫慌張,先執行git diff自動比對出到底哪些文件發生沖突了。

解決沖突狀態的方法

我先來說說解決沖突狀態的方法,其實很簡單,直接輸入 git add . 把目前工作目錄的狀態加入到索引之中,就可以取消這些 Unmerged 文件的沖突狀態。

如果你很懶,遇到沖突什麼都不改,直接執行 git add . 再加上 git commit 的話,確實會解決沖突,但所 commit 的版本將會包含這些沖突的表示文字,如果你身處一個開發團隊,肯定會被罵翻到臭頭,請你千萬不要這麼做!

做錯了?沒關系,隻要執行 git reset --hard ORIG_HEAD 就可以回到上一版,然後再重新合並一次引發相同的沖突。

找出沖突的文件

當合並發生沖突時的文件數量很少時,或許直接打 git diff 可以看得出差異,但如果是兩個比較大的分支發生沖突的話,很有可能會有一大堆文件有沖突的狀況。這時你可能會想一個一個文件的來查看沖突的狀況,這時你可以用以下兩種 Git 指令找出沖突的文件:

  • • 執行 git status
  • • 執行 git ls-files -u

找到之後再用 git diff [filepath] 就可以僅比對其中一個文件了:

真正解決沖突

真的要解決沖突,你必須手動把這些沖突的文件改好。不過,如果這時使用 SourceTree 來修復沖突的文件,那生命將會美好許多。

我們開啟 SourceTree 並進入文件狀態節點,在文件清單中按下鼠標右鍵,這時有個解決沖突的選單,這裡你就能選擇你要用我的沖突或是用其他人沖突 來解決這個文件的沖突狀態。所謂我的就是你當前工作目錄的那個分支 (master),而他的就是被我們指定合並進來的那個分支 (hotfixes)。

如果選 我的沖突的話,他還會出現一個確認合並的視窗,你按下 OK 之後,SourceTree 就會自動將文件中發生沖突的那些段落,修改成我的版本:

請註意:當你利用 SourceTree 幫你解決沖突後,該文件也會直接加入到索引之中 (git add .``),但不會幫你執行 git commit `動作,所以你還要自己多做這一步。

輸入一些版本消息後,就可以執行 Commit 動作 (Commit 按鈕在視窗下角)。

來看解決沖突並合並後的 commit graph 如下: