一尘不染

撤消 git rebase

javascript

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

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

git checkout 两个分支的提交父级
然后从那里创建一个临时分支
手工挑选所有提交
用手动创建的分支替换我重新设置的分支
在我目前的情况下,这将起作用,因为我可以轻松地发现来自两个分支的提交(一个是我的东西,另一个是我同事的东西)。

然而,我的方法给我的印象是次优且容易出错(假设我刚刚用我自己的 2 个分支重新设置了基础)。

有任何想法吗?

澄清:我说的是重放一堆提交的rebase。不止一个。


阅读 221

收藏
2022-01-12

共1个答案

一尘不染

最简单的方法是找到分支的头部提交,因为它是在reflog 中rebase 开始之前的那一刻......

git reflog

并将当前分支重置为它(通常需要注意的是在使用–hard选项重置之前要绝对确定)。

假设旧的提交HEAD@{2}在 ref 日志中:

git reset --hard HEAD@{2}

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

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

您只需执行git log HEAD@{2}( Windows: git log "HEAD@{2}" )即可检查候选老头的历史记录。

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

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

[core]
    logAllRefUpdates = true
2022-01-12