Git压缩提交误执行rebase -i HEAD~3带他人提交如何修复规避
日常操作避免交互式rebase范围选错的方法
- 执行rebase前先核对提交范围:要压缩最近N个提交时,先跑
git log --oneline -n N+1,确认列表最下方的那个提交就是你本次rebase的分界点(也就是不会被修改的基线提交),确认没有把其他人的提交划进操作范围后,再执行对应的rebase命令。比如要压缩最近2个提交,就先跑git log --oneline -n 3,核对HEAD~2指向的提交确实是你自己最早要处理的提交的父节点,再敲git rebase -i HEAD~2。 - 进入rebase编辑界面先做二次校验:弹出提交列表的编辑窗口后,先别急着改pick/squash标记,先扫一遍所有列出的提交的作者、提交信息,一旦发现多了不属于你的提交,直接不保存退出编辑器,git会自动终止本次rebase,不会对分支产生任何改动。
- 用临时tag替代HEAD~N计数法:如果要处理的提交数比较多,容易数错,可以先给本次rebase的基线提交打个临时标签,比如
git tag tmp-rebase-base,之后直接执行git rebase -i tmp-rebase-base,完全不用数提交个数,从根源避免数错的问题,操作完成后执行git tag -d tmp-rebase-base删掉临时标签即可。
误将他人提交纳入rebase后的修复方法
还未将错误结果推送到远端时
- 优先用reflog无损回滚:执行
git reflog查找误操作rebase启动前的HEAD位置,对应记录一般在标记为rebase (start): checkout HEAD~3的条目上方,假设对应索引为HEAD@{n},执行git reset --hard HEAD@{n}即可完全回到rebase前的状态,所有提交、改动都不会有损失,之后重新执行正确的squash命令即可。 - 如果你已经完成了squash操作、提交信息也已经改好,不想重复操作,且还没把他人的提交squash合并到自己的提交中,可以再执行一次
git rebase -i HEAD~3,在弹出的提交列表里,把不属于你的那个他人条目前面的pick改成drop,保存退出后git会自动将该提交从你的分支历史中移除,不会再出现在PR提交列表里。注意:如果已经把他人提交squash进自己的提交,不要用这个方法,会把他人的代码改动从你的分支里删掉,直接用reflog回滚最稳妥。
已经将错误结果推送到远端时
- 先按照上述本地修复的方法,把本地分支的历史修正到正确状态,执行
git log --oneline确认提交列表里没有混入他人提交、自己的两个提交已经正确squash后,执行git push --force-with-lease覆盖远端的错误分支即可。不要直接使用git push --force,--force-with-lease会在检测到远端分支存在你本地未同步的新提交时自动终止推送,避免误覆盖协作者的提交。
内容的提问来源于stack exchange,提问作者R11G
相关产品推荐
相关产品推荐

