Git(四):理解和使用分支

     分支是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"

     如今就在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文件里改动内容,并提交。

     使用提交名称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,假设当前的分支名称已经存在。则强制覆盖现有分支。这样的操作要小心使用。




原文地址:https://www.cnblogs.com/slgkaifa/p/6824828.html