Git Rebase 用法笔记

以前一直用 merge,觉得 rebase 太危险。后来被同事强行安利,用了一段时间发现确实有它的好处。但也踩了不少坑。

Rebase vs Merge

直观区别:

  • merge 会保留分支历史,产生一个 merge commit
  • rebase 会把提交”移动”到目标分支的最新位置,历史更线性
# 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 了。结果同事那边拉代码全是冲突。最后花了一下午才修好。

从那以后我记住了:

  1. 本地没 push 过的提交可以 rebase
  2. 已经 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

这样历史既干净又安全。