分支与变基
rebase、squash、cherry-pick、detached-head。
35 分钟
分支与变基
分支让多人并行开发;rebase、squash、cherry-pick 是整理历史、挑选变更的高级工具。本课对应 git-github 路线图 的 rebase、squash、cherry-pick、detached-head 节点。
基础 git branch / merge 见 git-essentials;GitHub 上 PR 可选择 Squash and merge、Rebase and merge。
学习目标
- 使用
git rebase把 feature 分支接到最新 main 上 - 理解 squash merge 与线性历史的利弊
- 会用
cherry-pick摘取单个 commit;识别 detached HEAD
Rebase 更新 feature 分支
git switch main
git pull origin main
git switch feature/login
git rebase main
# 若有冲突:改文件 → git add → git rebase --continue
git push --force-with-lease origin feature/login
黄金法则: 不要 rebase 已合并或他人基于其开发 的公共分支;只 rebase 自己的 feature 分支。
Squash 合并
本地把多个 commit 压成一个:
git switch feature/login
git rebase -i main
# 在编辑器里把后几条 pick 改成 squash 或 fixup
GitHub PR 合并选 Squash and merge:main 上只留一条 commit,历史干净;丢失中间 commit 粒度,适合小功能或 WIP 很多的分支。
Cherry-pick
把指定 commit 应用到当前分支:
git switch hotfix/prod
git cherry-pick abc1234
git cherry-pick def5678..ghi9012 # 范围(不含起点)
场景:main 上某 fix 需要同步到 release 分支,又不想 merge 整分支。
Detached HEAD
git checkout abc1234 # 或 git switch --detach abc1234
# HEAD detached at abc1234
此时不在任何分支上,新 commit 可能「悬空」丢失。若要保留:
git switch -c experiment-from-abc
或切回分支:git switch main。
GitHub 上的分支视图
Branches 页看活跃/已合并分支;Insights → Network 看图形。清理已合并分支:
git branch -d feature/login
git push origin --delete feature/login
练习
- 在 feature 分支上 rebase 最新 main,解决一次故意冲突