Git 分支管理和冲突解决

 

Git 分支管理和冲突解决

 

建立分支

  git branchhtml

  没有参数,显示本地版本库中全部的本地分支名称。git

  当前检出分支的前面会有星号。工具

  git branch newnamespa

  在当前检出分支上新建分支,名叫newname。版本控制

  git checkout newname指针

  检出分支,即切换到名叫newname的分支。code

  git checkout –b newname masterhtm

  这个命令将上面两个命令合并:在master分支上建立分支newname分支并检出到该分支。blog

 

合并分支间的修改 Merge

  合并操做将两条或多条分支合并到一块儿,实际上有好几种分支合并方法,下面介绍主要的三种:get

  1.直接合并(straight merge)

  把两条分支上的历史轨迹合并,交汇到一块儿。

  好比要把dev分支上的全部东东合并到master分支:

  首先先到master分支:git checkout master

  而后把dev给合并过来:git merge dev

  注意没参数的状况下merge是fast-forward的,即Git将master分支的指针直接移到dev的最前方。

  换句话说,若是顺着一个分支走下去能够到达另外一个分支的话,那么Git在合并二者时,只会简单移动指针,因此这种合并成为快进式(Fast-forward)

 

  2.压合合并(squashed commits):

  将一条分支上的若干个提交条目压合成一个提交条目,提交到另外一条分支的末梢。

  把dev分支上的全部提交压合成主分支上的一个提交,即压合提交:

  git checkout master

  git merge --squash dev

  此时,dev上的全部提交已经合并到当前工做区并暂存,但尚未做为一个提交,能够像其余提交同样,把这个改动提交到版本库中:

  git commit –m “something from dev”

  

  3.拣选合并(cherry-picking):

  拣选另外一条分支上的某个提交条目的改动带到当前分支上。

  每一次提交都会产生一个全局惟一的提交名称,利用这个名称就能够进行拣选提交。

  好比在dev上的某个提交叫:321d76f

  把它合并到master中:

  git checkout master

  git cherry-pick 321d76f

  要拣选多个提交,能够给git cherry-pick命令传递-n选项,好比:

  git cherry-pick –n 321d76f

  这样在拣选了这个改动以后,进行暂存而不当即提交,接着能够进行下一个拣选操做,一旦拣选完须要的各个提交,就能够一并提交。

 

冲突处理

  当两条分支对同一个文件的同一个文本块进行了不一样的修改,并试图合并时,Git不能自动合并的,称之为冲突(conflict)。解决冲突须要人工处理。

  好比当前在master分支,想把dev分支merge过来,结果产生了一个冲突,打开文件内容能够看到这么一个冲突:

<<<<<<< HEAD

test in master

=======

test in dev

>>>>>>> dev

  

  <<<<<<<标记冲突开始,后面跟的是当前分支中的内容。

  HEAD指向当前分支末梢的提交。

  =======以后,>>>>>>>以前是要merge过来的另外一条分支上的代码。

  >>>>>>>以后的dev是该分支的名字。

  对于简单的合并,手工编辑,而后去掉这些标记,最后像往常的提交同样先add再commit便可。

 

删除分支

  有些分支没有必要长期保存,好比分支中的代码已经打了标签并已发布,或者实验分支已经成功完成工做或中途废弃等等。 

  注意:打了标签的分支,Git在删除该分支时,从版本树起始到此标签间的所有历史轨迹均会保留,此时删除分支操做只是删除分支自己的名称,所以能够说该分支没有必要长期保存。

  而在其余版本控制工具中,删除分支一般意味着删除分支上的全部历史轨迹,因此不能由于打了标签就认为其没有必要保存。

 

  删除一个分支dev2:

  git branch –d dev2

  注意不能删除当前所在分支,须要转到别的分支上。

  若是要删除的分支已经成功合并到当前分支,删除分支的操做会直接成功。

  若是要删除的分支没有合并到当前所在分支,则会出现提示,若是肯定无须合并而要直接删除,则执行命令:

  git branch –D dev2

  进行强删。

 

分支重命名

  重命名分支:

  git branch –m oldname newname

  -m不会覆盖已有分支名称,即若是名为newname的分支已经存在,则会提示已经存在了。

  若是改为-M就能够覆盖已有分支名称了,即会强制覆盖名为newname的分支,这种操做要谨慎。

 

参考资料

  《版本控制之道——使用Git》(Pragmatic Version Control Using Git)

  Git分支管理策略:http://www.ruanyifeng.com/blog/2012/07/git.html

  Git Reference: http://gitref.org/

相关文章
相关标签/搜索