一、什么是分支?
在版本控制中,我们可以针对每个任务创建一个单独的分支,可以让我们的工作从主线上分离开,在开发自己的分支的同时,不会影响主线的分支运行;(分支的底层通过指针进行引用的)
例如下图:
解释:
红色框便是主线分支,其他分支的创建通过复制主线的任务,进行单独修改,再修改完成以后再合并到主线上;
好处:
通过分支,可以同时并行开发多个功能,十分高效,并且每个分支互不影响,即使某一分支开发失败,也可以将其删除后重新开发;
二、分支的操作
2.1、查看分支
git branch -v
执行效果:
这里可以看出,当前只有这么一个主分支;
如果当前这个主分支里面东西写错了,需要紧急修复怎么办?这时候就可以创建分支,来进行合并,怎么创建分支呢?往下看~
2.2、创建分支
git branch 分支名
例如我想创建一个名字为hot-fix这样一个分支:
接着查看分支:
解释:
1.创建好这样一个分支就意味着开辟了一个新的空间,并将主分支master上的数据都拷贝到了这个分支上;
2.master 分支被 绿色标记 是因为当前所在分支为master;
2.3、切换分支 和 修改分支
语法如下:
//切换分支
git checkout 要切换到的分支名
先来看看当前分支是什么:
如果我们需要修改已经创建好的 hot-fix 分支上的内容,该如何操作?往下走
首先通过 git checkout 切换到hot-fix分支上:
这个时候就可以通过vim来修改当前分支上的文件(这里我已经创建好一个test.txt文件)。修改完后,通过 git status 可以观察test.txt文件被标红,说明已经在工作区被修改,如下:
这时候,如果你觉得这个分支修改的很好,那么你就可以通过 git add 添加到暂存区,最后通过 git commit 提交到本地库(注意,即使提交到本地库也不会影响到master分支),如下:
解释:
HEDA -> 这里指向hot-fix,以及后面的代码,表示当前在hot-fix分支下,提交到本地库了一个名为"hot-fix first commit"这样一个任务;
切换回master分支,再查看test.txt文件就会发现,文件的内容并没有被修改,那怎么做才能合并到master分支呢?往下看~
2.4、合并分支
git merge 要合并的分支名
通过这个操作,就可以将想要合并的分支合并到当前分支上~
2.4.1、正常合并
例如,将hot-fix分支合并到master分支上,那么你就需要先切换到master分支上,再如输入指令,如下:
为什么能正常合并呢?这是因为你在创建hot-fix分支以后,没有对master分支进行修改,若进行修改,并提交到本地库,则会冲突合并(下面会讲到);
2.4.2、合并冲突
怎么产生合并冲突?
经过上面的操作后,此时master分支和hot-fix分支的内容是一样的,这个时候,如果对master分支中的test.txt进行修改,并提交本地库,接着切换分支到hot-fix,对文件test.txt进行修改,并提交本地库,最后切换分支到master,合并hot-fix分支,这个时候就会产生冲突如下:
通过查看本地库状态可以看到如下:
如何解决冲突?
这里就显示有两个分支待修改,主机自然就不知道你要保存哪一个;所以想要她两合并,你需要手动修改,通过vim修改成最后你需要保存的数据,修改完后,提交到本地库即可;注意!提交的时候不能带文件名,否则会报错,如下:
三、创建分支和切换分支的底层原理
原本只有一条master分支:
现在又创建了一个hot-fix分支,并且还是从third的下创建的分支,并对该分支进行了修改:
这时,想要从master分支上切换到hot-fix分支上,本质就是修改head指针的指向:
解释:
master 和 hot-fix 都是指向具体版本记录的指针;当前所在分支是由HEAD决定的(HEAD指向哪一个分支,当前就在哪一个分支上),所以创建分支本质上就是创建指针;