我做了很大的合并。稍后,似乎某些文件未正确合并。我想重做这些文件,而不是整个合并 - 合并很大,我不想解决所有已经正确解决的冲突。
如果在我提交合并之前发生了这种情况,我可以做到
$ git checkout -m faulty_folder/
将错误的合并文件重置为冲突状态,就像合并启动时一样。问题是我已经提交了合并,这个命令似乎不再起作用了。 一个简单的
$ git reset --soft HEAD^
也不起作用。这真的会在合并开始之前从HEAD^
检出文件。
有没有办法回到合并状态?
更新
仅仅编辑文件是不正确的。如果可能的话,我会这样做,但我发现合并太复杂了。我需要再次获得一个三向差异才能够可靠地解决冲突。
答案 0 :(得分:2)
事实上,您可以再次执行合并。 (请务必关闭git rerere
。)
请记住,git merge
会查看三件事:您当前的提交,您要求它合并的提交以及这两个提交的合并基础。 (当然,还有你的策略参数,等等,但你也可以重复这些。)你确实已经提交了一个合并结果,但是你仍然可以恢复你之前的提交:
o---o---X <-- otherbranch
/ \
...--o--* \
\ \
o--o--o--Y--M <-- HEAD -> yourbranch
您的合并M
是合并提交Y
和X
(合并基础*
)的结果。但您可以将提交Y
签出为分离的HEAD或新分支。要建立一个新分支:
git checkout -b newbranch yourbranch^
产生:
o---o----X <-- otherbranch
/ \
...--o--* M <-- yourbranch
\ /
o--o--o--Y <-- HEAD -> newbranch
(这是完全相同的图表,但我向M
移动了一点,以便为newbranch
提供指向提交Y
的空间 - 将图表视为一种橡皮/弹性,或印在Play-Doh®上,或其他任何东西)。现在您可以git merge otherbranch
并开始重新创建提交M
。
现在,您可以使用git checkout yourbranch -- path
获取合并结果(而不是重新解析)用于各种path
s(甚至是顶部路径),以及可选的git checkout -m
部分来重新创建冲突
完成所有操作后,git commit
将进行新的M2
合并,其第一个父级为Y
,第二个父级为X
,newbranch
将指向新合并M2
。
答案 1 :(得分:0)
如果您在合并后已经推送了分支,并且您怀疑其他人可能已将其拉出,那么您应该避免编辑合并提交。相反,您最安全的方法就是修复文件并使用这些更改进行新的提交。
如果这不是一个问题,那么您可以尝试修改合并提交,假设此合并提交位于您的分支的HEAD
。只需编辑错误合并的文件,测试代码,如果您满意,则通过以下方式修改提交:
git commit --amend -m 'merge completed successfully'
如果您现在通过git log
检查提交历史记录,您会注意到提交的数量与您第一次完成合并时的提交次数相同。但最新的提交不与第一次合并提交相同。相反,它是一个完全 new 提交,带有新的SHA-1哈希。
答案 2 :(得分:0)
由于git创建了一个代表你与冲突的大合并的提交,你可以只更改该提交。为此,在您的工作目录中,执行所有修复,添加到索引并修改提交。
# do all the fixes
git add .
git commit --amend