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 步推送后立刻结束,不要再做 pull 或 sync。变基后本地历史已经领先于远程,只有强推才能让两边一致。
:::
为什么用 --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。