基本概念
概念
- 分支指针 ------ 指向某个具体的提交,表示该分支的最新状态 (如
master、dev)- 可移动:每次在分支提交代码,分支指针会自动向前移动
HEAD指针 ------ 指向当前位置所在分支的最新提交,表示"正在哪个分支上工作 "- 临时性:
HEAD值随git switch或git checkout切换分支而改变
- 临时性:
原理
初始状态
- 一开始,
master分支是一条线,Git用HEAD指向master,用master指向最新的提交,确定当前分支master以及提交点 - 每次提交,
master分支指针向前移动随着不断提交,master分支线越来越长

创建分支
- 创建新分支
dev时,Git新建指针dev,指向master相同提交,确定当前分支dev以及提交点 - 每次
dev分支提交,dev指针向前移动,master指针不变

快速合并 fast-forward
- 情况 :
dev分支有新提交 ,而master主分支无新提交,提交结构是一条线 - 操作 :直接让
master指向dev的当前提交,HEAD指针指向master,完成合并

非快速合并 not-fast-forward
- 情况 :
feature分支、master主分支各自有新的提交,提交结构不是一条线 - 操作 :
Git无法执行快速合并,只能试图把各自的修改合并起来 - 冲突解决 :合并时如果两个分支对同一个文件都有修改,可能产生冲突,需打开冲突文件解决冲突

指令介绍
分支创建\查看\删除\重命名 git branch
-
语法
shgit branch [<options>] <branch-name> [--merged] [--no-merged]选项 功能 -a/--all显示所有分支,包括远程跟踪分支 -d/--delete删除已合并的分支(需已合并到当前分支) -D强制删除分支(即使未合并) -m/--move重命名当前分支 -r/--remote仅列出远程分支 -v/--verbose显示分支的详细信息(包括最后一次提交和跟踪关系) -vv显示分支的详细跟踪信息 --no-merged显示未合并的分支 --merged显示已合并的分支 -
具体示例
-
查看分支情况
sh$ git branch # 查看本地分支 $ git branch -a # 查看本地、远程的所有分支 -
创建分支
sh$ git branch feature/login -
删除分支
sh$ git branch -d feature/login # 删除已合并的分支 $ git branch -D feature/login # 强制删除未合并的分支
-
分支切换\创建\合并 git checkout
-
语法
shgit checkout [<options>] [<branch>]参数 功能 -b/--branch创建新分支并切换(分支存在时报错) -B/--force-branch强制创建/重置分支并切换(覆盖现有分支) -m/--merge执行三方合并到新分支,保留未提交的更改 -f/--force强制切换,丢弃本地修改 (危险:会丢失未提交的更改) -2/--ours合并冲突时检出我方版本解决冲突 -3/--theirs合并冲突时检出对方版本解决冲突 -
具体示例
-
切换分支
shgit checkout main # 切换到已存在的分支 git checkout -f feature # 强制切换(丢弃工作区修改) -
创建分支
shgit checkout -b feature # 从当前分支最新提交创建新分支 git checkout -b feature abc123 # 从当前分支指定提交创建分支(分支不存在时报错) git checkout -B feature # 强制创建/重置分支(分支存在则重置) -
解决合并冲突
shgit checkout --ours conflicted-file.js # 保留当前分支的版本(--ours) git checkout --theirs conflicted-file.js # 保留合并分支的版本(--theirs)
-
专用分支切换 git switch
专门用于切换分支,由
Git 2.23引入,替代git checkout的分支操作相关功能,在功能上等价
-
语法
shgit switch [<options>] [<branch>]参数 功能 -c/--create创建新分支并切换(分支存在时报错) -C/--force-create强制创建/重置分支并切换(覆盖现有分支) -m/--merge执行三方合并切换到新分支 -f/--force强制切换,丢弃本地修改 (危险:会丢失未提交的更改) -
具体示例
-
切换分支
shgit switch main # 切换到已存在的分支 git switch -f feature # 强制切换(丢弃工作区修改) -
创建分支
shgit switch -c feature # 从当前分支最新提交创建新分支 git switch -c feature abc123 # 从当前分支指定提交创建分支(分支不存在时报错) git switch -C feature # 强制创建/重置分支(分支存在则重置)
-
-
区分 ------ 几种不同的创建分支指令
命令 功能 分支存在时的行为 是否切换 使用场景 git branch feature仅创建分支 报错 ❌ 不切换 后台创建,稍后使用 git checkout -b feature或git switch -c feature创建并切换 报错 ✅ 切换 标准工作流 git checkout -B feature或git switch -C feature创建/重置并切换 重置覆盖 ✅ 切换 修复/重做分支
分支合并 git merge
-
语法
shgit merge [<options>] [<commit>...]选项 功能 --no-ff/--no-fast-forward禁用快进合并,强制生成合并提交 --ff-only/--fast-forward-only仅允许快进合并,否则失败 -m/--message指定合并提交的消息(与 --no-ff一起用)--no-commit执行合并但不自动提交,可以调整合并结果 -
具体示例
-
合并
feature/login到当前分支bashgit merge feature/login -
禁用快进合并(保留合并历史)
bashgit merge --no-ff feature/login -
仅允许快进合并(否则报错)
bashgit merge --ff-only feature/login -
解决冲突后继续合并
bashgit merge --continue
-
分支管理
相关指令
-
git branch------ 创建、查看、删除、重命名分支 -
git checkout------ 切换、创建分支 -
git switch------ 专用切换分支(替代checkout)
实操
-
创建分支
sh$ git branch new-feature -
创建并切换到新分支
sh$ git checkout -b new-feature $ git switch -c new-feature # 或使用较新的 git 版本中的命令 Switched to a new branch 'new-feature' -
切换分支
sh$ git checkout main $ git switch main # 或使用较新的 git 版本中的命令 Switched to branch 'main' Your branch is up to date with 'origin/main'. -
查看分支
sh$ git branch develop feature/login * main # 带星号 * 表示当前所在分支 new-feature -
安全删除已合并的分支
sh$ git branch -d develop Deleted branch develop (was abc1234). -
强制删除未合并的分支
sh$ git branch -D develop warning: Deleting branch 'develop' that has not been merged. Deleted branch experimental (was def5678).
分支合并
相关指令
git merge------ 将指定分支的提交合并到当前分支
场景一:快速合并
-
初始状态 ------ 创建并切换分支
dev,查看当前分支情况sh$ git checkout -b dev Switched to a new branch 'dev'sh$ git branch * dev master -
修改文件 ------ 在
dev分支上修改readme.txt文件并提交sh$ git add readme.txtsh$ git commit -m "branch test" [dev b17d20e] branch test 1 file changed, 1 insertion(+) -
快速合并 ------ 切换回
master分支,把dev分支的工作成果合并到master分支上sh$ git checkout master Switched to branch 'master'sh$ git merge dev Updating d46f35e..b17d20e Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+) -
删除分支 ------ 合并完成,可放心地删除
dev分支sh$ git branch -d dev Deleted branch dev (was b17d20e).

场景二:非快速合并
-
feature分支操作 ------ 创建并切换分支feature,修改readme.txt文件并提交sh$ git switch -c feature Switched to a new branch 'feature'sh# feature 分支上的 readme.txt 最后一行改为: Modify on feature for merge test.sh$ git add readme.txtsh$ git commit -m "Feature modify" [feature 14096d0] Feature modify 1 file changed, 1 insertion(+), 1 deletion(-) -
master分支操作 ------ 切换分支master,再次修改readme.txt文件并提交sh$ git switch master Switched to branch 'master' Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits)sh# master 分支上 readme.txt 最后一行改为: Modify on master for merge test.sh$ git add readme.txtsh$ git commit -m "Master modify" [master 5dc6824] Master modify 1 file changed, 1 insertion(+), 1 deletion(-) -
直接尝试合并 ------ 提交分支存在"分叉",这种情况下不同分支上的文件可能会产生冲突,无法快速合并
sh$ git merge feature Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.Git 提示:两个分支的
readme.txt文件存在冲突,必须手动解决冲突后再提交 -
解决冲突后再合并
-
查看冲突 ------ 输入命令
git status查看冲突文件sh$ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a") -
手动解决冲突 ------ 查看
readme.txt,手动解决冲突sh$ cat readme.txt Hello word! <<<<<<< HEAD Modify on master for merge test. ======= Modify on feature for merge test. >>>>>>> featureGit提示 :用<<<<<<<,=======,>>>>>>>标记出不同分支内容sh$ cat readme.txt Hello word! Modify on feature for merge test. -
提交合并
sh$ git add readme.txt $ git commit -m "conflict fixed" [master cf810e4] conflict fixed -
删除分支 ------ 合并完成,可放心地删除
feature分支sh$ git branch -d feature Deleted branch feature (was 14096d0).
-

场景三:查看分支合并情况
-
输入带参数的
git log指令查看分支合并情况sh$ git log --graph --pretty=oneline --abbrev-commit * cf810e4 (HEAD -> master) conflict fixed |\ | * 14096d0 (feature1) Feature Modify * | 5dc6824 Master modify |/ * b17d20e branch test * d46f35e (origin/master) remove test.txt * b84166e add test.txt * 519219b git tracks changes * e43a48b understand how stage works * 1094adb append GPL * e475afc add distributed * eaadf4e wrote a readme file
分支策略
合并策略
-
合并时启用
Fast-Forward(默认模式)shgit merge -m "merge message" dev- 适用 ------ 当目标分支(如
master)是待合并分支(如dev)的直接祖先时 - 行为
- 合并后历史呈直线,无法保留分支的拓扑信息
- 删除分支后,无法从历史中看出曾存在过分支,不便于追踪代码来源
- 适用 ------ 当目标分支(如
-
合并时禁用
Fast-Forward(参数--no-ff)shgit merge --no-ff -m "merge message" dev- 适用 ------ 即使满足
Fast-Forward条件,也会创建一个新的合并提交 - 行为
- 保留分支的拓扑结构,从历史中清晰看出分支的存在和合并点
- 适合团队协作,便于追踪代码来源
- 适用 ------ 即使满足
-
策略
场景 推荐 原因 个人本地分支合并 Fast-Forward简化历史,避免冗余提交 团队协作分支合并 --no-ff保留分支信息,便于追踪代码变更 需要明确记录合并操作 --no-ff合并提交提供上下文(如版本发布)
管理策略

| 分支 | 作用 | 说明 |
|---|---|---|
主分支 (master/main) |
生产环境的 稳定分支 | - 仅用于发布正式版本,禁止直接提交代码 - 必须通过合并其他分支(如 dev)来更新 - 代码始终处于可部署状态 |
开发分支 (dev) |
集成团队代码的 协作分支 | - 所有开发者的功能分支均合并到此处 - 允许存在未完成的代码,但需通过测试后再合并到 master - 定期同步以避免冲突 |
个人/功能分支 (如 feature/login) |
开发者独立工作的 开发分支 | - 基于 dev 分支创建,命名需清晰(如 feature/xxx、fix/xxx) - 开发完成后通过 Pull Request(PR) 或 Merge Request(MR) 合并到 dev - 避免长期存在,及时删除已合并的分支 |