0.引言

本文参考最后的几篇文章,将git的分支管理整理如下。学习git的分支管理将可以版本进行灵活有效的控制。

1.如何建立与合并分支

1.1分支的新建与合并指令

新建分支 newBranch,并进入新分支:

$ git checkout -b newBranch 

相当于:

$ git branch newBranch
$ git checkout newBranch

合并分支 mergeBranch,例如要把mergeBranch,合并入master:

$ git checkout master
$ git merge mergeBranch

合并后,master和mergeBranch都指向同一个版本,可以删除掉mergeBranch了:

$ git branch -d mergeBranch

1.2 分支创建与合并的实例

Task:

  1. 开发某项目。
  2. 为实现某个新的需求,创建一个分支iss53。
  3. 在这个分支上开展工作。

   假设临时有个很严重的其他问题需要紧急修补,按照下面的方式处理:

  1. 返回master分支。
  2. 为这次紧急修补建立一个新分支hotfix,并在其中修复问题。
  3. 通过测试后,回到服务器所在的master分支,将修补分支合并进来,然后再推送到服务器上。
  4. 删除hotfix
  5. 切换到之前实现新需求的分支iss53,继续工作。

   工作完成以后,将分支iss53合并入master

  如果iss53与hotfix工作没有冲突,则合并成功,如果有冲突则需要再进行处理判断后,再合并。

Do:

1、假设当前,master更新为C2版本:

2、为实现某功能创建iss53分支,创建index.html,并上传

这个时候,状态是这样的:

3、紧急任务来了,要先返回master分支

4、现在接到进行紧急修改的要求,然后创建hotfix

5、进行了相应的开发,包括修改index.html(注意,在iss53中也进行了修改)

然后git push origin hotfix。

Git 会把工作目录的内容恢复为检出某分支时它所指向的那个提交对象的快照。它会自动添加、删除和修改文件以确保目录的内容和你当时提交时完全一样。

于是当前的状态是:

6、当分支hotfix的内容测试通过确认后,就可以合并到master中,并删除hotfix

如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。

现在最新的修改已经合并到master分支了。可以发布啦。

接下来删除hotfix

7、现在我们回到iss35继续工作

我们继续推进iss35:

8、现在接下来要合并master和iss53

合并后,删除iss53分支,即可。

请注意,这次合并操作的底层实现,并不同于之前 hotfix 的并入方式。因为这次你的开发历史是从更早的地方开始分叉的。由于当前 master 分支所指向的提交对象(C4)并不是 iss53 分支的直接祖先,Git 不得不进行一些额外处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算。

这次,Git 没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)(见图 3-17)。这个提交对象比较特殊,它有两个祖先(C4 和 C5)。

值得一提的是 Git 可以自己裁决哪个共同祖先才是最佳合并基础;这和 CVS 或 Subversion(1.5 以后的版本)不同,它们需要开发者手工指定合并基础。所以此特性让 Git 的合并操作比其他系统都要简单不少。

9、但是如果在不同的分支中都修改了同一个文件的同一部分,Git 就无法干净地把两者合到一起(译注:逻辑上说,这种问题只能由人来裁决。)。如果你在解决问题 #53 的过程中修改了 hotfix 中修改的部分,则会出现:

我们先看一下状态:

接下来我们可以打开 index.html

git 已经自动对其做了区分,HEAD表示master分支的内容,=====下面的是iss53分支做的修改

你可以对其再做调整和修改。

再用git add index.html,git commit表示他们已经解决冲突。

然后再融合和删除iss53分支。完成工作。

也可以使用mergetool:

2. Git分支在实际项目中的灵活运用

这是Git版本控制的分支管理总体图:

其中最重要的是主分支

  • master:用来版本发布,主要反映当前线上运行的代码。
  • develop:作为开发分支,用来存放最新开发的代码,有时候会叫它“集成分支”。

develop分支用来存放开发完成的代码,当develop分支上的代码测试没有问题后,merge到master分支上,并发布。

辅助分支

  • feature branches

feature分支也可以叫做主题分支。例如在新版中要开发的新功能,可以用feature来存放。名字可以另外取,例如要增加insert和search功能,可以增加insertFeature和searcheFeature的分支,开发好后,再分别merge到develop分支中。

从 develop 分支建一个 feature 分支,并切换到 feature 分支
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"

  

合并feature 分支到 develop
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop

  其中--no-ff 的参数,ff表示fastforward,--no--ff,就表示会对历史的分支做一个新的提交对象。加参数和不加参数的区别如下:(可以使用 sourceTree 或者命令git log --graph查看)

  • release branches

这个分支可以是来自develop;必须合并到develop和master。release分支可以理解为更多的是作为版本控制、缺陷镜像修复和最后发布前的复查工作。

创建一个realase分支

$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)

  这里的bump-version.sh ,只是一个虚拟的脚本,是要求读者自己去编写这样的脚本,实现相应的地方都统一更改版本号。

完成release分支:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

  融合到develop分支

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

  删除release分支

$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).

  

  • hotfix branches

这个是一个需要紧急修复bug的分支。当线上产品有bug,我们可以开一个hotfix分支,修复完bug后,再merge,删除。

它来自master,融合向develop和master。

关系如下:

具体代码如下:

创建hotfix分支:

$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)

  

$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)

  完成了hotfix分支:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1

  合并到develop分支

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)

  最后删除hotfix分支

$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).

  

参考:

【1】 http://nvie.com/posts/a-successful-git-branching-model/

【2】http://blog.jobbole.com/109466/

【3】https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6

Git的分支管理的更多相关文章

  1. 你真的了解git的分支管理跟其他概念吗?

    现在前端要学的只是太多了,你是不是有时会有这个想法,如果我有两个大脑.一个学Vue,一个学React,然后到最后把两个大脑学的知识再合并在一起,这样就能省时间了. 哈哈,这个好像不能实现.现实点吧!年 ...

  2. git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...

  3. 引入git flow分支管理

    git flow是Vincent Driessen提出了一个分支管理的策略,非常值得借鉴.它可以使得版本库的演进保持简洁,主干清晰,各个分支各司其职.井井有条. 先看下Vincent Driessen ...

  4. git branch分支管理用法总结

    查看分支(远程和本地) 1 查看本地分支: $ git branch 2 查看远程分支: $ git branch -r 3.查看本地和远程分支 $ git branch -a 创建分支 1.创建本地 ...

  5. git(二) 分支管理

    概念 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇 ...

  6. Git Flow 分支管理简述

    概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...

  7. git flow分支管理

    阅读目录 两种核心分支 三种临时分支 Git Flow流程示例代码 Git Flow工具 分支命名规范 总结 git flow是Vincent Driessen提出了一个分支管理的策略,非常值得借鉴. ...

  8. Git(四)Git的分支管理

    一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...

  9. 139.00.005 Git学习-分支管理

    @(139 - Environment Settings | 环境配置) 一.Why? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交, ...

随机推荐

  1. python基础之socket编程

    一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...

  2. UnitZ Battlegrounds beta5 - Unity吃鸡类型游戏模版 源码 仿绝地求生

    Requires Unity 2018.2.6 or higher.The first battle royale game starter kit on Asset Store, all syste ...

  3. JSP数据库插入判断

  4. 【CSS】Sticky Footer 布局

    什么是 Sticky Footer 布局? Sticky Footer 布局是一种将 footer 吸附在底部的CSS布局. footer 可以是任意的元素,该布局会形成一种当内容不足,footer ...

  5. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  6. Vue中观察者模式的实现

    Vue中实现观察者模式的方法可以有三种: 1.v-on方法 exp: <div id='test'> <button v-on:event='functionName'>but ...

  7. jquery.validate 远程验证remote使用详解

    目的: 试了一下远程验证,试了好几次,得出小结,可以记录下,提醒以防绕路. ----------------直接贴图,省事明了---------------- 1.引用js 2.demo的html & ...

  8. UVa540

    //先输入队伍的个数 //用map建立数组将队伍序号和个人序号相互对应 //三条命令 #include <bits/stdc++.h> using namespace std; ; int ...

  9. day 1:计算机发展史和组成部分

    本节内容: 1,计算机的发展史 2,计算机的组成 1,计算机的发展史 1946年2月14日,由美国军方定制的世界上第一台电子计算机“电子数字积分计算机”(ENIAC Electronic Numeri ...

  10. android studio 模拟器不能使用的解决方案

    1.安装模拟器的时候 AS提示是 VT -x is disable 进入电脑的 bios 系统设置,怎么进入--> 在开机的时候点击F2(华硕电脑,不同电脑方式不同) --在“configura ...