文章目錄
- 1. Git 沖突產生的場景
- 2. 沖突標記符號解釋
- 3. git checkout --ours 和 git checkout --theirs
- 語法
- 含義
- 使用場景
- 4. 操作完成后的流程
- 5. 舉例演示
1. Git 沖突產生的場景
當你在 git merge
、git rebase
、git cherry-pick
等操作時,如果 同一個文件的同一部分在兩個分支中都被修改了,Git 就會無法自動合并,結果是產生沖突。
沖突后的文件中會出現類似這樣的標記:
<<<<<<< HEAD
printf("Hello from main branch\n");
=======
printf("Hello from feature branch\n");
>>>>>>> feature
2. 沖突標記符號解釋
-
<<<<<<< HEAD
表示 當前分支(即你所在的分支) 的內容,也就是 ours。 -
=======
表示 ours 與 theirs 的分隔符。 -
>>>>>>> feature
表示 要合并進來的分支(目標分支) 的內容,也就是 theirs。
所以:
-
ours = 當前分支(HEAD)
-
theirs = 你要合并的分支
3. git checkout --ours 和 git checkout --theirs
這兩個命令在沖突文件存在時使用,可以幫助你快速選擇保留哪一方的版本。
語法
git checkout --ours <file>
git checkout --theirs <file>
含義
-
git checkout --ours <file>
把<file>
沖突部分全部替換為 當前分支(HEAD,ours) 的內容。 -
git checkout --theirs <file>
把<file>
沖突部分全部替換為 合并進來的分支(theirs) 的內容。
使用場景
-
如果你 確信本地分支的修改更正確,執行:
git checkout --ours filename.c
-
如果你 確信遠端分支的修改更正確,執行:
git checkout --theirs filename.c
-
如果想要手動融合兩邊的修改(而不是簡單選擇一方),就要編輯沖突文件,把沖突標記符號
<<<<<<<
、=======
、>>>>>>>
刪除,并保留你想要的代碼。
4. 操作完成后的流程
無論是用 --ours
、--theirs
,還是手動修改,最后都要:
git add <file>
git commit
Git 會生成一個合并提交(如果是 merge)。
5. 舉例演示
假設我們在 main
分支有:
printf("Hello from main branch\n");
在 feature
分支有:
printf("Hello from feature branch\n");
合并時沖突文件會是:
<<<<<<< HEAD
printf("Hello from main branch\n");
=======
printf("Hello from feature branch\n");
>>>>>>> feature
-
如果執行
git checkout --ours file.c
→ 文件變成:printf("Hello from main branch\n");
-
如果執行
git checkout --theirs file.c
→ 文件變成:printf("Hello from feature branch\n");
總結:
-
ours = 當前分支 (HEAD)
-
theirs = 要合并進來的分支
-
<<<<<<<
/=======
/>>>>>>>
是沖突標記,標記 ours 與 theirs 的不同部分。 -
git checkout --ours
→ 保留當前分支的修改 -
git checkout --theirs
→ 保留合并分支的修改