分支是Git的核心内容之中的一个,本章将介绍分支的一些知识,这里将继续使用前面创建的版本号库。

假设你跳过了前面章节直接进入本章。能够从Github上克隆这个版本号库:

$ git clone git://github.com/tswicegood/mysite-chp4.git

什么叫分支

我们为什么要使用分支? 1. 在项目功能任务较多的情况下,能够利用分支进行功能点的切分。2. 在团队协作的情况下,假设Git仅仅使用一条版本号演进的轨迹。那么这条轨迹中代码将可能很混乱,很多成员会上去实时的提交自己的代码,而自身的代码也与轨迹中的代码常常不一致,使用分支则能减少这样的混乱,成员仅仅有在自己已开发完毕自己的功能代码后。才会将代码合并到主分支。

     以下这些常见的情况,能够创建分支:
  • 试验性更改:比方想測试新算法,看看是否够快;或者为某个特别的模式重构部分代码。
  • 添加新功能:为每一个新功能的开发创建新分支,完毕该功能的开发后。就能够合并回主分支。这时就能够选用一般方法合并该分支上的全部的历史记录,或者将全部历史记录压合在一份提交中。

    关于不同的合并策略,后面会具体讲到。

  • Bug修复:无论是修复未公布代码中的Bug。还是修复已经标记公布代码中的Bug,都能够创建新分支来跟踪对该Bug的改动。


创建新分支

     与创建分支相关的有下面几个命令。
在当前分支上创建一个名为new的分支:
$ git branch new
查看当前版本号库中全部的分支:
$ git branch
    
 
通过git checkout命令能够切换当前分支:
$git checkout new

Git还对checkout命令提供-b參数,使其可以一步创建分支并切换。如:
$ git checkout -b alternate master
在主分支上创建一个名为alternate的分支,而且切换过去

合并分支间的改动

     加入新分支的一个主要作用就是开发新功能然后将分支合并(merge)到主分支上。基本的合并方法有以下三种:
  • 直接合并(straight merge):把两条分支上的历史轨迹合并,交汇到一起。
  • 压合合并(squashed commits):将一条分支上的若干个提交条目压合成一个提交条目,提交到还有一条分支的末梢。
  • 拣选合并(cherry-picking):拣选还有一条分支上的某个提交条目的修改带到当前分支上。
直接合并
     假设想把一条分支的所有历史提交合并到还有一条分支上,能够採取这样的方式。
     以下将通过在刚创建的alternate分支上加入一些新改动来介绍这样的合并方法。请加入一个名为about.html的新文件,并加入一些介绍信息。
     创建好新文件后,请将它加入到暂存区并提交到版本号库中:
$ git add about.html
$ git commit -m "add the skeleton of an about page"

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVHJveV9f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

     如今就在alternate分支下包括一个提交,且该提交并不存在于主分支上,能够使用git merge命令将两条分支合并起来。

     首先。切换到合并操作的目标分支。

在这里是主分支。

$ git checkout master
     然后就能够使用git merger命令了,使用git merge命令最简答的形式,仅仅须要指定想合并到当前分支的源分支名称:
$ git merge alternate


压合合并
     压合指的是Git将一条分支上的全部历史提交压合成一个提交。提交到还有一条分支上。要小心使用压合提交,由于大多数情况下,每一个提交都应该作为一个单独的条目存在于历史记录中。假设某条分支上的全部提交都密切相关,应随后作为一个总体记录(在父分支上)时,适合做压合提交。

     当想开发一些试验性的新功能或修复bug时,这样的合并就非常实用,由于此时所须要的并非(长期)记录和跟踪每一个试验性的提交,仅仅是最后的结果。

     以下演示压合合并,先在主分支上创建一条名为contact的分支并检出:
$ git checkout -b contact master
     在这个分支下创建一个文件,并改动两次,来提交两次。这样在contact中就有两次提交记录了。然后就能够将这两个提交压合成主分支上的一个提交,首先,切回到主分支上:
$ git checkout master
     然后调用git merge并给它传送參数--squash。參数--squash告诉git merge命令,将还有一条分支上的所有提交压合成当前分支上的一个提交:
$ git merge --squash contact

     此时。在contact分支上的两个提交已经合并到当前工作区并缓存,但还没有作为一个提交,提交到版本号库。请执行git status命令查看当前状态:

     像其它"正常"提交一样,如今把这些修改提交到版本号库中。


拣选合并
     有时分支间仅仅须要合并一个或者多个提交。而不须要合并一条分支上的所有修改,由于该分支上可能含有尚未完毕的新功能,或者包括其它一些尚不能合并的修改。
     以下依旧使用contact分支进行演示。

首先导出到contact分支下。

$ git checkout contact
     然后在contact.html文件里改动内容,并提交。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVHJveV9f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

     使用提交名称ff3e3eb能够随时对它进行拣选操作。请注意,提交操作具有全局唯一性特性,因此实际操作中的提交名称与本例中的名称不一样。

以下将它拣选合并到主分支上:


     假设仅仅对一个提交进行拣选。那么合并后将直接commit到主分支上,不会经过缓存区。
     要拣选多个提交,须要给git cherry-pick命令传递參数-n。

这就告诉Git在创建提交前须要连续进行合并操作。以下介绍详细步骤。

     首先,使用git reset命令恢复前面的改动。

后面会具体讲到该命令。


     如今删除了(主干末梢上的)最后一个提交,再次使用git cherry-pick命令。并带-n參数。 执行git status命令能够
看到,修改已被暂存。等待提交。

     接着能够进行下一个拣选操作。一旦拣选完须要的各个提交,就能够一并提交修改。并加入随意的提交留言。


冲突解决

     假设在两条分支上编辑同一文件。做不同的改动,然后合并这两条分支。通常情况下Git会成功自己主动合并。但不总是这样。
     Git不能自己主动合并时,称之为冲突(conflict)

冲突总是发生在对不同分支上的同一文件的同一文本块以不同的方式改动,并试图合并的时候。以下演示怎样处理冲突。

     首先。创建名为about的新分支:
$ git checkout -b about master
     然后在about.html中加入几行你最喜欢的编程语言。保存文件并提交到版本号库中。

     接着再创建一条名为about2的分支。但先不要切换到该分支:
$ git branch about2 about
     切换分支前,请在about.html文件里加入一行介绍你喜欢的编程语言,然后提交改动:

     然后切换到分支about2。再在about.html文件里刚刚改动过的同一行位置加入不同的内容。

然后保存并提交改动。

     如今已经埋下了潜在的冲突。如今我们来展示冲突。
     先切换回about分支。然后将about2分支合并到about分支上:

     请注意命令输出中CONFLICT那一行,它表示about.html文件里有冲突。

     about.html文件里的内容是这种:

     <<<<<和>>>>>>代表两部分内容。

第一,<<<<<<<后面尾随的是当前分支中的代码。而>>>>>>之前的则是还有一条分支上的代码;第二。在<<<<<<和>>>>>>行文件名称之前。是所在分支的名称。本例中是HEAD,请记住,HEAD指向当前分支末梢的那个提交。它和about2分支有冲突。

     对于简单的合并,仅仅须要手动编辑并解决冲突就可以。然后保存改动,暂存并提交。就像"正常"提交一样。

     在冲突状态中。能够使用$ git mergetool来启动一个合并工具(假设当前系统中有合并工具的话)。

删除分支

     将代码合并回当前分支后,就能够使用带參数-d的git branch命令删除旧分支了,比如删除上面创建的about2分支:
$ git branch -d about2
     其实,假设已经打了标签,Git删除该分支时,从版本号树起始到此标签间的所有历史轨迹均会保留,这时删除分支操作仅仅是删除分支本身的名称。

     仅仅有当要删除的分支已经成功合并到当前分支时,使用-d參数删除分支的操作才会成功。假设须要强制删除一个分支,就得将-d换为-D。
     

分支重命名

     git branch -m能够改动分支名,如
$ git branch -m contact contacts
     參数-m不会覆盖已有分支名称。所以新分支名称必须是唯一的,否则Git会提示出错信息。

将參数-m改为-M,就能够覆盖已有分支名称了。大写"M"通知Git,假设当前的分支名称已经存在。则强制覆盖现有分支。这样的操作要小心使用。



Git(四):理解和使用分支的更多相关文章

  1. git 四个基本对象、分支、三个存储区、reset-revert-变基、cherry-pick

    1:git四个基本对象     2:工作区.缓存去.历史区   3:Git 分支介绍 https://blog.csdn.net/wh_19910525/article/details/7470964 ...

  2. Git(四):Git远程操作详解

    转: http://www.ruanyifeng.com/blog/2014/06/git_remote.html Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  3. 对git的理解及常用指令

    以前总听说git[分布式版本控制系统]自己愣是搞不懂它到底要干哈-什么叫版本控制系统根本理解不了.现在工作需要必须要用到,结果好像就突然懂了git是干什么滴. 所以!原理这个东西的理解是要建立在大量的 ...

  4. 《Pro Git》笔记3:分支基本操作

    <Pro Git>笔记3:Git分支基本操作 分支使多线开发和合并非常容易.Git的分支就是一个指向提交对象的可变指针,极其轻量.Git的默认分支为master. 1.Git数据存储结构和 ...

  5. git学习整理(1)git clone 理解

    1.git clone 的理解 git clone默认会把远程仓库整个给clone下来 ,只能clone远程库的master分支并在本地默认创建一个master分支 ,无法clone所有分支,若想要其 ...

  6. Git 学习(六)分支管理

    Git 学习(六)分支管理 几乎每一种版本控制系统都支持分支.使用分支意味着你可以从开发主线上分离开来,然后不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录 ...

  7. Git中从远程的分支获取最新的版本到本地方式

    Git中从远程的分支获取最新的版本到本地方式如下, 如何更新下载到代码到本地,请参阅ice的博客基于Github参与eoe的开源项目指南 方式一 . 查看远程仓库 $ git remote -v eo ...

  8. Git学习教程三之分支管理

    实战流程: 1:代码库克隆一份至本地 2:新分支操作 2.1  在需要的文件中创建并指向新的分支方便写代码  git checkout -b <name>                2 ...

  9. 【Git的基本操作六】分支管理

    分支管理 1. 什么是分支? 在版本控制过程中,使用对条线同时推进多个任务. 2. 分支的好处 同时并行推进多个功能开发,提高开发效率 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任 ...

随机推荐

  1. 转化一个数字数组为function数组(每个function都弹出相应的数字)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第2题 - 转化一个数字数组为function数组(每个function都弹出相应的数字) 此题关键点: 1.如何将一个匿名函数存入数组? 2.如何锁住需要 ...

  2. HDU 6268 Master of Subgraph (2017 CCPC 杭州 E题,树分治 + 树上背包)

    题目链接  2017 CCPC Hangzhou  Problem E 题意  给定一棵树,每个点有一个权值,现在我们可以选一些连通的点,并且把这点选出来的点的权值相加,得到一个和. 求$[1, m] ...

  3. ACM入门指南

    本文已经转移到了:http://harryguo.me/2015/11/03/ACM-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/ 什么是ACM? 想必打开这篇博客的人已 ...

  4. ARC 098 D - Xor Sum 2

    Problem Statement There is an integer sequence A of length N. Find the number of the pairs of intege ...

  5. Codeforces 920 E Connected Components?

    Discription You are given an undirected graph consisting of n vertices and  edges. Instead of giving ...

  6. [POI2014]Criminals

    题目大意: 给你一个长度为$n(n\le10^6)$的颜色序列,其中每个颜色互不相同.两个人$A$和$B$分别从某个点出发从左往右.从右往左任意地选择颜色,然后在中间的某一点相遇.分别给出两人所选择的 ...

  7. Ubuntu 16.04将ISO镜像写入U盘

    sudo fdisk -l 查看U盘的路径,如/dev/sdc为U盘的位置,注意位置!注意这个不是挂载的位置. 然后准备好ISO文件,如放在/home/jim/abc.iso 然后输入 sudo dd ...

  8. sql查询,如果有更新时间则按更新时间倒序,没有则按创建时间倒序排列

    原文:sql查询,如果有更新时间则按更新时间倒序,没有则按创建时间倒序排列 ORDER BY IFNULL(update_time,create_time) DESC IFNULL(expr1,exp ...

  9. ZoomControls控件是一个可以缩放控件,可以实现两个按钮控制图片的大小

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  10. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...