现在我们模拟一个简单的分支和合并案例,其中工作流可供真实项目借鉴。

(1)在master开展工作
(2)为新的需求创建分支
(3)在新的分支上展开工作
这时,你接到一个电话,说项目有一个严重的问题需要紧急修复。你随后会这样做:
(4)切换到你的生产环境分支
(5)创建新的分支来进行此次问题的热修补工作
(6)通过测试后,合并热修补分支并推送到生产环境中
(7)切换回之前的需求分支上继续工作

基本的分支操作

首先,假设你在所工作的项目上已经完成了一些提交

$ git log --oneline --decorate --graph --all
* 5d55df0 (HEAD -> master) 先前的工作2
* 36228f1 先前的工作1

这时,你决定在工程中加入功能模块B,所以你创建了一个分支mod-b

$ git checkout -b mod-b
Switched to a new branch 'mod-b'

D:\Git\t2 (mod-b -> origin)

接下来你继续工作,进行了新的提交。这么做会让mod-b分支指针向前移动。

$ git log --oneline --decorate --graph --all
* b52c200 (HEAD -> mod-b) 创建了模块B
* 5d55df0 (master) 先前的工作2
* 36228f1 先前的工作1

现在,你接到一个电话,说项目有个问题需要立即被修复。如果没有Git的帮助,你需要先取消所有针对模块B所做的修改,然后部署补丁。如今你要做的就是切换回master分支即可。

$ git checkout master
Switched to branch 'master'

D:\Git\t2 (master -> origin)

此时项目的状态就和你开始处理模块B之前一模一样了,你可以集中精力制作补丁了。我们接下来创建一个补丁分支fix,并展开一些工作提交。

$ git checkout -b fix
Switched to a new branch 'fix'

$ git commit -a -m "修补了线上的问题"
[fix 130f52e] 修补了线上的问题
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fix.txt

现在我们再查看一下分支结构

$ git log --oneline --decorate --graph --all
* 130f52e (HEAD -> fix) 修补了线上的问题
| * b52c200 (mod-b) 创建了模块B
|/
* 5d55df0 (master) 先前的工作2
* 36228f1 先前的工作1

现在你确定这个补丁准确无误,将其合并到master分支

$ git checkout master
Switched to branch 'master'

$ git merge fix
Updating 5d55df0..130f52e
Fast-forward
 fix.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fix.txt

注意到,合并过程出现了fast-forward提示。由于当前所在master分支所指向的提交是要并入fix分支的直接上游,因而Git会将master分支指针向前移动。换句话说,当你试图合并两个不同的提交,而顺着其中一个的提交的历史可以直接到达另一个提交时,Git就会简化合并操作,直接把分支指针向前移动,因为这种单线历史不存在有分歧的工作,这就叫做fast-forward

现在,我们的分支是这样的

$ git log --oneline --decorate --graph --all
* 130f52e (HEAD -> master, fix) 修补了线上的问题
| * b52c200 (mod-b) 创建了模块B
|/
* 5d55df0 先前的工作2
* 36228f1 先前的工作1

问题修复完毕,你准备回到之前被打断的工作上去,继续优化你的模块B。再此之前,先别急,首先把已经不需要的分支fix删除,该分支和master分支指向的位置相同。使用git branch-d选项来删除这个分支

$ git branch -d fix
Deleted branch fix (was 130f52e).

现在,回到mod-b分支,优化模块B

$ git checkout mod-b
Switched to branch 'mod-b'

# 对B模块做了一些优化

$ git commit -a -m "优化了模块B"
[mod-b 65f2937] 优化了模块B
 1 file changed, 1 insertion(+), 1 deletion(-)

看现在的分支

$ git log --oneline --decorate --graph --all
* 65f2937 (HEAD -> mod-b) 优化了模块B
* b52c200 创建了模块B
| * 130f52e (master) 修补了线上的问题
|/
* 5d55df0 先前的工作2
* 36228f1 先前的工作1

值得注意的是,mod-b分支不包含你在fix上做过的工作。如果需要把上述修补工作并入mod-b,就需要执行git merge master使得master分支合并到mod-b分支中,或者把mod-b分支合并入master分支。

基本的合并操作

现在模块B的工作已经完成,可以合并会master分支了。这次合并操作实现起来与之前合并fix分支差不多

$ git checkout master
Switched to branch 'master'

$ git merge mod-b
Merge made by the 'recursive' strategy.
 b.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 b.txt

这次合并看起来有点不一样。这次合并中,开发历史从某个早先的时间点开始有了分叉。由于当前master指向的提交并不是mod-b的直接祖先,因而Git必须要做一些额外的工作。本例中,Git执行的是简单的三方合并。三方合并操作会使用两个待合并分支上最新提交的快照,以及这两个分支的共同祖先的提交快照。

与之前简单的向前移动分支指针不同,这一次Git会基于三方合并的结果创建新的快照,然后再创建一个提交指向新建的快照。这个提交叫做合并提交合并提交的特殊性在于,它拥有不止一个父提交

$ git log --oneline --decorate --graph --all
*   9a219d6 (HEAD -> master) Merge branch 'mod-b'
|\
| * 65f2937 (mod-b) 优化了模块B
| * b52c200 创建了模块B
* | 130f52e 修补了线上的问题
|/
* 5d55df0 先前的工作2
* 36228f1 先前的工作1

Git分支实战入门详细图解的更多相关文章

  1. Git 命令实战入门 ,奶妈级教程

    我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意--在我看来像CSDN.博客园.掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章,其实Gihu ...

  2. Eclipse Git分支实战

    切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...

  3. GitHub 运用实战入门,奶妈级教学

    ## 前言: 我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意--在我看来像CSDN.博客园.掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章 ...

  4. 『现学现忘』Git分支 — 40、分支基本操作(一)

    目录 1.创建分支 (1)创建分支 (2)图示理解 2.查看分支列表 3.分支切换 4.查看所有分支的最后一个提交 5.删除分支 1.创建分支 (1)创建分支 Git 是怎么创建新分支的呢? 很简单, ...

  5. .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

    写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...

  6. GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流

    最近听同事说他都在使用GitHub,GitHub是程序员的社区,在里面可以学到很多书上学不到的东西,所以最近在准备入手这方面的知识去尝试学习,正好碰到这么详细完整的文章,就转载了,希望对自己和大家有帮 ...

  7. 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流

    GitHub操作总结 : 总结看不明白就看下面的详细讲解. . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details ...

  8. 版本控制工具Git工具快速入门-Linux篇

    版本控制工具Git工具快速入门-Linux篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.版本管理系统的介绍 1>.版本管理系统的特点 1.1>.自动生成备份: ...

  9. Git详解之三 Git分支

    相关文档 — 更多 Git 基础培训.ppt GIT 使用经验.ppt GIT 介绍.pptx GIT 分支管理是一门艺术.docx Eclipse上GIT插件EGIT使用手册.docx git/gi ...

随机推荐

  1. Java基础系列--08_集合1

    ---恢复内容开始--- 集合当中有很多都是应用到泛型的技术,所以在讲集合之前,应该先将泛型的概念普及一下. 泛型:    (1)泛型是一种类型,但是这种类型是在编译或者调用方法时才确定.    (2 ...

  2. vue源码分析—Vue.js 源码目录设计

    Vue.js 的源码都在 src 目录下,其目录结构如下 src ├── compiler # 编译相关 ├── core # 核心代码 ├── platforms # 不同平台的支持 ├── ser ...

  3. @EnableFeignClients 注解

    feignClents在spring容器里找不到的原因 当使用的feignClents 来自引用别的工程时,需要指定包名,如果不指定就算使用ComponentScan 扫描也不行 import org ...

  4. shell编程企业级实战

    如何才能学好Shell编程 为什么要学习shell编程 Shell是Linux底层核心 Linux运维工作常用工具 自动化运维必备基础课程 学好shell编程所需Linux基础 熟练使用vim编辑器 ...

  5. 安装Linux虚拟系统

    VMWare创建虚拟机与Linux系统的安装 准备工作:VMWare虚拟机,Linux系统镜像 创建好虚拟机之后就可以进入Bios(Basic input ouput system)界面设置安装引导顺 ...

  6. 一个简单的以太坊合约让imtoken支持多签

    熟悉比特币和以太坊的人应该都知道,在比特币中有2种类型的地址,1开头的是P2PKH,就是个人地址,3开头的是P2SH,一般是一个多签地址.所以在原生上比特币就支持多签.多签的一个优势就是可以多方对一笔 ...

  7. vue nextTick使用

    Vue nextTick使用 vue生命周期 原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue. ...

  8. VS2019 离线安装方法详解

    本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发..NET 桌面开发相关的工作负载.MFC 可选组件及帮助查看器. 工作负载(Workload) 离线安装需要先根据 ...

  9. Python_if

    if if c语言中的if语句格式如下: if (条件) { 结果} python的格式与其不同,定义了自己的格式,更加的简明: if 条件 : 结果 print(111) if 3 > 2: ...

  10. HashMap源码分析(基于jdk8)

    我们知道在jdk7中HashMap的实现方式是数组+链表.而在jdk8中,实现有所变化,使用的是数组+链表+红黑树实现的. 当链表长度达到8时转化为红黑树. static final int TREE ...