如果--abort无法工作,如何中止交互式变基?

131

我在交互式变基中搞糊涂了,现在我希望中止它(即回到在交互式变基模式之前的那个点,对我来说是通过git pull --rebase)进行的操作。似乎通过git rebase --abort 可以完成这一操作,但实际上并不起作用:

$ git rebase --abort
error: Ref refs/heads/master is at 55b388c141b1485b1acd9e050dbeb0eb90ef2ee7 but
expected b918ac16a33881ce00799bea63d9c23bf7022d67
fatal: Cannot lock the ref 'refs/heads/master'.
Could not move back to refs/heads/master

我该如何退出交互式变基模式,以及清理所有与之相关的引用? (git reset --hard 可以成功,但不会使我退出变基模式。)

2个回答

88

尝试按照屏幕上显示的建议,首先将您的主分支 HEAD 重置为其期望的提交。

git update-ref refs/heads/master b918ac16a33881ce00799bea63d9c23bf7022d67

然后,再次中止变基。


48
把那称作“建议”是对负责可怕的Git用户体验的人的最不应得的赞美。 - Marco Faustinelli

1
在 Git 2.34 (2021年第4季度) 中,git rebase --abort 应该更加可靠: 当在中途中止时,"git rebase <upstream> <tag>"(man) 失败,因为它错误地尝试写入标签对象而不是将其剥离到 HEAD。

查看 提交 7740ac6提交 1d18826提交 35f070b(2021年9月21日)以及提交 d045719提交 1e14bc1提交 0b7ae73提交 54627db提交 7390c65提交 e505f45提交 f20c1fb(2021年9月13日),作者为Phillip Wood (phillipwood)
(由Junio C Hamano -- gitster --于2021年10月06日合并至提交 7cebe73

rebase: 解除引用标签

签名:Phillip Wood

一个以 'git rebase <A> <B>'(man) 开始的变基,概念上首先是要 checkout <B> 并从该状态开始运行 git rebase <A>
在这样的变基过程中执行 'git rebase --abort'(man) 应该会将我们带回到我们检出的状态 <B>
这曾经可以工作,即使 <B> 是指向提交的标签,直到 Git 2.20.0 时,该命令被重新实现为 C
该命令现在抱怨标签对象本身无法被检出,这可能在技术上是正确的,但不是用户要求的操作。
通过使用 lookup_commit_reference_by_name() 解析 <B> 来修复这个旧的回归问题。
脚本版本不需要剥离标签,因为它传递给的命令(例如 'git reset'(man))自己剥离了标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接