<2>,Git分支管理

目录

一,理解分支

1,举例

2,分支指针

二,查看/创建/切换/合并/删除分支

1,查看分支

2,创建分支

3,切换分支

4,合并分支

5,删除分支

三,合并冲突

1,理解合并冲突

2,示例

四,合并模式

1,快进合并模式

2,非快进合并模式

五,分支策略

1,图解

2,分支管理的基本原则

六,BUG分支

1,图解

2,BUG分支的使用示例


一,理解分支

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
相关推荐
njsgcs1 小时前
仓库子文件夹设置不公开 git submodule add
git
草莓熊Lotso1 小时前
Python 库使用全攻略:从标准库到第三方库(附实战案例)
运维·服务器·汇编·人工智能·经验分享·git·python
CNRio1 小时前
Day 51:Git的高级技巧:使用Git的reflog恢复丢失的提交
大数据·git·elasticsearch
ZeroNews内网穿透2 小时前
轻量级自托管Git服务:Gitea私有化部署与公网访问
服务器·网络·数据库·git·gitea
rannn_11116 小时前
【Java项目】中北大学Java大作业|电商平台
java·git·后端·课程设计·中北大学
wordbaby19 小时前
公私分明:为什么你不应该共用 SSH Key(附多账号最佳实践指南)
前端·git·ssh
Albert Edison20 小时前
【Git】分支管理
大数据·git·elasticsearch
Forest_HAHA21 小时前
<4>,Git多人协作
git
CNRio1 天前
Day 43:Git的高级技巧:使用Git的rebase简化提交历史
大数据·git·elasticsearch
少云清1 天前
【接口测试】2_持续集成 _Git与Gitee
git·ci/cd·gitee