Git分支管理

 

理解分支

本章开始介绍Git的杀手功能之一:分支。分支就像一种平行宇宙发生的事情,你在学习C++知识的时候,另一个世界的你可能在偷摸学JAVA。

如果两个平行宇宙互不干扰,那么对于你当然没有影响,但如果哪天你们要合体了了的话,你就又学会了 C++和JAVA

Git分支管理_第1张图片

在版本的回退里,每次提交,Git都把他们穿成一条时间线,这条时间线就可以理解为是一个分支。截止到目前,在Git中,这个分支叫主分支,也是master

再来理解⼀下HEAD,HEAD?严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD?指向的就是当前分⽀

 Git分支管理_第2张图片

每次提交,master就会向前移动一步,这样随着不断提交,master分支的线就越来越长,而HEAD只要一直指向master分支即可指向当前分支 

 


创建分支

Git允许我们查看或创建其他分支,在这里我们来创建一个自己的分支dev:

  • 查看当前本地所有分支 git branch
  • 新建分支 git branch [分支名] 

Git分支管理_第3张图片

当我们创建新的分⽀后,Git?新建了⼀个指针叫?dev, * 表⽰当前 HEAD 指向的分⽀是 master 分
⽀。另外,可以通过⽬录结构发现,新的 dev 分⽀: 

Git分支管理_第4张图片

目前dev和master指向同一个修改。 

一张图总结:

 Git分支管理_第5张图片

切换分支: 

 那如何切换到dev分⽀下进⾏开发呢?使⽤? git checkout ?命令即可完成切换,⽰例如下:

git checkout dev

 

此时提交线为:

Git分支管理_第6张图片

 git branch显示我们在dev分支下工作:

此时我们在dev分支下创建一个文件newfile 并add 和 commit 一下:

Git分支管理_第7张图片 

但当我们切回master分支后,这个文件竟然离奇消失了~~

 

 在dev分支上创建的内容,竟然在master分支上看不到。为什么会出现这个现象?

我们来看一下master分支的指向,发现两者指向不一样的~~

很明显这时候dev和master指向的并不是同一个版本了,此时的状态如下图:

Git分支管理_第8张图片

当我们切换到master分支的时候,HEAD就指向了master,那就看不到提交了!!


合并分支 

为了能够在master主分支上能看到新的提交,就需要将dev分支合并到master分支

  • git merge dev 合并dev分支 

 要合并dev分支首先我们就不能在dev分支上:先git checkout master上后merge

Git分支管理_第9张图片

Git分支管理_第10张图片

此时我们就能在master分支上看到newfile了

git merge用于合并指定分支到当前分支。合并后,master就能看到dev分支提交的内容了。此时的状态如下图:

Git分支管理_第11张图片 


删除分支 

合并完成后,dev分支对我们说就没有作用了,那么dev分支就可以被删除掉,注意如果当前处于某分支下就不能删除当前分支,即不能删除当前所在分支:

  • git branch -d dev 

 就能够完成对dev分支的删除,值得说的是,如果想要删除的分支已经提交过且尚未合并,那么git会认为当前分支对你有作用,上面的删除方式是不行的

  • git branch -D dev 

 这个即是强制删除分支,尽管他已经commit过且尚未merge

Git分支管理_第12张图片 

 

合并冲突: 

在实际分支合并的时候,并不是想合并就合并成功的,大概率会遇到代码冲突问题:例如上面的平行宇宙例子:宇宙a中你认为最好吃的是汉堡,宇宙b中的你认为可乐是最好的,那么你们合并的时候就会对“最好吃的事物”产生冲突,此时就需要手动处理一下~~

为了演⽰这问题,创建⼀个新的分⽀? dev1 ,并切换⾄⽬标分⽀,我们可以使⽤? git checkout -
b dev1 ⼀步完成创建并切换的动作,⽰例如下:

 对dev1修改ReadMe文件:

Git分支管理_第13张图片

对master修改ReadMe文件:

 Git分支管理_第14张图片

此时的提交图;

 Git分支管理_第15张图片

这种情况下,Git?只能试图把各⾃的修改合并起来,但这种合并就可能会有冲突,如下所⽰ 

 

此时的ReadMe文件变成这样:

 Git分支管理_第16张图片

此时我们必须要⼿动调整冲突代码,并需要再次提交修正后的结果!!(再次提交很重要,切勿忘
记)

 

Git分支管理_第17张图片 

Git分支管理_第18张图片 

git log也可以看分支的合并情况,具体可以搜索git log的用法:

  • git log --graph --pretty=oneline --abbrev-commit 

Git分支管理_第19张图片 

最后别忘记删除一下dev1 分支:git branch -d dev1


分支管理策略 

通常合并分⽀时,如果可能,Git?会采⽤ Fast forward 模式。还记得如果我们采⽤ Fast
forward 模式之后,形成的合并结果是什么呢? 

 在Fast forword 模式下,删除分支后,查看分支历史的时候,会丢掉分支信息,看不出来最新的提交到底是merge进来的还是正常提交的

但在合并冲突部分,我们也看到通过解决冲突问题,会再进⾏⼀次新的提交,得到的最终状态为: 

 Git分支管理_第20张图片

这就不是Fast forward模式了,这样的好处是,从历史上就能看出分支信息。例如我们现在已经删除了在合并冲突部分创建的 dev1 分⽀,但依旧能看到?master?其实是由其他分⽀合并

Git分支管理_第21张图片

Git支持我们禁用Fast forward模式,那么就会在merge时生成一个新的commit,这样从分支历史上就能看到历史的分支信息

  • --no-ff方式的git merge 

 即在merge的时候加上--no-ff ,这里的ff就是Fast forward的缩写

  • git merge --no-ff -m "xxx" [dev.name]  

 这样就可以在合并的时候禁用Fast forward

 分支策略:

 在实际开发中,我们应该按照⼏个基本原则进⾏分⽀管理:

  • master分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活

干活都在dev分⽀上,也就是说,dev分⽀是不稳定的,到某个时候,⽐如1.0版本发布时,再把dev分⽀合并到master上,在master分⽀发布1.0版本

团队合作的时候就像下面这样:

Git分支管理_第22张图片 

BUG分支: 

假如我们现在正在? dev2 ?分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有?bug,需要解决。在Git中,每个?bug?都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。
可现在? dev2 ?的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?

Git提供了一个git stash 的命令,即在当前工作区写的东西还不够提交的时候,可以使用这个指令将当前工作区信息进行储藏, 被储藏的内容可以在将来某个时间恢复出来

  • git stash 保存现场
  • git stash pop 恢复现场,并删除stash内容(一般用这个就行,stash内容一般不会再恢复一次)
  • git stash apply 恢复现场
  • git stash drop 删除stach内容

也可以用恢复指定的stash,用git stash list查看 , 用那个git stash apply stash@{0} 指定恢复

此时就可以创建一个fix_bug分支修改bug后合并到master上,最后再删除fix_bug:具体操作方法和上面一样,唯一要注意的一点是,在上面我们说了master只能发布稳定版本,所以如果要merge到master上的代码绝对不能有问题。 

Git分支管理_第23张图片

解决这个问题的⼀个好的建议就是:最好在⾃⼰的分⽀上合并下 master ,再让 master 去合并
dev ,这样做的⽬的是有冲突可以在本地分⽀解决并进⾏测试,⽽不影响 master 。此时的状态
Git分支管理_第24张图片

解决完冲突再合并:

 Git分支管理_第25张图片

 

小结:

分支在实际当中有什么用呢?比如你要开发一个新功能,但是需要一星期完成,前两天你写了一半的代码,如果立刻提交,由于代码没写完,不完整的代码库会导致别人都干不了活了。如果等代码全部写完再一次提交会有丢失进度的风险。

有了分支你就不用怕,在自己的分支干活,别人看不到,也不影响别人,你在自己的分支想提交就提交,想回退就回退,直到开发完成后再一次性合并进去即可,这样又安全又不影响其他人工作 

你可能感兴趣的:(Git,git,分支管理,分支策略)