我今天做了同样的事情,并采取了一种不同的方法(在试错之后)返回隐藏之前的状态,以便继续解决冲突并完成合并。
首先,在清除目标分支中的部分合并之后,我捕获了剩余冲突的文件列表(文本文件或编辑器选项卡)。这只是清空之后非挂起文件的列表,因为已经解决冲突的文件在存储之前会被暂存。
$ 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