理解分支
分支管理是git的一个核心功能。在git中,分支是用来独立开发于某个功能或者修复某个bug的一种方式。就像是《火影忍者》中的鸣人使用分身去妙蛙山修炼,最后还能将所有的修炼经验返还给本体一样。git支持分支的同时,也支持将这些分支合并到master上了。
分支的本质
每一个分支都有一个指针指向最新的提交,就好比我们的master指向的就是主分支的最新提交。而HEAD
指针指向的就是当前的工作分支。切换HEAD
的指向,就相当于在切换分支。
主分支
Git 默认创建的第一个分支是 master 分支(或 main 分支)。它通常被认为是主要开发线的起点。所以我们说的主分支一般都是指master分支。
创建分支
考虑使用以下指令创建分支
git branch newbranch
创建一个名为newbranch
的新分支
直接使用git branch
可以查看当前分支:
查看.git/HEAD
文件内容就能直到当前HEAD指向哪一个分支:
切换分支
使用git checkout
指令切换当前分支,即切换HEAD指向的分支:
当我们成功切换分支之后,所有的提交都是在新的分支上。
注意,在新的分支上的提交是不会干扰master分支的,且也看不到后续master分支的提交信息----“你走你的,我走我的“
合并分支
当我们试图将分支上的提交重新整合到master,即需要合并某个分支时,考虑git merge指令(切换到master分支执行):
git merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master就能看到dev分⽀提交的内容了
fast-forward模式
fast-forward模式是分支合并时的一种简单情况,通常用于将一个分支的更改合并到另一个分支时。“Fast-forward” 合并的优点是简单快速,因为它只是移动指针而不需要额外的合并步骤。但它也有一个缺点,即不会保留合并操作的历史信息,因为合并操作并没有实际发生。
删除分支
考虑以下指令git branch -d dev
dev为要删除的分支:
注意如果现在就在dev分支下是不能删除dev分支的,需要先切换分支。
通常来说,我们一般合并完某个分支之后,会将这个分支删除。就像是创建子进程去完成任务回来之后,也就不需要它了。
合并冲突问题
分支合并并非每次都能成功,有的时候会发生合并冲突的问题。这种冲突一般是两个分支对同一个文件的同一个部分进行了修改,当要合并的时候git无法确定合并这些修改。
比如我们现在master分支下有一个readme文件,该文件内容为:
接下来我们创建一个dev分支,在master分支和dev分支中同时修改readme文件中的第二行内容并提交到版本库中。
master分支下:
master分支下:
接下来合并:
提示合并冲突,因为这时候两个分支对同一文件的同一行内容做出修改,git不知道该怎么合并。且readme文件会保留冲突信息,Git会⽤<<<<<<<,=======,>>>>>>>来标记出不同分⽀的冲突内容,如下所⽰:
这个时候只能手动编辑冲突的文件,将冲突的部分修改为满足需求的版本。可以将某个分支的修改删除,保留另一个。或者结合一下两者的修改。
解决冲突:
一定要提交修正后的结果
另外,用指令git log --graph --pretty=oneline --abbrev-commit
可以较为形象的看到分支的合并情况: