分支( branches ) 是指在开发主线中分离出来,做进一步开发而不影响到原来主线。

Git 存储的不是一系列的更改集( changeset ),而是一系列快照。当你执行一次 commit 时, Git 存储一个 commit 对象,它包含一个指针指向你当前需要提交的内容的快照。

Git 中的 master 分支的功能,和其他分支一样。master 在 git 项目中常见到,是因为 git init 命令运行时默认创建一个分支,并命名为 master。

创建一个新的分支,就是创建一个新的指针,用来在快照间移动。Git 通过 HEAD 指针,指向当前工作的本地分支。

  1. $ git branch testing

使用 git checkcout 命令,可以切换分支。

  1. $ git checkout testing

修改文件并 commit 代码后,会移动分支的指针

  1. $ vim test.rb
  2. $ git commit -a -m 'update test.rb'

通过 checkout 可以切换回去 master 分支。下面的命令做了两件事,一是把 HEAD 指针指向了 master 分支,二是当前工作目录的文件恢复到了 master 所指向的快照版本。也就是说 87ab2 提交的变动,在切换到 master 分支时被移除。

  1. $ git checkout master

再做一些变更和 commit 。注意,此时历史记录开始出现分叉。

  1. $ vim test.rb
  2. $ git commit -a -m 'make other changes'

Git 中的分支,实际上是一个简单的包含 40 个字符的文件,这 40 个字符是一次提交所产生的 SHA-1 checksum。所以,在 Git 中创建和销毁一个分支的成本非常低。这个和其他大多数版本管理系统比起来,Git 无需拷贝整个项目的文件,是一个巨大的不同点。

基本的分支与合并

下面的例子是一个比较常见的场景,应用了分支与合并的功能。

  1. 在开发一个网站
  2. 创建一个分支 ( iss53 ),用于处理新的项目需求( user story )
  3. 在这个分支上,做了一些工作

这时,接收到另一个紧急的问题,需要立刻修复( hotfix )

  4. 切换到生产环境分支

  5. 创建一个新的分支 ( hotfix ),用于修复线上问题

  6. 测试过后,把修复分支合并到主分支上,并推送到生产环境

  7. 切换到原来的需求分支,继续工作

最开始的状态如下

通过 branch / checkout / commit 等操作,做到上面的第 5 步, 状态如下

接下来,先合并 hotfix 分支,然后部署到线上环境。

  1. $ git checkout master
  2. $ git merge hotfix
  3. Updating f42c576..3a0874c
  4. Fast-forward
  5. index.html | ++
  6. file changed, insertions(+)

上面的提示中,有 Fast-forward 字眼,表明 hotfix 分支指向的 c4 提交,是 master 分支指向的 c3 提交的祖先,因此,直接把 master 移动到 c4 即可。合并后效果关系如下

由于 hotfix 已经合并到 master 分支,此时 master 和 hotfix 指向同一个地方,后续不在需要用到 hotfix 分支,所以可以删除。

  1. $ git branch -d hotfix

下来了可以切换到 iss53 分支继续工作,继续修改,然后提交。当修改完毕后,关系大致如下

  1. $ git checkout iss53
  2. Switched to branch "iss53"
  3. $ vim index.html
  4. $ git commit -a -m 'finished the new footer [issue 53]'
  5. [iss53 ad82d7a] finished the new footer [issue ]
  6. file changed, insertion(+)

接下来开始合并。

  1. $ git checkout master
  2. Switched to branch 'master'
  3. $ git merge iss53
  4. Merge made by the 'recursive' strategy.
  5. index.html | +
  6. file changed, insertion(+)

这里合并没有了 Fast-forward 字眼,因为不是简单的移动分支指针。Git 采用三路合并( three-way merge ) 方式进行合并,创建了一个 commit ( c6 ),用于包含合并后的结果。三路合并方式,是指通过两个分支的最新提交( c4 和 c5 ),以及他们的共同祖先 c2,来进行分支合并。c6 是一个合并提交记录,特别之处是有两个祖先。

此时,你已不在需要 iss53 分支,可以删除它.

  1. $ git branch -d iss53

基本合并冲突处理

如果两个分支修改同一个文件的同一个部分,例如同一行代码,Git 不知道如何合并,认为这是一个冲突。例如你在 iss53 和 hotfix 分支都修改了 index.html 文件的同一个部分,合并 iss53 到已包含 hotfix 的 master 分支时,效果如下

  1. $ git merge iss53
  2. Auto-merging index.html
  3. CONFLICT (content): Merge conflict in index.html
  4. Automatic merge failed; fix conflicts and then commit the result.

此时,自动合并暂停,需要手动合并。 git status 显示冲突了的文件

  1. $ git status
  2. On branch master
  3. You have unmerged paths.
  4. (fix conflicts and run "git commit")
  5.  
  6. Unmerged paths:
  7. (use "git add <file>..." to mark resolution)
  8.  
  9. both modified: index.html
  10.  
  11. no changes added to commit (use "git add" and/or "git commit -a")

Git 在冲突的文件中添加标准的冲突解决标识。

  1. <<<<<<< HEAD:index.html
  2. <div id="footer">contact : email.support@github.com</div>
  3. =======
  4. <div id="footer">
  5. please contact us at support@github.com
  6. </div>
  7. >>>>>>> iss53:index.html

这个表明,HEAD 版本的代码是 ======= 以上部分,iss53 的版本是 ======= 以下部分。

开打 index.html 文件,修改成自己想要的版本,并剔除 <<<<<<< ======= >>>>>>> 标识,然后用 git add 标识冲突已接近,然后git commit 提交解决冲突后的版本。

参考资料

3.1 Branches in a Nutshell, git-scm

3.2 Basic Branching and Merging, git-scm

[git] git 分支( branch ) 的基本使用的更多相关文章

  1. 转Git仓库分支(Branch)和标签(Tag)

    仓库的分支(Branch)规范,影响到每个团队的工作流的一致性:标签(Tag)便于开发团队.测 试团队和其他团队识别每个项目的版本,特别是在协同处理线上问题的时候,大家可以非常清楚 地知道线上运行版本 ...

  2. git分支branch合并到主分支master

    如何使用git将分支branch合并到主干master上 对于一人独立使用git进行系统开发时,branch分支相当于版本(Version),如果每次都将新的分支branch提交到GitHub上,则会 ...

  3. git 分支branch

    转:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137584003893 ...

  4. Git Step by Step – (5) Git分支(branch)

    在前面两盘文章中介绍了Git的基本原理,都是理论知识.这篇文章我们再次回到实践中,看看Git分支(branch)的使用. 在代码版本控制工具中,都会有branch的概念.刚开始建立版本仓库的时候,我们 ...

  5. Git 深度学习填坑之旅三(分支branch、远程操作)

    0x01 分支branch依旧借用大表哥(@表元素)的图 很多时候,我们需要建立另一条分支来进行项目的独立开发,当完成后再跟主流回合进行合并这个时候就要启用分支branch功能 git branch ...

  6. git 创建分支 并 提交到远程分支

    git branch(分支命令的使用http://hbiao68.iteye.com/blog/2055493 0.可以通过git branch -r 命令查看远端库的分支情况 1,从已有的分支创建新 ...

  7. 使用git新建分支以及管理分支

    在进行分支相关的操作前, 我们需要保持主分支干净, 所谓的干净就是没有任何改变(所有更改都已经commit 并 push),那么你可以在任何时候从你的主分支创建一个新分支. 为了方便代码管理,我们应该 ...

  8. git远程分支

    1. 同步远程服务器上的数据到本地 git fetch origin 2. 添加远程分支 git remote add teamone git://git.tram1.ourcompany.com 添 ...

  9. [git]git 分支

    什么动作,关键看你想完成什么 1. 添加新的远程分支: git push origin current_local_branch:new_remote_branch 2. 删除远程分支(冒号前必须要有 ...

随机推荐

  1. myeclipse10 中修改html,servlet,jsp等的生成模板

    1.进入myeclipse的安装目录 2.用减压软件,(如winrar)打开common\plugins\com.genuitec.eclipse.wizards_9.0.0.me2011080913 ...

  2. 正则表达式-delphi

    一.工具选择 在 Delphi 中使用正则表达式, 目前 PerlRegEx 应该是首选, 准备彻底而细致地研究它. 官方网站: http://www.regular-e­xpressions.inf ...

  3. OC加强-day02

    #program mark - 01 @class关键字 [掌握] 1.当两个头文件互相引用的时候,如果双方都是用#import来引入对方的头文件,就会造成死循环,编译不通过 解决方案:其中一边不要使 ...

  4. PHP发送AT指令

    需求: 发送短信到用户输入手机, 要求可以自定义信息内容 问题: 没有电信猫, 使用免费api接口无法自定义短信内容 解决方案: 通过4G网卡, 接在服务器上, 通过AT指令操作网卡, 发送短信 查阅 ...

  5. 使用APPLICATION制作缓存,转存一下,有一段写的还可以。

    public sealed class CacheManager   {   private HttpApplicationState appPool = null;   /// <summar ...

  6. 11-17的学习总结(DOMfirstday)

    HTML: 超文本标记语言,专门定义网页内容的语言 XHTML: 严格的HTML标准 DHTML: 所有实现网页动态效果技术的统称 XML: 可扩展的标记语言,标签都是自定义的 XML语法和HTML语 ...

  7. 在python 中有时候我们用数组

    在python 中有时候我们用数组操作数据可以极大的提升数据的处理效率, 类似于R的向量化操作,是的数据的操作趋于简单化,在python 中是使用numpy模块可以进行数组和矢量计算. 下面来看下简单 ...

  8. UI图标不用愁:矢量字体图标Font-Awesome

    Font-Awesome,这个项目主要是css3的一个应用,准确的说是一段css,这里的把很多图标的东西做到了font文件里面,然后通过引用外部font文件的方式,来展现图标. Font Awesom ...

  9. php 函数 array_slice

    array_slice array_slice -- 从数组中取出一段 <?php$input = array("a", );      // returns "c ...

  10. Cohort Analysis Using Python

    Cohort Analysis是将某一个时期内的用户划分为一个cohort,并将多个cohort进行时间上的某个属性的比较的一种分析方法.Cohort Analysis在有些场景下非常有用.比如一个网 ...