git pull 默认会创建 merge commit,时间一长 main 上就长成毛线球。rebase 能让本地未推送的提交"重演"到最新分支顶端,产生线性历史。但只对未推送的本地提交 rebase——一旦提交被推到了共享分支,rebase 改写历史会让队友的本地仓库脱节。
日常流程
| |
常见工作流:feature/... 分支在合到 main 之前先 rebase 一次,main 历史会是干净的直线。
交互式 rebase 整理提交
推送前常用 git rebase -i HEAD~n 把本地散落的 commit 合并、拆分、改写:
| |
pick 保留,squash 合并到上一个,reword 改写 commit message,drop 丢弃。
千万别 rebase 公开提交
| |
替代方案:把要清理的提交挪到一个临时分支,由原作者 rebase 后用 git push --force-with-lease 推一次,其他人 rebase 一次再说——但这只在团队约定一致的情况下可行。
几个救命命令
git rebase --abort:放弃当前 rebase,回到 rebase 之前git rebase --continue:解决完冲突后继续git reflog:rebase 搞砸了可以在 reflog 里找到旧 commit hash,git reset --hard <hash>救回来git push --force-with-lease:比--force安全,远程有你不知道的提交时会拒绝覆盖
总结
- 本地提交随便 rebase,历史干净
- 推送过的提交不要 rebase,除非团队约定且用
--force-with-lease - 出问题先
reflog,几乎都能找回