如何在Github上重新合并已被撤销的提交?

8
我将尽力简洁地描述我的当前情况,并非常感谢您的建议。
今早我合并了一个大型代码功能分支,结果发现有一个关键错误。为了撤消它,我的同事在GitHub上回滚了合并(其中有几个提交),然后拉取后,一切似乎都很好。
在对特性分支进行一些微调后,我想确保它可以再次使用,因此我在我的特性分支上使用“git merge master”(像我一直做的那样)以确保一切都是最新的。
令人惊讶的是,这导致删除了我需要合并回主存储库的所有新代码!
这是由于分支上发生的回滚吗?通过查看git日志,我可以看到所有提交仍然存在。更奇怪的是,GitHub上的拉取请求在差异中未显示任何原始提交,只显示自回滚以来我所做的更改。
有人能帮我理解吗?
我知道有些人建议简单地撤消回滚,但我需要干净地回去,因为我所做的更改涉及大部分代码的结构。

1
嗨,尝试在控制台中输入 git reflog。它会显示您的存储库(不是分支而是整个存储库)的完整历史记录。检出所需的时间点,然后从那里继续。 - CodeWizard
谢谢您的评论!在我的情况下,提交是交错进行的。该分支是在几个月内创建的,没有一个干净的地方可以重置。我认为rebase是我需要的,只是试图弄清楚如何完全删除我再次添加到特性分支中的提交。 - Lizza
1
好的,我会把它发布为答案 - 你需要的变基。 - CodeWizard
1
我建议不要在这里进行变基操作。更改已发布分支的历史记录会让你非常不受欢迎。 - Daniel
2个回答

11

我曾经遇到过完全相同的问题。我的解决方法是在将主分支合并回我的分支之前“撤销还原”。

这样做可以让你保留所有更改,包括你所做的新修复。

git checkout master
git checkout -b master-with-revert-revered
git revert <revert commit id>
git checkout fixed-branch
git merge master-with-revert-revered

之后,你的固定分支应该可以直接合并回主分支而没有任何问题。


我感谢你的见解,丹尼尔。到目前为止,我已经尝试了许多不同的选项,由于这些提交的复杂性和数量之多,我认为恢复撤销操作将是最安全的选择。 - Lizza

1
我认为rebase是我需要的,只是想弄清楚如何从功能分支中彻底删除我再次添加的提交。 如果您需要“删除/合并”提交,则应使用squash。 Squash是rebase选项之一。 为了使用它,您需要执行交互式rebase。 git rebase -i HEAD~10会打开一个vi(或您正在使用的任何其他编辑器),并允许您“重新排列”提交。您可以删除提交,将它们合并成一个,重新排序等等。 您将在vi中找到选项列表以及您选择要重定位的提交列表(在上面的示例中,它将获取最后10个HEAD〜10)。

谢谢你的回答!所以在我的情况下,因为还原并没有真正删除提交记录,我想要从分支中删除所有提交记录?看起来用于此的命令是dd。而且看起来我需要删除的第一个提交记录是100个提交之前的,所以是HEAD~100? - Lizza
没错,你懂了 :-) - CodeWizard
或者您可以回到所需的时间点,从该点创建新分支,然后交互式地从该点重新进行变基。 - CodeWizard

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