Git Rebase 用法笔记
以前一直用 merge,觉得 rebase 太危险。后来被同事强行安利,用了一段时间发现确实有它的好处。但也踩了不少坑。
Rebase vs Merge
直观区别:
merge会保留分支历史,产生一个 merge commitrebase会把提交”移动”到目标分支的最新位置,历史更线性
# merge
git checkout feature
git merge main
# rebase
git checkout feature
git rebase main
什么时候用 Rebase
拉取远程更新
git pull --rebase
比 git pull 干净,不会产生无意义的 merge commit。
整理本地提交
git rebase -i HEAD~3
交互式 rebase 可以合并、修改、删除提交。提交信息写错了?想合并几个小提交?用这个。
pick a1b2c3 第一个提交
squash d4e5f6 第二个提交 # squash 会合并到上一个
什么时候不用 Rebase
公共分支上绝对不要 rebase!
如果你 rebase 了已经推送到远程的分支,然后再 push,别人的历史就乱了。
# 危险操作
git rebase main
git push --force # 千万别在公共分支上这么干
踩坑记录
有一次我在 feature 分支上 rebase 了 main,然后 push —force 了。结果同事那边拉代码全是冲突。最后花了一下午才修好。
从那以后我记住了:
- 本地没 push 过的提交可以 rebase
- 已经 push 的,除非确定没人在用,否则别动
还有一次 rebase 过程中冲突了,我不知道怎么处理,直接 git rebase --abort 跑了。后来才知道应该:
# 解决冲突后
git add .
git rebase --continue
# 或者放弃这次 rebase
git rebase --abort
小技巧
# rebase 过程中想看看进度
git status
# 跳过当前提交
git rebase --skip
# rebase 完发现搞错了
git reflog # 找到 rebase 之前的状态
git reset --hard HEAD@{n}
总结
Rebase 是好工具,但要用对地方。本地分支随便折腾,公共分支老老实实用 merge。
团队规范很重要,我们现在是:
- feature 分支开发完成后 rebase main
- merge request 时用 squash merge
- main 分支禁止 force push
这样历史既干净又安全。