用 git commit --fixup 给旧提交补一刀

33 次浏览5 条回复

改完代码后发现只是想补到前面某个提交里,不想最后再手动整理 commit message,可以试试 --fixup。

环境:Git 2.25+,在仓库里执行:

git log --oneline -5
git commit --fixup <commit>

第一条先找到要补的那条提交,第二条会生成一个类似 fixup! xxx 的新提交。后面整理历史时再跑:

git rebase -i --autosquash <base>

Git 会自动把这条 fixup 提交排到目标提交旁边,并标好 fixup,不用自己在交互界面里搬来搬去。

这个适合还没推到共享分支的本地提交。已经推给别人用的分支就别随便 rebase 了,容易把协作的人坑到。

这个对本地整理很省事。目标提交如果有相近的 message,最好直接用完整 commit hash,避免 fixup 到错的那条;<base> 也要选在目标提交之前。整理前确认工作区干净,已经推到共享分支的历史还是别改比较稳。

还有个小习惯挺有用:做完 fixup 先跑一下 git log --oneline --decorate -n 8,确认那条 fixup! 挂的标题没看错,再 autosquash。

如果这轮改动里混了别的东西,最好先 git add -p 挑一下,不然一条 fixup 里塞进无关改动,后面 rebase 完反而更难拆。

ZiorLv1#2

还有个小习惯挺有用:做完 fixup 先跑一下 git log --oneline --decorate -n 8,确认那条 fixup! 挂的标题没看错,再 autosquash。

如果这轮改动里混了别的东西,最好先 git add -p 挑一下,不然一条 fixup 里塞进无关改动,后面 rebase 完反而更难拆。

如果不只是补代码,还想顺手改那条旧提交的 message,可以看看较新的 Git 里的:

git commit --fixup=amend:<commit>
git rebase -i --autosquash <base>

它会生成 amend! 提交,autosquash 时会让你编辑目标提交信息。只想改 message、不带代码改动的话还有 --fixup=reword:<commit>,这个比 rebase 里手动找那一行省点心。

Zoe_JayLv1#3

如果不只是补代码,还想顺手改那条旧提交的 message,可以看看较新的 Git 里的:

git commit --fixup=amend:<commit>
git rebase -i --autosquash <base>

它会生成 amend! 提交,autosquash 时会让你编辑目标提交信息。只想改 message、不带代码改动的话还有 --fixup=reword:<commit>,这个比 rebase 里手动找那一行省点心。

补一个懒人配置:如果经常用这个流程,可以把 autosquash 开成默认:

git config --global rebase.autoSquash true

之后跑 git rebase -i <base> 时,fixup! / squash! 这类提交会自动排好。

不过我一般还是只在个人分支这么开,团队共享分支上整理历史这事最好先说清楚,不然别人拉下来会很懵。

HosuLv1#4

补一个懒人配置:如果经常用这个流程,可以把 autosquash 开成默认:

git config --global rebase.autoSquash true

之后跑 git rebase -i <base> 时,fixup! / squash! 这类提交会自动排好。

不过我一般还是只在个人分支这么开,团队共享分支上整理历史这事最好先说清楚,不然别人拉下来会很懵。

这个配置确实省事。补一句版本兼容:--fixup=amend: 和 --fixup=reword: 不是老版本 Git 都有,团队脚本里最好先确认最低 Git 版本;临时不想自动排序时,也可以用 git rebase -i --no-autosquash <base> 覆盖配置。