我今天做了同樣的事情,並採取了一種不同的方法(在試錯之後)返回隱藏之前的狀態,以便繼續解決衝突並完成合並。
首先,在清除目標分支中的部分合並之後,我捕獲了剩餘衝突的文件列表(文本文件或編輯器選項卡)。這只是清空之後非掛起文件的列表,因爲已經解決衝突的文件在存儲之前會被暫存。
$ git status
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: myproject/src/main/java/com/acme/package3/Class3.java
# modified: myproject/src/main/java/com/acme/package3/Class4.java
#
接着,我創建一個補丁,並重置分支返回到預合併狀態:
$ git diff HEAD > ~/merge-with-resolved-conflicts.patch
$ git reset --hard HEAD
然後創建了一個臨時分支(從合併目的地分支來源的),和施加補丁:
$ git checkout -b my-temp-branch
$ git apply ~/merge-with-resolved-conflicts.patch
$ git commit -a -m "Merge with resolved conflicts"
所以我-TEMP分支的HEAD現在包含被合併,包括與衝突的文件解決,剩餘衝突的文件的一切。
然後我切換回原來的分支,再合併,看了看git的狀態
$ git checkout my-branch
$ git merge other-branch
$ git status
的狀態顯示的文件有衝突的完整列表:
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# both modified: myproject/src/main/java/com/acme/package1/Class1.java
# both modified: myproject/src/main/java/com/acme/package2/Class2.java
# both modified: myproject/src/main/java/com/acme/package3/Class3.java
# both modified: myproject/src/main/java/com/acme/package3/Class4.java
#
現在我需要比較這兩個文件列表。第二個列表中的所有文件都已經解析(在本例中爲Class1.java和Class2.java)。因此,對於每個這些文件,我在版本拉從臨時黨支部解決的衝突(如摘櫻桃,但對於單個文件,而不是一個完整的提交):
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package1/Class1.java
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package2/Class2.java
這樣做之後,我回來了到存儲之前的狀態,所以我可以恢復解決剩餘的衝突並提交合並。(合併衝突期間git的藏匿處彈出)
你真的做了什麼重要的事嗎? (你是否真的需要恢復隱藏的更改?)你能重置掉嘗試的合併,然後重新執行嗎? – Cascabel
分別是和否。這些更改由多個合併衝突解決方案組成。 – bukzor
@bukzor:如果您需要更多的一天來解決合併衝突問題,那麼可能需要重新考慮有關分支處理和工作分配(或合併頻率)的策略。如此冗長的合併解決方案畢竟是一個很好的來源,因爲在一次提交中所做的更改量很難找到錯誤 – Grizzly