在rebase过程中意外跳过后如何恢复

40

我刚刚试图将一条非常旧的分支与一个微小的修改合并到我的主分支上。 三个涉及的文件中只有一个文件合并时出了问题,所以我想当然地使用了--skip,认为它只是跳过那个文件,但事实上它似乎跳过了所有我的更改,并向前滚动。所以现在rebase已经完成,我的更改似乎已经消失了。

我看了关于撤销rebase的问题,但这些内容对我来说像希腊语一样,我看到了reflog,但我不知道分支在rebase之前附加到哪个提交记录。

无论如何,我真的不需要撤销rebase,我只想能够恢复两个文件中的更改。有没有正确的方法可以做到这一点(如果失败,我只能从昨天的备份中恢复我的存储库,手动选择位)。

1个回答

50

首先,将你的git工作文件夹制作成tar压缩包。这样可以更轻松地尝试多次操作。

假设发生了以下情况:

  • git checkout another-old-branch
  • git rebase master
  • 出现了一些问题(但你跳过了)

此时你仍在another-old-branch分支上,并且你的reflog会显示:

6f8348f HEAD@{0}: rebase: <commit message of last commit in another-old-branch>
e547ec0 HEAD@{1}: checkout: moving from another-old-branch to e547ec0d2a558d189464fc57192066b34ec5f28f^0
65cedf8 HEAD@{2}: checkout: moving from master to another-old-branch

假设分支就像符号链接(或指针)一样,我们所要做的就是让分支“another-old-branch”指向旧的提交ID。旧的提交仍然存在,并且没有被你的变基操作所影响。可以理解为:“嘿,git,another-old-branch是e547ec0d2,请忘记其他任何事情。”

在我们这里,那个提交ID是e547ec0d2a558d189464fc57192066b34ec5f28f,所以现在我们要做的是:

  • 如果您还没有切换到another-old-branch,请使用 git checkout another-old-branch 命令
  • 使用 git reset --hard e547ec0d2a558d189464fc57192066b34ec5f28f 命令将分支重置为旧的提交

现在您的分支已经恢复正常。然后,您可以重新尝试进行变基操作。

请注意,您的引用日志现在比上述示例要复杂一些。但是它应该仍然存在于某个地方...

祝好运!


1
不行,我在尝试恢复时一定搞砸了其他东西。答案标记为下次... - Benjol
11
+1; 另一个提示:使用git log -g可以更好地浏览引用日志(reflog)。 - Dan Moulding
2
运行得非常好!刚刚救了我的早晨,谢谢。 - kmanzana
如果您正在使用eGit(Eclipse的Git前端),一个提示是,您可能需要使用命令行git reflog来查找丢失的提交,因为我的History选项卡没有显示它。 - Jonathan Benn
1
非常感谢...这个帮助我避免了一次分手。 git log -g 这个也帮了很多忙。 - Abhishek Sharma

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