40

我只是试图通过对我的主人进行轻微修改来重新定位一个非常古老的分支。仅合并所涉及的三个文件中的一个时出现问题,所以我做了一个不假思索的 --skip,以为它只会跳过该文件,但事实上,它似乎跳过了我的所有更改,并向前滚动。所以现在变基已经完成,我的更改似乎已经消失了。

我已经看到关于撤消 rebase的问题,但这对我来说都是希腊语,我看到了 reflog,但我不知道分支在 rebase 之前附加到了哪个提交。

无论如何,我真的不需要撤消 rebase,我只想能够恢复这两个文件中的更改。有没有办法正确地做到这一点(如果做不到这一点,我只需要恢复我的存储库的昨天备份并手动挑选这些位)。

4

1 回答 1

50

首先,制作 git 工作文件夹的 tarball。这样可以更轻松地尝试多次。

让我们假设发生了以下情况

  • git checkout another-old-branch
  • git rebase 大师
  • 一些问题(你跳过了)

此时,您现在仍在另一个旧分支中,并且您的 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,另一个旧分支是 e547ec0d2,忘记发生的所有其他事情'

在我们的例子中是 e547ec0d2a558d189464fc57192066b34ec5f28f,所以我们现在要做的是

  • git checkout another-old-branch # 如果你还没有
  • git reset --hard e547ec0d2a558d189464fc57192066b34ec5f28f

现在您的分支已恢复正常。你可以重试你的变基。

请注意,您的 reflog 现在比上面的示例要复杂一些。但它应该仍然存在于某个地方......

祝你好运!

于 2010-03-12T13:29:40.880 回答