Git-----Git中创建与合并分支

Posted gao_chun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git-----Git中创建与合并分支相关的知识,希望对你有一定的参考价值。

转载请注明gao_chun的Blog:http://blog.csdn.net/gao_chun/article/details/72499890

Git中创建与合并分支

为什么需要使用分支?

在总结Git中创建与合并分支前,我们必须要对为什么使用分支,它有什么用,为什么不能在主分支上直接干活,…. 等等一些列问题做一个阐述,不然我们都不知道用这个东西干嘛,以及为什么要用它。

这里从两点进行阐述:

一、分支的作用

分支的概念在各个版本控制系统中早已存在,分支对于团队协作开发来说作用是非常大的,如:

  • 当一个项目还是1.0版时,开发团队可能要同时进行1.1版和2.0版的开发,此时,代码就会出现较大分歧,这时就需要用到分支了,不同的任务组在各自不同的分支上开发,互相之间不会影响。

  • 需要向项目中添加一个新功能,一般的团队都不会直接在主分支上修改而是新建一个branch,在上面更改代码,这样做的好处一是保证主线代码的完整性和可用性,也就是说,主线上都是稳定的代码,可以直接拿来发布。二是避免出现其他问题。

  • 发布是所有的功能模块的集成,分支可能是零散功能的半成品。

  • 万一出现冲突很严重,或者出现各种情况而造成当前的分支出了问题,冲突解决起来很麻烦,如果有一个分支始终保留着最新的稳定版本,最多就是吧当前分支删掉,从那个稳定分支重新分一支出来,这样处理起来更方便。

  • 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的风险,又或者丢失向领导汇报工作进度的风险。有了分支后,你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

二、分支在Git上的特点

  • Git的技术可以说是非常强大,说一切开发都依赖于分支一点都不过分。一般项目的master分支都是稳定的代码,可以直接发布或者被项目之外的人使用。

  • 新特性和BUG修改都在不同的分支上进行开发和测试,这样规范了整个软件的开发流程。

  • 分支之间的互不影响这种特性可以增加团队合作的效率。

  • Git分支的另外一个重要特性就是可以合并不同软件仓库(fork)的分支。如:开发团队有一个主软件仓库,开发者可以fork这个仓库,相当于克隆了一个私有的软件仓库,然后开发者就可以在自己的软件仓库中建立分支并开发测试,测试完毕之后,可以向主软件仓库提交merge request,这样新开发的特性就会被合并到主软件仓库的某个分支中。这种特性极大地推动了开源项目,多年前参加开源项目都是神话,自从Git出现后,每个人都可能成为开源项目的贡献者,就是基于这种特性。

  • 其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,让人无法忍受,结果分支功能成了摆设,基本都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

三、创建与合并分支

在版本回退里中已经知道每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
如果没有创建过任何分支的情况下,Git中只有一个分支,叫主分支(即master分支)。

当我们创建新的分支,例如test时,Git新建了一个指针叫test,指向master相同的提交,再把HEAD指向test,就表示当前分支在test上。

  • 注:Git创建一个分支很快,因为除了增加一个test指针,改改HEAD的指向,工作区的文件都没有任何变化!

    假如我们在test上的工作完成了,就可以把test合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向test的当前提交,就完成了合并。

  • 注:Git合并分支也很快!就改改指针,工作区内容也不变!

    合并完分支后,也可以删除test分支。删除test分支就是把test指针给删掉,删掉后,就剩下了一条master分支了。

四、操作命令

  • 创建并切换分支 (git checkout -b test

    $ git checkout -b test
    Switched to a new branch ‘test’

    注:git checkout命令加上-b参数表示创建并切换,相当于执行了以下两条命令:

    $ git branch test

    $ git checkout test
    Switched to branch ‘test’

  • 查看当前分支 ( git branch
    然后,用git branch命令查看当前分支:

    $ git branch
    *test
    master

    git branch命令会列出所有分支,当前分支前面会标一个*号。此时,我们就可以在test分支上进行开发并正常提交。


  • 分支的切换 (git checkout master

    如果在test分支上完成了开发,我们可以切换回master分支:

    $ git checkout master
    Switched to branch ‘master’

    注:当切换回master分支后,其实内容是不会有任何改变的,因为你所做的修改和提交工作全部在test分支上完成,而master分支的提交点是没有任何改变的。


  • 分支合并 (git merge test

    我们试着把test分支下的工作成果合并到master主分支上:

    $ git merge test
    Updating d17efd8..fec145a
    Fast-forward
    ……. | 1 +
    …. file changed, 1 insertion(+)

    git merge 命令用于合并指定分支到当前分支。注意这里是切换到了master主分支,将指定分支test合并过来。合并后,可以发现master主分支的内容和test分支的最新提交是完全一样的。

    注:上面的Fast-forward信息是Git告诉我们,这次合并是“快进模式”,也就是直接把master指向test的当前提交,所以合并速度非常快,当然也不是每次合并都能Fast-forward,后续会总结其他方式的合并。


  • 删除分支 (git branch -d test

    合并完成后,若不再需要test分支,也可以放心的删除:

    $ git branch -d test
    Deleted branch test (was fec145a).

    删除后,再次运行 git branch 命令,可以看到只剩下master分支了。

    建议:因为创建、合并及删除分支都非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,其实这和直接在master分支上工作效果是一样的,但过程更安全。

五、总结

  • 查看分支:git branch

  • 创建分支:git branch <name>

  • 切换分支:git checkout <name>

  • 创建+切换分支:git checkout -b <name>

  • 合并某分支到当前分支:git merge <name>

  • 删除分支:git branch -d <name>

以上是关于Git-----Git中创建与合并分支的主要内容,如果未能解决你的问题,请参考以下文章

git 基础用法、分支、切换、合并等

GitGit 分支管理 ( 解决分支合并冲突 | 本地处理文件冲突 )

GitGit 分支管理 ( 解决分支合并冲突 | 本地处理文件冲突 )

SVN操作比较

GitGit 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )(代码片

GitGit 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )(代码片