Git 从错误的重基或合并中恢复

Git 从错误的重基或合并中恢复,git,Git,我们有两个分支:master和free。大部分代码都是用master编写的,并合并到free中(而不是相反)。现在,在某个时候出现了一些问题:应该只在分支free中的代码现在出现在master中。似乎有人将免费合并到主控(或在主控的基础上重新设置免费)并推动了此操作。这很愚蠢,但我们无法确定这是何时发生的,以及哪个提交(commit)引入了此错误 如果您能就如何从这种情况中恢复提供任何建议,我将不胜感激。您可以使用-S选项git log查找哪些提交添加或删除了文件中的特定字符串。因此,如果您知道

我们有两个分支:masterfree。大部分代码都是用master编写的,并合并到free中(而不是相反)。现在,在某个时候出现了一些问题:应该只在分支free中的代码现在出现在master中。似乎有人将免费合并到主控(或在主控的基础上重新设置免费)并推动了此操作。这很愚蠢,但我们无法确定这是何时发生的,以及哪个提交(commit)引入了此错误

如果您能就如何从这种情况中恢复提供任何建议,我将不胜感激。

您可以使用
-S
选项
git log
查找哪些提交添加或删除了文件中的特定字符串。因此,如果您知道
ToasterFactory
类仅在
free
分支上引入,您可以执行以下操作,以查看哪个合并提交将其带到
主文件中:

git log -SToasterFactory --merges master
。。。或者,如果它可能是通过重基或樱桃采摘引入的,您可以只执行以下操作:

git log -SToasterFactory master
如果是合并提交带来了
master
的所有更改,您可以尝试还原该合并提交,例如:

git revert <SHA1-OF-MERGE-COMMIT>
git还原
需要注意的一点是,如果您以后想重新合并,您可能需要这样做



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

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

  • 确定指向稳定分支的提交(在有人执行重基之前)。我使用git checkout master@{YYYY-MM-DD}在这一切发生之前识别了主分支的负责人。这是在使用自由分支合并提交之前的最后一次提交(毫不奇怪)
  • 从稳定提交的分支中挑选所有主提交(不包括合并提交)

  • 也许最重要的部分是认识到,再基础毕竟没有那么大的破坏性。它摧毁了历史,但摧毁不了树木。因此,始终存在一个可以恢复的提交。

    好吧,谢谢你,但这对我的情况没有什么帮助。可能是因为分支之间的代码非常相似。不过,您可能可以在一个文件中确定不应该存在的某一行-在这种情况下,只需运行
    git dull
    ,并在左栏中查找引入该行的提交。。。