重做已经提交的合并的一部分

时间:2016-06-24 10:17:11

标签: git merge

我做了很大的合并。稍后,似乎某些文件未正确合并。我想重做这些文件,而不是整个合并 - 合并很大,我不想解决所有已经正确解决的冲突。

如果在我提交合并之前发生了这种情况,我可以做到

$ git checkout -m faulty_folder/

将错误的合并文件重置为冲突状态,就像合并启动时一样。问题是我已经提交了合并,这个命令似乎不再起作用了。 一个简单的

$ git reset --soft HEAD^

也不起作用。这真的会在合并开始之前从HEAD^检出文件。

有没有办法回到合并状态?

更新

仅仅编辑文件是不正确的。如果可能的话,我会这样做,但我发现合并太复杂了。我需要再次获得一个三向差异才能够可靠地解决冲突。

3 个答案:

答案 0 :(得分:2)

事实上,您可以再次执行合并。 (请务必关闭git rerere。)

请记住,git merge会查看三件事:您当前的提交,您要求它合并的提交以及这两个提交的合并基础。 (当然,还有你的策略参数,等等,但你也可以重复这些。)你确实已经提交了一个合并结果,但是你仍然可以恢复你之前的提交:

          o---o---X       <-- otherbranch
         /         \
...--o--*           \ 
         \           \
          o--o--o--Y--M   <-- HEAD -> yourbranch

您的合并M是合并提交YX(合并基础*)的结果。但您可以将提交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,第二个父级为Xnewbranch将指向新合并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