一、分支概述
分支管理为我们提供了多人同时开发的便利。假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
二、分支管理本质
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如创建新的分支名为testing时,Git就新建一个指针叫testing,指向master相同的提交。当我们切换分支时,再把HEAD指向testing,就表示当前分支在testing上:
切换到testing分支后,对工作区的修改和提交就是针对testing分支了,比如新提交一次后,testing指针往前移动一步,而master指针不变:
假如我们在testing上的工作完成了,而master分支的内容没有改变,就可以把testing合并到master上。就是切换回master分支后,直接把master指向testing的当前提交,就完成了合并:
另一种情况是当master分支和testing分支都各自有了新的提交,变成这样:
这种情况下当我们切换回master分支,进行合并时,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。当有冲突时就必须需要我们手动解决冲突后,再自行提交。提交成功后就类似以下这样:
三、分支操作的命令
1.创建分支
git branch [分支名]
创建一个新的名为hot_fix的分支:
另外还可以使用git checkout
或git switch
命令来创建并切换分支
git checkout -b [分支名]
git switch -c [分支名]
#上面的命令相当于以下两个命令:
git branch [分支名]
git checkout [分支名]
2.查看分支
git beanch -v
查看所有的分支,当前分支前面会标一个*
号,当前正处在master分支:
3.切换分支
git checkout [分支名]
#新版本的Git提供了git switch来切换分支,这个命令更容易理解。
git switch [分支名]
切换到hot_fix分支上:
4.合并分支
要合并分支,首先要切换到接受修改的分支上,再执行merge命令进行合并,命令如下:
git merge [分支名]
使用示例;
在test.txt文件中进行修改并提交,然后切换分支回到master中:
进行合并操作,然后查看文件内容:
5.解决冲突
合并后发生冲突的情况示例:
解决冲突:
此时我们必须手动解决冲突后提交,这里Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,首先需要确定如何修改后编辑文件,需要删除特殊符号和多余内容。
然后将文件提交到暂存区然后提交,这里的提交不能添加具体的文件名:
这样就解决了分支冲突的情况。
使用git log
加上相应参数来查看分支合并情况:
git log --graph --pretty=oneline --abbrev-commit
6.删除分支
删除分支的命令,如下:
git branch -d [分支名]
删除掉分支名hot_fix的分支:
四、总结
分支管理的相关命令:
- 查看分支:
git branch
- 创建分支:
git branch [分支名]
- 创建+切换分支:
git checkout -b [分支名]
或git switch -c [分支名]
- 切换分支:
git checkout [分支名]
或git switch [分支名]
- 合并某分支到当前分支:
git merge [分支名]
- 删除分支:
git branch -d [分支名]
参考:创建与合并分支