一、分支介绍
分支是Git的杀手级特征,而且Git鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。因为Git分支非常轻量级,不像其他的版本控制,创建分支意味着要把项目完整的拷贝一份,而Git创建分支是在瞬间完成的,而与你工程的复杂程度无关。
二、创建分支与合并分支
分支可以被理解为一条时间线,这一条时间线上串着一个个节点,每个节点都是一次提交记录/版本。
git默认只有一条时间线or分支,该时间线or分支称之为主分支,即master分支,文件.git/refs/heads/master 内存放着指向master分支最新版本的指针,如果下所示红色块即master指针,指向master分支
# 注意箭头方向,因为每一次提交都有一个指向上一次提交的指针,所以箭头方向向左,更为合理
每次提交,master分支都会向前移动一步,master指针指向最新提交的一个版本,这样,随着你不断提交master分支的线也越来越长,如下
如果我们有多个分支,那么GIT如何实现在多个分支之间来回切换的呢,·git文件夹下的HEAD文件负责存放当前所在的分支ref:refs/heads/分支名称》,切换分支就是修改HEAD文件中的内容为对应分支,并将工作区的文件恢复至对应分支的内容,所以严格来说HEAD不是指向提交,而是指向当前所在的分支,比如master,master才是指向提交的,一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向就能确定当前分支,以及当前分支的提交点:
当我们创建并切换到一个新的分支,例如dev时
1、Git会新建一个指针叫dev,指向master相同的提交
2、然后再把HEAD指向dev,就表示当前分支在dev上
Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化
如果HEAD指向dev,那么代表当前分支在dev上,这意味着接下来对工作的修改和提交都是针对dev分支了,如果master是小河的主干,那么dev就是这条河的支流,主干的水被引入了支流.
比如提交一次后,dev指针往后移动一步,而master指针不变
当在master分支合并dev分支时,因为他们在一条线上,这种单线的历史分支不存在任何需要解决的分歧,所以只需要master指针指向dev分支的最新一次提交即可,所以非常快。
所以你看,git不仅创建分支快,合并分支也很快!就改改指针,工作区内容也不变!合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支,甚至都看不出来添加过dev分支,毁尸灭迹了
实操:
1、在当前分支下创建子分支并切换
# 1.1 创建+切换=>两条命令搞定 git branch dev # 在当前分支下创建子分支 git checkout dev # 由当前分支切换到子分支 #1.2 创建+切换=>一条命令搞定 git checkout -b dev # 等同于上述两条命令,代表创建并切换到子分支
2、直接切换到已有分支
git checkout dev
3、查看当前分支
dev
master4、切换到dev分支下修改并提交记录/版本
git checkout dev echo "111" > c.txt git add . git commit -m "v4" git checkout master git merge dev # git merge命令用于合并指定分支到当前分支。
如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fastforward),上述合并git merge dev用的就是Fast-forward快进模式,毫无疑问不是每次合并都能采用Fast-forward。 合并完成后,就可以放心地删除dev分支了 $ git branch -d dev Deleted branch dev (was f1d9621).
master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。5、switch
因为get checkout -- 文件通常是用来撤销修改的,又用它来创建并切换分支,有点容易让人混淆,所以 最新版本的Git提供了新的git switch命令来创建or切换分支,推荐使用 $ git switch -c dev # 创建并切换到新的dev分支,等同于git checkout -b dev $ git switch master # 直接切换到已有的master分支
三、分支管理策略
评论 (0)