FumadocsZDecode
Git

如何 rebase

rebase 用于把当前分支的提交「搬」到目标分支的最新提交之上,让历史保持线性整洁。

核心原则

:::warning rebase / squash 之后,下一步只能是 git push --force-with-lease,绝对不要再 pull :::

  • rebase / squash 会重写提交历史,本地和远程的提交不再是同一份。
  • 此时如果执行 pull,Git 会把远程的旧提交又合并回来,导致历史分叉、重复提交甚至冲突。
  • 正确做法是用 --force-with-lease 把本地重写后的历史推上去。推完之后本地 = 远程,分叉消失,之后再 pull 才安全。

用 main 更新分支的正确顺序

假设你在功能分支上开发,想把 main 的最新代码同步进来:

# 1. 切到 main 并更新
git checkout main
git pull

# 2. 切回你的分支
git checkout your-branch

# 3. 基于最新的 main 变基
git rebase main

# 4. 立刻强制推送,不要 pull
git push --force-with-lease

:::important 第 4 步推送后立刻结束,不要再做 pullsync。变基后本地历史已经领先于远程,只有强推才能让两边一致。 :::

为什么用 --force-with-lease 而不是 --force

# 推荐:仅当远程没有别人的新提交时才强推
git push --force-with-lease

# 不推荐:无条件覆盖,可能冲掉队友的提交
git push --force

--force-with-lease 会先检查远程分支是否和你上次拉取时一致:

  • 如果一致,说明只有你重写了历史,强推安全。
  • 如果远程已经有别人推的新提交,强推会被拒绝,避免误删队友的工作。

VSCode 的坑

VSCode 源代码管理里的 🔄 Sync 按钮和 Pull 都会触发 pull,rebase 之后很容易手贱误点,把刚整理好的历史又搞乱。

rebase 后请直接用 force push,不要点 Sync / Pull

  • 源代码管理 → 菜单 → Push
  • 或命令面板(Cmd/Ctrl + Shift + P)执行 Git: Push (Force)

小结

操作rebase / squash 之后
push --force-with-lease✅ 唯一正确的下一步
pull❌ 会导致历史分叉
VSCode Sync 按钮❌ 本质是 pull,别点
push --force⚠️ 能用但有风险,优先用 --force-with-lease

只要记住一句话:rebase 完先强推,强推完才 pull。

On this page