撤销快进合并操作

5

我遇到了一个糟糕的合并问题,直到我将其推送到GitHub后才意识到这是个问题,现在我不知道该如何撤销/还原它。

故事是这样的:

我打开了两个不同的分支,并向这些分支提交了几个更改。过了一段时间,我决定将这些分支合并回主分支,我使用$ git merge branch_name来实现这个目的。我合并了第一个分支,然后检查了主分支的日志:所有这个分支上的提交都在主分支上了。然后我继续使用相同的命令合并了第二个分支。然后我再次检查了主分支的日志,在那里我看到了我合并的分支上的提交,其中包括以下注释的提交:“merge branch branch_name”。当我合并另一个分支时没有包含这样的注释。

长话短说,问题在于git将第一个分支的提交合并到主分支上,就好像它们已经是主分支的提交一样。当你从'GitHub'或'gitg'中查看网络图形时,没有留下第一个分支的痕迹,但它的提交显示为主分支的提交。第二个分支没有问题:它被单独显示并按预期合并。另外请注意,在运行合并命令后,我通过$ git branch -d branch_name删除了分支,好像这是最紧急的事情一样,不幸的是。

现在我想回到运行两个连续合并之前的位置。任何帮助都会受到赞赏。如果您对为什么会发生这种情况进行评论,那也很愉快。


1
我至少可以告诉你发生的事情是,第一个分支是一个“快进式”合并,并且这并不是什么坏事。如果你真的需要保留历史记录,在将来,你必须使用“--no-ff”选项调用合并操作。 - Jonas Schäfer
在你得到答案之前,我可以再补充两件事情:第一,git reflog 可能会对你有所帮助;第二,无论你做什么,如果你撤销并重新执行非快进合并,你最终将拥有一个非快进推送,这意味着你必须强制推送到 Github。这通常是不好的,因为它会给所有在此期间拉取存储库的人带来严重的麻烦。 - Jonas Schäfer
1个回答

4
  1. 找到你删除的旧主题分支的头部提交。 它们应该是合并提交的两个父级。 将它们再次转换为分支(git branchgit checkout -b可以很好地完成此操作)。

  2. 使用git resetmaster移回其旧位置。 此时,您回到了合并之前的起点。

  3. 下次合并时,请使用git merge --no-ff。 即使Git不需要,这将创建一个合并提交。

我几乎总是使用git merge--ff-only--no-ff


如果主分支的头不是第一个分支的祖先,那么这就不会是一次快进合并。 - Dietrich Epp
@Dietrich Epp 感谢您的回答,我认为这会起作用,但是您能否扩展您的答案并提供更详细的步骤说明,因为我在git方面有点新手。提前致谢。 - clancularius
@DietrichEpp 我明白了。我现在看到的问题是,对于那些不熟悉存储库的人来说,哪个是 ff 合并之前处于主线 HEAD 的确切提交? - Jonas Schäfer
@clancularius:你可以使用gitkgitx或其他工具来查看分支的分离情况。 - Dietrich Epp
@DietrichEpp 感谢您澄清,这对我来说并不明显。我只是想继续前进。我只是想尝试给出建设性的反馈。 - Jonas Schäfer
显示剩余7条评论

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