rebase 前后怎么确认提交没改跑偏:git range-diff

37 次浏览3 条回复

交互式 rebase 改完提交顺序或拆分提交后,只看最终 diff 有时不容易发现哪一笔提交被改歪了。Git 自带的 range-diff 可以按提交对比两段历史。

环境:Git 2.25+。先在 rebase 前留个临时分支:

git branch before-rebase
git rebase -i main
git range-diff main..before-rebase main..HEAD

输出会把旧提交和新提交配对,= 表示基本没变,! 表示内容有差异,<、> 则表示某边独有。确认完可以删掉临时分支:

git branch -d before-rebase

它只读取历史,不会改工作区。提交比较多时,比逐个抄 hash 跑 git show 更顺手。

有个小细节:rebase 后旧提交通常不再是当前分支的祖先,所以最后的 git branch -d before-rebase 可能会提示未合并而拒绝删除。确认 range-diff 结果、并确定临时分支没有要保留的提交后,再用 git branch -D before-rebase;这里的 -D 是强制删除,别在核对前执行。

如果 rebase 前忘了建临时分支,刚执行完时通常还能用 ORIG_HEAD 找到旧分支尖端:

git range-diff main..ORIG_HEAD main..HEAD

先跑 git show --no-patch ORIG_HEAD 确认一下指向。后续的 reset、merge 等操作可能改写 ORIG_HEAD,所以这个更适合当场补救,长期留存还是临时分支稳。

如果是把分支 rebase 到更新后的基线,旧、新两边的基线最好分别写出来(Git 2.25+):

git range-diff old-base..before-rebase new-base..HEAD

两段都写 main.. 更适合基线没有移动的情况;做 rebase --onto 或 main 已更新时,分开写能少混进无关的上游提交。