git rebase 之后,我学会了不再害怕重写历史

我以前很害怕 git rebase。不是不会用,是不敢用——总怕把历史搞乱,总怕推不上去。

上个月我终于把它用顺了。这篇记下那次经历,以及我踩过的几个坑。

起因

一个小工具改了三天,提交记录长这样:

feat: 初版实现
fix: 修了个 bug
wip: 还没写完
fix: 又修了一个
style: 格式化
feat: 补了测试

功能是对的,但历史完全没法看。如果半年后我回来,这些提交名一个都帮不上忙。

整理成故事

我用交互式 rebase 把这六条整理成了三条:

  • 一条干净的 feat(实现 + 测试)。
  • 一条 squash 掉的小修复。
  • 一条独立的 refactor。

整理之后的提交记录,读起来像一个完整的故事,而不是一地鸡毛的工作日志。

坑一:只在本地 rebase

这是铁律。只对你还没推到远端的提交做 rebase。一旦推上去了,就不要再改那条线的历史——否则协作者会恨你。

如果你确实要改已推送的历史(比如清理自己的 feature 分支),务必先和协作者打招呼。

坑二:rebase 冲突

冲突不可怕,可怕的是你在冲突解决中途分心。我的做法是:

  1. 遇到冲突先 git status 看清局面。
  2. 一次只解决一个文件,解决完就 git add + git rebase --continue。
  3. 实在乱了,git rebase --abort 重来,比硬撑划算。

坑三:忘记备份分支

rebase 之前,先建个备份分支。一条命令的事,能救你一次手滑。

git branch backup-before-rebase
# 然后放心地 git rebase -i HEAD~6

结论

rebase 不是危险操作,是「有前提的操作」。前提就是:知道自己在改哪一段历史,并且那段历史还没被别人依赖。

在这两条之内,整理提交记录是一件很值得做的事。读自己的旧代码时,你会感谢自己的。