Git 进阶
分支、合并与 stash。
Git 进阶
这一课你将能做到
- 用
git switch/git branch创建、切换、删除分支,并理解 HEAD 指针 - 区分 fast-forward 合并与三方合并,会用
--no-ff保留分支历史 - 用
git stash临时存稿,用git tag打版本号,用cherry-pick挑提交
为什么要学
分支是 Git 的灵魂,也是它碾压 SVN 的根本原因:Git 的分支只是一个指向 commit 的指针(41 字节),创建一个分支的代价是「零」。这让我们可以为每个 bug、每个功能开一条独立分支,互不干扰地并行开发。
不理解分支模型,后面学的 GitHub PR、Code Review、Git Flow 全都立不住。而面试官问你「HEAD 是什么」「merge 和 rebase 区别」时,答的就是这一课的内容。
先建立图像
分支 = 指针,HEAD = 当前位置标记:
main 分支
▼
A ── B ── C ────── D
\
E ── F ← feature 分支
▲
HEAD(你正站在这里)
合并的两种形态:
【fast-forward】main 直接快进到 feature(没有合并 commit)
A─B─C─D ─合并后─> A─B─C─D─E─F main 移到 F
【三方合并 / --no-ff】产生一个合并 commit M
A─B─C─D───M
\ /
E─F
--no-ff 强制走三方合并,好处是历史里能看出「这是一条功能分支」。
跟着做
步骤 1:创建并切换分支
git branch # 列出本地分支,* 号是当前
git switch -c feature/login # 创建并切换(推荐新语法)
# 等价老命令:git checkout -b feature/login
# 在新分支上改代码、提交
echo "// 登录功能" >> src/Login.java
git add .
git commit -m "feat: 实现用户登录"
switch 是 Git 2.23 引入的新命令,专职「切分支」;restore 专职「改文件」,把老 checkout 的职责拆开了。
步骤 2:查看分支图
git log --oneline --graph --all
# * 3f4a2b1 (HEAD -> feature/login) feat: 实现用户登录
# * d1e5c6a (main) fix: 修复首页空指针
--graph --all 让你同时看到所有分支的分叉结构。
步骤 3:合并分支(fast-forward)
git switch main
git merge feature/login
# Fast-forward
# src/Login.java | 1 +
如果 main 在你开发期间没有新提交,Git 直接把 main 指针快进到 feature 最新位置,不产生合并 commit。
步骤 4:强制三方合并(保留分支痕迹)
git switch main
git merge --no-ff feature/login -m "merge: 合入登录功能"
团队开发推荐 --no-ff,因为历史里能清楚看到「这一坨是一个功能」。
步骤 5:删除分支
git branch -d feature/login # 安全删除(已合并)
git branch -D feature/login # 强制删除(未合并也删,危险)