Git分支管理

Svn中也有分支管理,但是很low,Git的分支管理非常强大,本文先不去说分支管理内部到底怎么做的,我们先来看看Git中最基本的分支管理操作。

本文是Git系列的第四篇,了解前面的文章有助于更好的理解本文。


分支的必要性

小伙伴们都知道,我们在完成一个项目时,不可能是“单线程”开发的,很多时候任务是并行的,举个栗子:项目2.0版本上线了,现在要着手开发3.0版本,同时2.0版本可能还有一些bug需要修复,这些bug修复之后我们可能还会发2.1,2.2,2.3这些版本,我们不可能等所有bug都修复完了再去开发3.0版本,修复2.0的bug和开发3.0的新功能是两个并行的任务,这个时候我们3.0的功能开发直接在master分支上进行肯定不合适,我们要保证有一个稳定,可以随时发版本的分支存在(一般情况下这个角色由master分支来扮演),此时我们就可以灵活的使用Git中的分支管理功能:

1.创建一个长期分支用来开发3.0功能,假设这个分支的名字就叫v3,我们在v3上添加新功能,并不断测试,当v3稳定后,将v3合并到master分支上。 2.创建一个特性分支用来修复2.0的bug,一旦bug修复成功,就将该分支合并到master上,一旦发现新bug,就立马再创建分支进行修复,修复成功之后再合并。

以上两个步骤同步进行,这在Svn中简直是不可想象的,因为Svn的分支管理太low,而Git能够让我们做到随心所欲的创建、合并和删除分支。

查看分支

我们可以通过git branch命令来查看当前仓库有哪些分支,而我们处于哪一个分支中,如下:

这里显示当前仓库只有一个master分支,这是git默认创建出来的,master前面的*表示我们当前处于这一个分支中。

分支创建和切换

我们可以利用git branch <分支名>命令来创建一个分支,然后利用git checkout <分支名>来切换分支,如下:

如果小伙伴觉得这样太麻烦,可以通过git checkout -b <分支名>来一步到位,创建并切换分支,如下:

也可以通过git checkout -命令来切换回上一个分支,如下:

分支合并

现在我切换到fa分支中,由于fa分支是从master分支中创建出来的,所以此时fa分支的内容和master分支的内容是一致的,然后我在fa分支中向git01.txt文件添加一行内容并提交,此时fa分支中的git01.txt和master分支中git01.txt的内容就不相同了,具体操作如下:

上图展示了此时master分支和fa分支的不同,现在我通过git merge --no-ff <分支名>命令将fa分支合并到master分支上。其中—no-ff表示强行关闭fast-forward方式,fast-forward方式表示当条件允许时,git直接把HEAD指针指向合并分支的头,完成合并,这种方式合并速度快,但是在整个过程中没有创建commit,所以如果当我们删除掉这个分支时就再也找不回来了,因此在这里我们将之关闭。

想要合并分支,我们先切换到master分支上,然后执行git merge --no-ff fa命令即可完成分支合并,如下图:

合并成功后,我们看到master分支上的git01.txt上已经有了fa分支中的内容了。

以图表方式查看分支

我们可以通过git log --graph命令来直观的查看分支的创建和合并等操作,如下图:

分支衍合

所谓的分支衍合其实也是分支合并的一种方式,下面我们就来看看这个分支衍合到底是什么样的。现在我的master分支的内容和fa分支的内容是保持一致的,fa是从master中创建出来的,如下图:

现在我向fa和master中各自做一次提交,如下图:

此时我们执行如下两条命令将两个分支合并:

$ git checkout fa
$ git rebase master

rebase命令在执行的过程中会首先把fa中的每个commit取消,并且将之保存为临时patch,再将fa分支更新为最新的master分支,然后再把那些临时的patch应用到fa上,此时fa分支将指向新创建的commit上,那些老的commit将会被丢弃,这些被丢弃的commit在执行git gc命令时会被删除。合并后的分支如下图:

上面的git rebase master命令在执行的过程中有可能会发生冲突,发生冲突时我们有两种方案,一种直接退回到之前的状态,另一种就是解决冲突继续提交。

退回到之前的状态

我们可以通过如下命令来回到之前的状态:

$ git rebase --abort

解决冲突

不过大多数情况下我们都是要解决冲突的,解决之后继续提交。此时我们用编辑器打开冲突的文件,看到的内容可能是这样的:

======上面的是HEAD中的内容,下面的是要合并的内容,根据自己的需求编辑文件,编辑完成之后,通过如下两条命令继续完成合并:

$ git add git01.txt
$ git rebase --continue

如下图:

冲突解决

我们前面提到了在分支衍合时出现冲突的解决方案,其实普通的合并也有可能出冲突,出现冲突很正常,解决就是了,git merge合并分支时如果出现冲突还是先重新编辑冲突文件,编辑完成之后,再执行git add 和git commit即可。

好了,分支管理我们就先说这么多,有问题欢迎留言讨论。

参考资料:

1.《GitHub入门与实践》 2.《Pro Git》

本文分享自微信公众号 - 玩转JavaEE(gh_d1ca11234a30),作者:悟空

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Git工作区储藏兼谈分支管理中的一个小问题

    这是一篇计划之外的文章,之所以有这篇文章,是因为有一个小伙伴在阅读Git分支管理一文时遇到了一个问题,而这个问题又比较典型,因此我想专门来谈谈Git中工作区的储...

    江南一点雨
  • 团队开发中 Git 最佳实践,不给队友拖后腿!

    本文要从具体实践角度,尤其是在团队协作中,阐述如何去好好地应用 Git。既然是讲在团队中的应用实践,我就尽可能地结合实际场景来讲述。

    江南一点雨
  • SpringBoot+SpringSecurity处理Ajax登录请求

    最近在项目中遇到了这样一个问题:前后端分离,前端用Vue来做,所有的数据请求都使用vue-resource,没有使用表单,因此数据交互都是使用JSON,后台使用...

    江南一点雨
  • git删除本地分支

    远端master分支有更新需要拉取至本地,但是代码有些地方做了修改导致了小冲突,但是这些修改又是无关紧要的,于是就打算直接删除掉本地分支再重新拉取master分...

    我是十三
  • Git 使用详解

    本文列举了 Git 的常用配置及使用方法。 配置 查看配置 $ git config -l 或者直接编辑 ~/.gitconfig 文件,但不推荐。 代理设置 ...

    康怀帅
  • Git基础知识(七)--分支开发工作流

    大型项目中,通过类似的方式使分支具有不同级别的稳定性。当它们具有一定程度的稳定性后,再把它们合入更高级别的稳定性分支中。使用多个长期分支的方法并非必要,但是当你...

    zx钟
  • 蹊跷的成都机场无人机“黑飞”,这浑水越看越深

    允中 发自 六环外 量子位 报道 | 公众号 QbitAI ? 又双叒叕,成都仍未平静。昨天下午6点多,成都双流机场再次发生无人机干扰民航飞行事件,共造成10个...

    量子位
  • 无人机、无人车与机器人,未来谁更适合当快递员?

    镁客网
  • Git分支管理策略

    如果你严肃对待编程,就必定会使用"版本管理系统"(Version Control System)。 眼下最流行的"版本管理系统",非Git莫属。 ? 相比同类软...

    ruanyf
  • git 从本地添加到远程仓库

    2.关联一个远程库–>git remote origin git@******/mush.git

    Java架构师历程

扫码关注云+社区

领取腾讯云代金券