在前面两盘文章中介绍了Git的基本原理,都是理论知识。这篇文章咱们再次回到实践中,看看Git分支(branch)的使用。git
在代码版本控制工具中,都会有branch的概念。刚开始创建版本仓库的时候,咱们只有一个主分支(master branch),咱们不可能把平常的新功能开发、代码优化以及bug修复等概念工做全都放在主分支上,这样会使主分支很难维护。这就是为何会有branch。app
在Git中,branch的建立很简单,咱们能够经过下面的命令建立一个"release-1.0"的branch。工具
而后经过"checkout"命令来切换branch。优化
在Git中,咱们能够经过"git checkout -b"命令来达到同时建立并切换branch的效果。spa
注意:你们必定还记得第二篇文章中咱们经过"checkout"命令来还原WorkSpace中的更新,在还原的命令中咱们使用的是"checkout --",若是没有"--"就表明切换branch。版本控制
根据前面两篇文章的知识,咱们进入".git/refs/heads"目录,发现有"HEAD"和"release-1.0"两个文件,而且两个文件包含的哈希值相同,根据"git log"能够知道这个哈希值表明master上最新的提交。因此,建立分支后咱们会获得下面的关系图,从值张图中能够看到,branch的切换对应HEAD引用值的改变。code
有了新的branch以后,咱们就能够分别在不一样的branch上工做了。假设咱们如今更新"app.py",而且在release-1.0 branch上面提交,从新查看对象关系图。对象
根据上面的对象图,能够分析出如下信息:blog
通过查看,"ref/heads/release-1.0"文件的内容确实是release-1.0 branch上最新的更新。而且,当咱们切换到master branch的时候,全部master上的东西都没有变化。开发
分支的删除比较简单,可使用"git branch -d"命令,为了避免影响后面的内容,这里演示新建、删除dev branch。
branch的建立是为了方便开发、修复bug以及保持master的稳定。可是最终branch上的内容仍是要合并到master的,接下来就看看分支的合并。
在Git中,能够经过"Git merge"来合并分支,继续前面的例子,咱们能够把"app.py"的更新merge到master branch上。
这时候,master的HEAD就被更新了,跟release-1.0内容一致了,这些就是merge命令作的事情。
在branch的合并中,不少时候咱们会遇到冲突,那么咱们就须要手动解决冲突,而后再提交了。
为了演示冲突合并,咱们回退master到上一次提交(必定还记得git reset吧),而后一样更新"app.py"提交到master。
经过上面能够看到,master和release-1.0上同时修改了"app.py",合并时引发了冲突。在Git中,会用"<<<<<<<","=======",">>>>>>>"标记出冲突区域,咱们须要根据这些符号找到全部的冲突并解决。
冲突解决以后,咱们经过"git log"来产看一些结果,可是此次咱们要给"git log"加一些参数。
同时,这里给出最新的对象关系图
在branch的使用过程当中,咱们还会常用到stash和diff操做,下面分别进行介绍。
在Git中,stash是个颇有用的命令,能够保存咱们作到一半的工做,能够理解成一个未完成工做的保存区。
假如咱们在release-1.0 branch作了一些更新,可是想作的事情尚未所有完成,不能提交,这是咱们又要切换到master branch,这是Git会禁止branch切换。
好比,例子中咱们从app.py中删除"div(16, 4)"。
这个时候咱们就须要使用stash来保存未完成的工做了。
若是须要继续前面的工做,咱们能够经过"git stash apply"来还原被保存的工做状态。
stash空间就像是一个栈空间,每次经过stash保存等内容都会被压入stash栈。命令不只仅是支持简单的list、apply操做,接下来咱们看看更多的stash命令。
相信你们都看到了stash的强大,下面咱们来看看stash的工做原理。在使用过stash保存以后,咱们会发现.git目录中出现了两个新文件".git/refs/stash"和".git/logs/refs/stash"。两个文件内容分别以下:
.git/refs/stash
dcac98e565864edc6f636b08660baebe2c97e7d2
.git/logs/refs/stash
0000000000000000000000000000000000000000 dcac98e565864edc6f636b08660baebe2c97e7d2 WilberTian <Wilber***com> 1420201804 +0800 WIP on release-1.0: ed17809 update app.py on release branch
根据咱们在对象关系模型那篇文章中学到的内容,咱们能够获得如下信息,因此能够看到,stash存放内容也是能够根据对象关系模型一点点找出来。
这里就不提供对象关系图了,比较复杂,有兴趣的同窗能够本身画一个看看各个对象之间的关系。
在前面的文章中咱们经过diff比较过同一个分支上的内容在WrokSpace、stage和repo中的差异。
一样diff能够支持分支之间的比较。
经过这篇文章介绍了分支的基本使用,同时介绍了一个很是有用的stash命令。
在使用Git进行代码控制中,分支是很容易建立的,因此也建议使用分支来进行开发新功能、bug修复。