Git的分支
Git 的默认分支就是 master。你所作的commit会在master分支上自动移动。 在多次提交操作之后,master分支指向最后那个commit object(提交对象链)。
Git 的 “master” 分支并特殊,跟其它分支没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它。
但很多时候听别人说master分支,往往有一种 这个分支是稳定、无bug的分支。而develop往往预示这新功能,不稳定的分支。这和分支策略有关,但本质上这两个分支没区别。
分支创建
创建一个名字为dev的分支:git branch dev
随后可以通过git branch来查看分支
* master表示我们现在处于master分支
如果要切换分支:git checkout dev
创建分支的同时转换到该分支:
git checkout -b dev2创建并且移动到dev2分支:
切换到最近上一次的分支:git checkout -
最近一次是dev所以我们会移动到dev分支:
此时我们在dev2分支创建文件A.txt:
此时查看状态:在工作区中
此时我们切换到dev和master分支也都是能看到的
我们提交到暂存区,其他分支也是可见的
但是当我们提交之后,其他分支就不可见了
此时dev分支和master下没有A.txt文件,dev2分支才有
分支删除
git branch -d 分支名字
首先不能删除自己所在的分支:
那我们移动到dev来删除dev2:
我们发现dev2发生了变化,此时它和master分支不是一样的,没有合并不能删除。如果要强制删除可以git branch -D dev2
dev分支没有发生变化是可以删除的:
如果我们确实要删除且不要强制删除怎么办?
我们就要合并分支
分支合并
我们要把dev2分支合并到master上
我们转换到master分支上使用命令:
git merge dev2
此时的master:
dev2:
两边相同了我们再删除dev2试试:
此时就可以删除了。
分支的本质
master指向的是提交
HEAD是指向当前的分支,当前在哪个分支就指向哪个分支
第二张图上我们可以看到创建了dev的分支,当我们切换到dev分支的时候HEAD就会指向dev
当我们进入.git文件夹查看HEAD的内容的时候可以看到,所处分支不同内部的文件指向就不同。
master分支
dev分支(新创建的):
git的分支与svn不同,svn是整体拷贝一份分支,git用的是指针。
如果dev发生修改提交,dev的版本就会向后移动。
在master分支上如果合并就会出现下面的图
分支冲突
我们在dev分支里面修改A.txt文件添加一行 update by dev后提交
我们在master分支里面修改A.txt文件同时添加一行 update by master后提交
我们在合并分支的时候出现了冲突:
如果我们采取dev分支(就是把除了update by dev和第一行的其他全删掉):
选择master:
这里的merge2是我重新做了一次merge操作演示的:
我们可以通过图形来查看冲突的提交日志。
git log --graph
如图所示,下面的圈是产生冲突,上面的圈是手动合并完解决冲突。