目录
一,理解分支
1,举例
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 C++ 的时候,另⼀个你正在另⼀个平行宇宙努力学习 JAVA。

2,分支指针
每次commit提交,Git都把它他们串起来形成一个分支,这个分支叫主分支,即 master 分支。每次commit提交,master分支都会向前移动一步。

二,查看/创建/切换/合并/删除分支
1,查看分支
Git 支持我们查看当前或其他分支。
// 查看当前本地所有分⽀
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* master
// 查看HEAD头指针,正在工作的分支引用
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat .git/HEAD
ref: refs/heads/master
// 查看master主分支,指向特定提交哈希值的引用
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat .git/refs/heads/master
908b4840c9a425fbac93bf66983ff21f79fd337f
// 查看历史分支记录
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git log --graph --abbrev-commit
* commit a2adce4
| Author: forest <169135@qq.com>
| Date: Fri Dec 19 18:16:51 2025 +0800
|
| add file
|
* commit e7cf8e3
| Author: forest <169135@qq.com>
| Date: Fri Dec 19 17:11:16 2025 +0800
|
| RM: add 3 files
|
* commit 30a3ede
Author: forest <169135@qq.com>
Date: Fri Dec 19 16:54:42 2025 +0800
2,创建分支
在这里我们来创建第⼀个自己的分支 dev 。
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch dev
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
dev
* master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ ├── dev
│ └── master
├── objects
│ ├── 15
│ │ └── 1d62fdeb28c78a100e06dafadf9fd3c87eb9bf
│ ├── 30
│ │ └── a3ede6613907abef1af75edd40881ff27f1a18
│ ├── 34
│ │ └── 70c3efa596493f68a9d0e71eac20ada15e81fe
│ ├── 46
│ │ └── 945105fe53e2761fa74c91040698f11d799a58
│ ├── 4c
│ │ └── 08a8a5dc187fa9b30db319a690738fe3074143
│ ├── 5d
│ │ └── 970e2d2fdf1459454ddfcb640a5b676e7033e5
│ ├── 70
│ │ └── 13284e18f43c3991fe7439155646c715bb5335
│ ├── 8f
│ │ └── 5b66e9dbf16046cd03f6330ef337ef16a2b66c
│ ├── 90
│ │ └── 8b4840c9a425fbac93bf66983ff21f79fd337f
│ ├── 9b
│ │ └── 0899ac2777fc3e39ea561bb160f69658289eb5
│ ├── a2
│ │ └── adce4c28566af47b7875a930c4768e999c50f5
│ ├── a7
│ │ └── d340fc51407bbd26dd0f87f75d07f3cf882127
│ ├── aa
│ │ └── 3d7f568edcdef011cd9c2ccdeb55062900f5aa
│ ├── b9
│ │ └── 2675aa18db1c432b214705d5d793a99e932609
│ ├── ba
│ │ └── 3def4c52f283c0cce509dacbb8ba7b2631fc09
│ ├── bc
│ │ └── d236dbcc2239ab493987c19a69b252136f533b
│ ├── c6
│ │ └── c299ae63ce9cf04e009f30a6e300baff5c0c0c
│ ├── d1
│ │ └── c64694584cf480b01273f2c729fd8b6b7c320c
│ ├── e4
│ │ └── 46ee785164a8a28e6c49dcf2491b0a3d3c767c
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── e7
│ │ └── cf8e3a8a5c7c947d7dbeb0455227f116b2364b
│ ├── f1
│ │ └── fa690b173270bcab559396ee680fb9f12d977d
│ ├── info
│ └── pack
├── ORIG_HEAD
└── refs
├── heads
│ ├── dev
│ └── master
└── tags
34 directories, 43 files
3,切换分支
在这里我们来进行切换分支。
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat .git/refs/heads/master
908b4840c9a425fbac93bf66983ff21f79fd337f
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat .git/refs/heads/dev
908b4840c9a425fbac93bf66983ff21f79fd337f
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
dev
* master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout dev
Switched to branch 'dev'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* dev
master
切换不同的分支修改文件,只有当前自己的分支看得见。
// dev分支
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: ReadMe"
[dev f45a31e] RM: ReadMe
1 file changed, 1 insertion(+)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git status
# On branch dev
nothing to commit, working directory clean
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
dev branch
// master分支
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
dev
* master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
4,合并分支
为了在 master 主分支上能看到新的提交,就需要将 dev 分支合并到 master 分支。
用 git merge 命令合并dev分支到master分支。合并后,master 就能看到 dev 分支提交的内容了。此时的状态如图如下所示:

[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* dev
master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
dev
* master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge dev
Updating 908b484..f45a31e
Fast-forward
ReadMe | 1 +
1 file changed, 1 insertion(+)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
dev branch
5,删除分支
HEAD指针指向dev分支,在dev分支下不能删除自己,要切换到master分支才能删除dev。
// 在dev分支下不能删除自己
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* dev
master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch -d dev
error: Cannot delete the branch 'dev' which you are currently on.
// 要切换到master分支才能删除dev
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch -d dev
Deleted branch dev (was f45a31e).
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* master
使用git branch -D [分支名],强制删除分支。
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout -b dev3
Switched to a new branch 'dev3'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdef bug fix
i am coding... Done
force delete
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: force delete"
[dev3 72374fd] RM: force delete
1 file changed, 1 insertion(+)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
dev2
dev3
fix_bug
* master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch -d dev3
error: The branch 'dev3' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev3'.
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch -D dev3
Deleted branch dev3 (was 72374fd).
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
dev2
fix_bug
* master
三,合并冲突
1,理解合并冲突
在dev分支加devdev,在master分支加master,然后合并,就会产生冲突。
需要手动保留devdev或master,等需要留存的代码。
2,示例
// 在dev分支加devdev
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout dev1
Switched to branch 'dev1'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: ReadMe-devdev"
[dev1 324fe51] RM: ReadMe-devdev
1 file changed, 1 insertion(+), 1 deletion(-)
// 在master分支加master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
master on branch
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: ReadMe-master"
[master a623cb0] RM: ReadMe-master
1 file changed, 1 insertion(+), 1 deletion(-)
// 合并冲突
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge dev1
Auto-merging ReadMe
CONFLICT (content): Merge conflict in ReadMe
Automatic merge failed; fix conflicts and then commit the result.
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
<<<<<<< HEAD
master on branch
=======
devdev on branch
>>>>>>> dev1
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git status
# On branch master
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# both modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: merge dev1"
[master 7b3d25e] RM: merge dev1
四,合并模式
1,快进合并模式
Fast-forward代表"快进合并模式",也就是直接把master指向dev的当前提交,所以合并速度非常快。 如果当前分支master的提交历史完全是 dev2 的子集,Git 默认会直接把 master 的指针指向 dev2 的最新提交,不会创建新的合并提交,这就是快进合并。
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout -b dev2
Switched to a new branch 'dev2'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcde
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "MR: ReadMe-abcde"
[dev2 a7cfce3] MR: ReadMe-abcde
1 file changed, 1 insertion(+)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge dev2
Updating 7b3d25e..a7cfce3
Fast-forward
ReadMe | 1 +
1 file changed, 1 insertion(+)
2,非快进合并模式
no-fast-forward代表"非快进合并模式",git merge --no-ff :全称 no fast-forward,即禁用快进合并,强制 Git 生成一个新的合并提交,哪怕满足快进条件。
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout dev2
Switched to branch 'dev2'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdefghijklmn
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: Read"
[dev2 d6e4737] RM: Read
1 file changed, 1 insertion(+), 1 deletion(-)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge --no-ff dev2
Merge made by the 'recursive' strategy.
ReadMe | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
五,分支策略
1,图解
团队合作的分支看起来就像这样:

2,分支管理的基本原则
在实际开发中,我们应该按照几个基本原则进行分支管理:
master分支应该是非常稳定的,也就是仅⽤来发布新版本,平时不能在上面干活。
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。
你和小伙伴们每个⼈都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
六,BUG分支
1,图解
我们在dev2写代码的时候,有时会突然发现master分支有bug,这时该如何解决呢?
先保存dev2代码到stash,创建bug分支修改bug。第一次合并,用master合并bug分支。
再切换dev2写完后续代码。第二次合并,用dev2合并master,解决冲突。
第三次合并,用master合并dev2,没有冲突。

2,BUG分支的使用示例
// 正在dev2分支进行开发,突然发现master分支上有bug,当前代码保存到stash
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* dev2
master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdefghijklmnop
i am coding...
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git stash
Saved working directory and index state WIP on dev2: 766a868 RM: Read
HEAD is now at 766a868 RM: Read
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdefghijklmnop
// 注意,只有add/commit后,Git追踪管理的文件,才能用stash保存
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ touch file4
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git stash
No local changes to save
// 切换master分支,创建并切换bug分支,修复bug,并且add/commit提交
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout -b fix_bug
Switched to a new branch 'fix_bug'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdef bug fix
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: fix bug"
[fix_bug ab90663] RM: fix bug
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 file4
// 切换master分支,合并bug分支,检查bug已经修复
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge --no-ff -m "merge fix_bug" fix_bug
Merge made by the 'recursive' strategy.
ReadMe | 2 +-
file4 | 0
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 file4
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdef bug fix
// 切换dev2分支继续开发,发现之前写的代码不见了,从stash恢复代码,发现bug还在dev2分支
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout dev2
Switched to branch 'dev2'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdefghijklmnop
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git stash list
stash@{0}: WIP on dev2: 766a868 RM: Read
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git stash pop
# On branch dev2
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (3a31a0f77a17cdacdf41527176b561c9be512b1e)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdefghijklmnop
i am coding...
// 在dev2分支完成后续开发,在dev2分支合并master分支,解决合并冲突
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdefghijklmnop
i am coding... Done
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "RM: ReadMe-Done"
[dev2 60b6209] RM: ReadMe-Done
1 file changed, 1 insertion(+)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git branch
* dev2
fix_bug
master
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge --no-ff -m "merge master" master
Auto-merging ReadMe
CONFLICT (content): Merge conflict in ReadMe
Automatic merge failed; fix conflicts and then commit the result.
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ vim ReadMe
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdef bug fix
i am coding... Done
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git add .
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git commit -m "merge master fix"
[dev2 81c9000] merge master fix
// 切换master分支,合并dev2分支,这时就没有冲突了
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git checkout master
Switched to branch 'master'
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ git merge --no-ff -m "merge de2" dev2
Merge made by the 'recursive' strategy.
ReadMe | 1 +
1 file changed, 1 insertion(+)
[user@iZwz9eoohx59fs5a6ampomZ gitCode]$ cat ReadMe
hello git!
hello world!
devdev on branch
abcdef bug fix
i am coding... Done