Git Step by Step – (5) Git分支(branch)

在前面两盘文章中介绍了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上最新的更新
  • release-1.0 branch上面的更新不会体如今master branch

通过查看,"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相关操做

在branch的使用过程当中,咱们还会常用到stash和diff操做,下面分别进行介绍。

stash

在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命令。

  1. git stash save:能够经过自定义的信息来描述一个stash

  2. git stash apply stash@{n}:经过这个命令,咱们能够选择stash栈中的stash,从而恢复到特定的状态;"git stash apply"使用栈顶来还原WorkSpace。
  3. git stash pop:就像"git stash apply"使用栈顶来还原WorkSpace,可是同时会从stash栈中删除当前的栈顶stash。

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存放内容也是能够根据对象关系模型一点点找出来。

这里就不提供对象关系图了,比较复杂,有兴趣的同窗能够本身画一个看看各个对象之间的关系。

 

branch之间的diff

在前面的文章中咱们经过diff比较过同一个分支上的内容在WrokSpace、stage和repo中的差异。

一样diff能够支持分支之间的比较。

  • git diff branchName:把当前branch跟branchName进行比较,也可使用"git diff branchNameA branchNameB"
  • git diff branchName -- fileName:比较两个branch的fileName文件差别

 

总结

经过这篇文章介绍了分支的基本使用,同时介绍了一个很是有用的stash命令。

在使用Git进行代码控制中,分支是很容易建立的,因此也建议使用分支来进行开发新功能、bug修复。

相关文章
相关标签/搜索