在分支合并之前恢复到特定状态

Posted

技术标签:

【中文标题】在分支合并之前恢复到特定状态【英文标题】:Revert back to specific state before branches were merged 【发布时间】:2015-11-11 08:10:05 【问题描述】:

git 霸主,听我的恳求:

我有一个 git 分支,称它为“master”(我知道是原始的)。现在,我也一直在研究另外两个分支,同时称它们为“dammit”和“mistake”。完成后,两个分支都合并到“master”中,然后到生产中。

问题是,我怀疑在这些分支中所做的某些更改是有害的(为什么我认为这无关紧要),所以我想恢复到在我开始在分支上工作之间的某个特定提交(“错误”和“该死”。所以,假设我从 8 月 1 日开始研究它们并在 8 月 10 日合并,我想回到 8 月 3 日)。 但是,如果我回到 8 月 3 日,似乎在该日期之前在侧分支上所做的提交仍将在我的“master”上。

我可以使用某种“git revert”魔法来实现这一点吗?一些我不知道的 git 命令?

也许对 git rev-list --parents -n 1 <commit> 进行了一些更改?那不是我真正想要的,那么我又不能称自己为 git 专家。

我不可能是唯一遇到此问题的人(尽管搜索 SO 可能会给人这种印象)。

帮助?

【问题讨论】:

【参考方案1】:

但是,如果我回到 8 月 3 日,似乎在该日期之前在侧分支上所做的提交仍将在我的“master”上。

这是预期的行为。 git revert 不是“重置”某些提交,它基本上会拍摄您还原的提交的负面快照并创建一个新提交。

如果你真的想摆脱错误的 git merge。你必须做一个git reset。但请注意! git reset 是一个重写历史的命令。因此,如果您的历史是公开的,并且有多个贡献者,您将在推送重写的历史后遇到麻烦。如果没有,你可以放心地做一个

git reset --hard <commitIDOfTheComitFrom3rdAugust>

然后在你解决所有问题之后

git push --force origin <whatever>

【讨论】:

问题是,重置到 8 月 3 日的提交不会留下合并分支的残余,在特定提交之前提交吗?我在这里看到了一些参考资料:***.com/questions/2389361/undo-a-git-merge 声明我应该“标记”主分支。对我来说听起来像是解决方案的一半。还是我错过了什么? 假设您有以下graph。将master 重置为第三个灰色提交会“忘记”其间的所有其他提交,尤其是合并的提交。 哈,很酷的库,下次有问题时我会使用它 :) 所以是的,左边第三个节点肯定是这种情况。但是如果我想回到右边的第三个节点(比如说左边的第一个蓝色节点是 8 月 1 日)呢? 呵呵是的。好的,所以您想重置蓝色路径,让我们将其称为 branch damnit 到第一个蓝色节点。然后你必须检查damnit 并将其重置为第一个蓝色节点。 确实,如果我只需要担心这两个分支,那就行得通。不幸的是,这是一个共享仓库,我们有 20 多个合并的分支需要恢复,这就是为什么我希望找到某种捷径。

以上是关于在分支合并之前恢复到特定状态的主要内容,如果未能解决你的问题,请参考以下文章

将推送的分支恢复为具体的提交

Github:当特定分支合并到主分支时,我如何通知松弛?

在恢复的合并中查找提交

从已推送的合并分支中恢复特定提交

从 GitHub.com 上的受保护分支恢复合并提交

恢复合并时如何找出分支号?