我今天做了同样的事情,并采取了不同的方法(经过反复试验)回到存储之前的状态,这样我就可以继续解决冲突并完成合并。
首先,在目标分支中取消部分合并后,我捕获了具有剩余冲突的文件列表(文本文件或编辑器选项卡)。这只是取消存储后未暂存文件的列表,因为已解决冲突的文件将在暂存之前暂存。
$ 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"
因此,my-temp-branch 的 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)。因此,对于这些文件中的每一个,我都从临时分支中提取了冲突解决的版本(如cherry-pick,但针对单个文件而不是整个提交):
$ 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
完成此操作后,我回到了存储之前的状态,因此我可以继续解决剩余的冲突并提交合并。