如何撤销一个未产生合并提交的合并操作?

5
我从主分支(master)创建了一个实验性分支(experimental branch),在实验性分支上进行了四次提交(commits)。同时,主分支还停留在它上一次的状态。现在,我想以这样一种方式合并我的实验性分支,以便在未来可以轻松地撤消此合并。
当我尝试搜索时,似乎撤消合并最简单的方法是通过使用git revert hash_of_merge_commit
但是,这仅适用于在将主分支与实验性分支合并时获得合并提交哈希的情况。在这种情况下,由于主分支的HEAD未发生变化,当我尝试合并时,只会向主分支添加四个新提交,这意味着要撤消此合并,我需要在未来手动记住并撤消每个单独的提交。
有更好的方法吗?
5个回答

15
其他回答者似乎关心如何在第一时间防止这种情况的发生。如果已经发生并且已经推送了快进式合并,以下是解决方案:
  1. git checkout -b my-undo-branch
  2. git reflog show master - 找到合并前的最后一次提交
  3. git reset --keep SHA - 使用上一步骤中的SHA
此时,请验证该分支处于您想要的状态以将其与 master 分支相同。现在只需要取两个分支之间的差异,并将其提交到主分支中:
  1. git checkout master
  2. git diff master my-undo-branch --no-prefix > patchfile
  3. patch -p0 < patchfile
然后,最后删除 patchfilegit add 所有更改,并进行 git commit

这是问题的唯一真正答案。然而,我很惊讶居然没有更简单的方法来完成它。 - icyerasor
赞同这是“真正”的答案。原问题假设“没有合并提交”-回答“只需使用--no-ff”实际上是一个不正确的答案。 - noahlz
谢谢!这会在主分支上留下一个提交,无法合并到开发分支中,因为它也会删除那里的更改吗? - cmart

0

你可以使用--no-ff合并来防止快进合并,这是你“将四个新提交添加到主分支”的方式。当分支实际上没有分叉时,Git会进行快进合并并简单地调整分支引用。防止快进合并将通过明显的合并提交帮助您保持分支历史记录略微完整,尽管您将无法确定提交是在哪个分支上创建的。

否则,除了检查reflog之外,没有其他方法。 Git不会维护超出每个分支的当前“tip”以外的分支信息。提交和创建该提交时检出的分支之间没有关联。


0

0

在合并时,应该通过传递--no-ff到合并命令来进行非快进式合并。

这样总是会创建一个新的提交,你就可以对其进行还原。

通常情况下,合并特性分支应该始终采用非快进式合并,以便于将你的功能整合到master分支的历史记录中。


0

我建议你重新审视你的分支策略,并引入“一次性”分支。也就是说,这些分支可能会被你的CI服务器或只有你使用来测试是否正常工作。你不必担心放弃它们。如果你想保留尝试过的内容,可以在废弃之前给该分支打标记。

更多信息请参见此处:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接