Git 分支与合并:branch / switch / merge
更新时间:2026-08-25。本篇覆盖分支管理的核心命令:
git branch(管理分支)、git switch/git checkout(切换)、git merge(合并)。
分支的本质:一个可移动的指针
分支不过是指向某次提交的指针,HEAD 指向"当前所在分支"。创建分支就是"在当前提交上放一个新指针"——所以 Git 的分支创建是 O(1) 的,这也是分支工作流如此流畅的根本原因。

1. git branch:管理分支
bash
git branch # 列出本地分支(* 标记当前)
git branch -v # 附带每个分支最近提交
git branch -vv # 附带上游跟踪关系(很常用)
git branch <name> # 创建分支(不切换)
git branch -d <name> # 删除已合并的分支(安全)
git branch -D <name> # 强制删除(丢弃未合并提交)
git branch -m <old> <new> # 重命名
git branch --merged # 已合并进当前分支的分支
git branch --no-merged # 未合并的分支(删除前检查)删除分支只删指针,不删提交。只要提交还被某个标签/分支/reflog 引用,就仍可找回(见 标签与排障)。
2. git switch / git checkout:切换分支
bash
git switch main # 切到 main
git switch -c feature/login # 新建并切换(最常用)
git switch - # 切回上一个分支
git checkout -b hotfix # 旧语法:新建并切换(等价 switch -c)
git checkout -- <file> # 危险:用 HEAD 版本覆盖工作区文件Git 2.23 之后推荐
switch/restore分离职责:switch只管切分支,restore只管恢复文件,避免checkout一身多职导致的误用。
切换分支前必查
bash
git status # 工作区必须干净,或改动已 stash
git switch -c feature/x未提交的改动跟随分支切换的规则:改动会"带过去",但只在两边无冲突时才允许切换(例如 main 改了 a.c,feature 也改了 a.c,则拒绝切换,需先提交或 stash)。
3. git merge:合并分支
bash
git switch main
git merge feature/login # 把 feature/login 合并进 main
git merge --no-ff feature/x # 强制创建合并提交(保留分支历史)
git merge --abort # 冲突后放弃合并,回到合并前两种合并结果
| 类型 | 触发条件 | 历史形态 |
|---|---|---|
| 快进 Fast-forward | main 自分支点后无新提交 | 线性,无合并提交 |
| 三方合并 Merge commit | 两边都有新提交 | 多出一个合并提交,保留两条线 |
bash
# 默认在可快进时自动快进;需要显式合并提交用:
git merge --no-ff feature/x
# 反之,只想确认可快进再合并:
git merge --ff-only feature/x冲突解决
bash
$ git merge feature/login
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
Automatic merge failed; fix conflicts and then commit the result.冲突标记长这样:
cpp
<<<<<<< HEAD
int max = 100; // 当前分支(main)版本
=======
int max = 200; // 被合并分支版本
>>>>>>> feature/login解决步骤:
bash
git status # 1. 找到冲突文件(UU 标记)
# 编辑文件,保留正确内容,删掉 <<<<<<< ======= >>>>>>> 标记
git add main.cpp # 2. 标记为已解决
git commit # 3. 完成合并提交(无需 -m,已预填信息)冲突不是失败,是正常协作的一部分。现代 IDE 与
git mergetool提供图形化解决界面;习惯上先git diff看双方意图再取舍。
分支工作流对比
| 模型 | 核心思想 | 适用 |
|---|---|---|
| Git Flow | 长期分支 main/develop + 短期分支 feature/release/hotfix | 有发布节奏的成熟产品 |
| GitHub Flow | 只有 main + 特性分支,PR 合并即发布 | 持续部署的互联网产品 |
| Trunk-Based | 所有人频繁提交到主干,超短特性分支 | 高吞吐团队 |
对于本仓库这类文档型/个人项目,推荐 GitHub Flow 简化版:
main始终可发布,功能开分支、完成即合并。
易错点
git checkout -- <file>会永久丢弃工作区改动——确认无保存价值再用;要找回需依赖编辑器/IDE 的本地历史。git branch -D删除未合并分支前,先用git log <branch>确认没有想保留的提交,或先git merge。- 快进合并"吞掉"分支历史:
--ff合并后 log 里看不到分支点,需要保留分支存在痕迹时用--no-ff。 - 冲突文件被误标记解决:只
git add了自己确认修改过的文件,别git add -A一把梭。
一句话总结:分支是廉价指针、switch -c 开新线、merge 收线;合并优先保证工作区干净,冲突时逐个文件按"留谁删谁"解决后再 add + commit。