从错误的rebase或合并中恢复

时间:2012-01-31 10:41:31

标签: git

我们有2个分支:免费。大部分代码都是用 master 编写的,并合并为 free (不是其他方式)。现在,在某些时候出现问题:应该只在分支免费的代码现在出现在 master 中。似乎有人将免费合并到(或在主人之上重新免费)并推送它。这很愚蠢,但我们无法确定何时发生这种情况以及哪些提交(提交)引入了此错误。

对于如何从这种情况中恢复,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用-S<search-string>选项git log查找从文件中添加或删除特定字符串的提交.¹因此,如果您知道ToasterFactory类仅被引入在free分支上,您可以执行以下操作以查看哪些合并提交将其带入master

git log -SToasterFactory --merges master

...或者如果它可能是由一个rebase或者cherry-pick引入的,你可以这样做:

git log -SToasterFactory master

如果是从master引入所有更改的合并提交,您可以尝试恢复该合并提交,例如用:

git revert <SHA1-OF-MERGE-COMMIT>

关于这一点的一个注意事项是,如果您以后想要重新合并,则可能需要revert the revert first


¹严格地说,此选项仅返回特定文件中该字符串出现次数的提交。使用git 1.7.4或更高版本,您可以使用-G选项。

答案 1 :(得分:0)

最后,我通过以下简单步骤恢复了主分支。

  1. 识别指向稳定分支的提交(在某人进行了rebase之前)。我使用git checkout master @ {YYYY-MM-DD}来识别主分支的头部。这证明了在使用free branch进行merge-commit之前的最后一次提交(不足为奇)。
  2. 从稳定提交分支出来并挑选所有主提交(不包括合并提交)。
  3. 可能最重要的部分是认识到rebase毕竟不是那么具有破坏性。它破坏了历史,但不是树。所以,总有一个提交你可以恢复。