撤消git重基以保存本地更改

撤消git重基以保存本地更改,git,rebase,Git,Rebase,我对git做了件蠢事。我对文件_a进行了(很好的)逻辑更改,我已经提交了这些更改,但没有强制执行。我的同事对文件a做了(坏的)更改,然后她推了推。我拉了她的变化,并在没有完全意识到发生了什么的情况下重新调整了它们。现在文件坏了,我不知道怎么修复 显然,在未来,更频繁地推动是一个关键。我现在想做的是撤销重基,并更深思熟虑地重做它。我想确保我不会丢失本地提交,但我不知道如何做到这一点 如果我执行以下命令:git reset--hard ORIG_HEAD,这会保留我的两个本地提交吗?还是我应该做点别

我对git做了件蠢事。我对文件_a进行了(很好的)逻辑更改,我已经提交了这些更改,但没有强制执行。我的同事对文件a做了(坏的)更改,然后她推了推。我拉了她的变化,并在没有完全意识到发生了什么的情况下重新调整了它们。现在文件坏了,我不知道怎么修复

显然,在未来,更频繁地推动是一个关键。我现在想做的是撤销重基,并更深思熟虑地重做它。我想确保我不会丢失本地提交,但我不知道如何做到这一点

如果我执行以下命令:
git reset--hard ORIG_HEAD
,这会保留我的两个本地提交吗?还是我应该做点别的

更新:


我最终使用reflog找到了好的提交。然后,我在使用另一个分支时选择了它们,并验证了一切都按照预期工作。然后我在我原来的分支中使用了
git revert-fix\u-rebase\u分支--hard

我将遍历
git reflog
并从您想要的提交中创建一个新分支(即使用
git checkout-b
)。rebase将重写您最近的两次提交,但原始提交仍应存在于参考日志中。

只有在您尚未“撤消”rebase,也没有做过除环顾四周以外的其他很多事情的情况下,这种简单的方法才有效(因此,您当前的分支仍然只是rebase的结果,并且没有未提交的工作)。这还要求您不要使用rebase的autostash功能,或者如果您正在使用autostash,如果您有任何未提交的工作树更改,请在步骤2之前手动
git stash

  • 运行
    git branch save my rebased work
    创建指向当前提交的新分支名称(选择一个对您来说很明显的名称;注意
    git branch
    将创建这个没有上游集的新分支)
  • 运行
    git reset--hard ORIG_HEAD
    以撤消重设基础,并使当前分支(和工作树)看起来像重设基础之前的样子

  • 如果已经撤消了重新基址,请使用重新基址查找重新基址的新提交。请记住,rebase所做的是将原始提交复制到新副本。这些新副本在git reset--hard ORIG_HEAD之后通过reflog保留(无论如何,直到reflog条目在一个月左右到期)。在第1步中创建新分支名称的原因是,原件和副本看起来几乎完全相同,在重述中很难区分。

    我查看了这个问题的可能副本,但没有完全澄清我是否会丢失本地提交,或者如何找回那些本地的承诺。对我来说,这看起来像一个巨大的丑陋的烂摊子。我还认为,您对重定基址的工作原理感到困惑。如果您在(不正确的)远程分支上重新设置了工作的基准,那么您的两个提交应该位于本地分支的头部,这些提交可能会因重新设置基准期间的合并冲突而发生更改。不幸的是,当您重新设置基准时,您重新编写了两个良好的提交,在你的枝头。您应该进入reflog,找到两个原始的良好提交,然后从那里开始。你可以在收回同事的承诺后恢复。