撤消git rebase以保存本地更改

时间:2016-06-20 16:07:08

标签: git rebase

我用git做了一件蠢事。我对file_a进行了(好的)loocal更改,我已经提交但没有推送。我的同事对file_a做了(不好的)更改,然后她推了推。我拉了她的变化,并在没有完全意识到发生了什么的情况下重新定义了它们。现在file_a已经无望了,我不知道如何修复它。

显然,在未来,更频繁地推动是一个关键。我想做什么现在是撤消rebase,并且更加仔细地重做它。我想确保我不会丢失我的本地提交,但我不知道该怎么做。

如果我执行此命令:git reset --hard ORIG_HEAD,是否会保留我的两个本地提交?或者我应该做些什么?

更新

我最终使用reflog找到了好的提交。然后,我使用另一个分支挑选了它们,并确认一切都按预期工作。然后我在原始分支中使用了git revert fix_rebase_branch --hard

2 个答案:

答案 0 :(得分:2)

我将返回git reflog并从您想要的提交中创建一个新分支(即使用git checkout -b <new-branch-name> <orphaned-commit-hash>)。 rebase将重写你最近的两个提交,但原件应该仍然在参考日志中。

答案 1 :(得分:0)

简单的方法只有在你还没有“撤消”rebase的情况下才有效,除了环顾四周之外还没有做太多其他事情(这样你的当前分支仍然只是rebase的结果,并且没有任何未承诺的工作说谎周围)。这还要求您不使用rebase的自动转发功能,或者 使用自动转发功能,如果您有任何未提交的工作树更改,则在步骤2之前手动git stash

  1. 运行git branch save-my-rebased-work创建一个指向当前提交的新分支名称(选择一个对您自己很明显的名称;请注意git branch将创建此新分支而不设置上游设置。)
  2. 运行git reset --hard ORIG_HEAD以撤消rebase并使当前分支(和工作树)看起来像在rebase之前一样。
  3. 如果您已经撤消了rebase,请使用reflogs查找rebase的新提交。请记住,rebase的作用是复制您的原始提交到新副本。这些新副本在git reset --hard ORIG_HEAD之后通过reflog保留(直到reflog条目在一个月左右到期,无论如何)。在步骤1中创建新分支名称的原因是原始和副本看起来几乎完全相同,并且在reflog中很难区分。