git分支

git分支

1、概念

一个团队中有多个人在开发一个项目,某个同事在开发一个新的功能,需要一周时间完成,他写了其中的30%还没有写完,如果他提交了这个版本,那么团队中的其他人就不能继续开发了。但是等到他全部写完再全部提交,大家又看不到他的开发进度,也不能继续干活,这如何是好呢?

对于上面的问题,可以使用分支管理来解决,每个人都有自己的分支,其他人看不到,一个开发分支上有多个分支干活,等全部开发完成后,在一次性的合并到开发分支上,这样我们知道他的开发进度,又不影响大家干活

分支本质就是一个指向某次提交的可变的指针,Git 的默认分支名字为 master 。而我们是怎么知道当前处于哪个分支当中呢?答案就是在于 HEAD 这个十分特殊的指针,它专门用于指向于本地分支中的当前分支

2、创建与合并分支

1、创建分支原理分析

创建子分支,会自动继承父分支的全部内容

master主分支,创建了一个dev分支,dev分支写好了东西,合并到master上,这样master上就有dev写好的东西了

分支之间是互不干扰的,一般来讲就是子分支先同步主分支,然后再在子分支上写内容,最后同步到主分支上

  • 提前解决冲突,不要等到最后才炸

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

img

每次提交,master分支都会向前移动一步,随着不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

img

Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

img

假如我们在dev上的工作完成了,就可以把dev合并到master上。最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

img

所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

img

2、创建分支的语法

创建一个分支并切换到新分支上

[root@master appA]# git checkout -b dev
Switched to a new branch 'dev'
[root@master appA]# git branch -a 
* dev  # *表示当前所在的分支
  master

# 相当于执行2条命令

git branch dev  # 创建分支
git checkout dev  # 切换分支

查看当前仓库所有分支

[root@master appA]# git branch -a
* dev
  master

切换分支

[root@master appA]# git switch master 
Switched to branch 'master'

# git checkout master 老版本的切换

合并分支

# 当前分支是master,子分支是dev
# 会将dev分支内容添加到master上
[root@master appA]# git merge dev 
Updating 50594db..7f76bda
Fast-forward
 99.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 99.txt

3、解决冲突

同一个文件的同一个位置,2个分支改了不一样的内容,最后合并的时候,git不知道留哪个,就会出现冲突

master分支修改了文件,并且提交了,但是再次之前创建的子分支没有同步这个信息,也修改了文件,提交了,此时切换到master分支后,合并子分支,就不知道听谁的呢?

  • 正常做法就是,主分支做了改动的话,子分支需要先同步主分支

哪些情况不会冲突呢?

  • 改的不同文件

  • 改同一个文件的不同行

  • 一个改,一个没有改

模拟冲突

  • master分支上的hello.txt文件

  • dev分支添加了一行

  • test分支添加了一行

  • 最后master分支合并的时候,就会出现冲突

# test分支
[root@master appA]# git checkout -b test
Switched to a new branch 'test'

# test分支添加内容
[root@master appA]# echo test >> hello.txt 
[root@master appA]# git add hello.txt 
[root@master appA]# git commit -m "test add"

# 切换到master分支上
[root@master appA]# git checkout master 
Switched to branch 'master'

# 文件内容只有master,test分支上那个文件内容还有test


# dev分支
[root@master appA]# git checkout -b dev
Switched to a new branch 'dev'
[root@master appA]# echo "dev" >> hello.txt 
[root@master appA]# git add  hello.txt 
[root@master appA]# git commit -m "dev" 

# 切换到master分支
[root@master appA]# git checkout master 
Switched to branch 'master'

# 合并2个分支,出现的问题,同一个文件的同一行,被2个分支修改了,git不知道合并谁
[root@master appA]# git merge dev  test 
Fast-forwarding to: dev
Trying simple merge with test
Simple merge did not work, trying automatic merge.
Auto-merging hello.txt
ERROR: content conflict in hello.txt
fatal: merge program failed
Automatic merge failed; fix conflicts and then commit the result.

# 查看文件内容,变成这样了
[root@master appA]# cat hello.txt 
master
<<<<<<< .merge_file_dhGcTU
dev
=======
test
>>>>>>> .merge_file_49VIrC

怎么解决了?

# 编辑文件
# 觉得有用的就留下来
[root@master appA]# cat hello.txt 
master
dev
test

# 再次提交即可
[root@master appA]# git add  hello.txt 
[root@master appA]# git commit -m "conflict"
[master 28d5aa9] conflict

# 就没有任何问题了
[root@master appA]# git status 
On branch master
nothing to commit, working tree clean

切换到其他分支上看一看

# 切换到test分支
[root@master appA]# git checkout test 
Switched to branch 'test'
# 文件内容还是这样的
[root@master appA]# cat hello.txt 
master
test

# 将master分支同步到test分支
[root@master appA]# git merge master 

# 查看文件
[root@master appA]# cat hello.txt 
master
dev
test

总结

  • 主分支保持稳定

  • 新建子分支写的功能

  • 子分支要经常同步主分支的最新代码

  • 子分支写完后,在切换到master分支,合并子分支

4、推送和拉取远程分支

  • 等会写
posted @ 2026-04-10 13:18  乔的港口  阅读(5)  评论(0)    收藏  举报