协慌网

登录 贡献 社区

撤消 git rebase

有谁知道如何轻松撤消 git rebase?

想到的唯一方法是手动进行:

  • git checkout 两个分支的提交父级
  • 然后从那里创建一个临时分支
  • 樱桃 - 手工挑选所有提交
  • 用手动创建的分支替换我重新定位的分支

在我目前的情况下,这将是有效的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是我的同事的东西)。

然而,我的方法让我感到不理想和容易出错(假设我刚刚用自己的 2 个分支进行了重新定位)。

有任何想法吗?

澄清:我正在谈论一个重播,在此期间重播了一堆提交。不仅仅是一个。

答案

最简单的方法是找到分支的头部提交,就像在reflog 中启动 rebase 之前一样...

git reflog

并将当前分支重置为它(关于在使用--hard选项重新设置之前绝对确定通常的警告)。

假设旧提交在 ref 日志中是HEAD@{5}

git reset --hard HEAD@{5}

在 Windows 中,您可能需要引用引用:

git reset --hard "HEAD@{5}"

您只需执行git log HEAD@{5}Windows: git log "HEAD@{5}" )即可查看候选旧头的历史git log "HEAD@{5}"

如果你没有禁用每个分支 reflogs 你应该能够简单地做git reflog branchname@{1}因为 rebase 在重新连接到最终头之前分离分支头。我会仔细检查这个,但我最近没有证实这一点。

默认情况下,为非裸存储库激活所有 reflog:

[core]
    logAllRefUpdates = true

实际上,rebase 将你的起点保存到ORIG_HEAD所以这通常很简单:

git reset --hard ORIG_HEAD

但是, resetreset rebasemerge都将您的原始HEAD指针保存到ORIG_HEAD因此,如果您已经尝试撤消的 rebase 中已经执行了任何这些命令,那么您将不得不使用 reflog。

查尔斯的答案有效,但你可能想这样做:

git rebase --abort

reset后清理。

否则,您可能会收到消息 “ Interactive rebase already started ”。