Git分支实战入门详细图解
现在我们模拟一个简单的分支和合并案例,其中工作流可供真实项目借鉴。
(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分支实战入门详细图解的更多相关文章
- Git 命令实战入门 ,奶妈级教程
我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意--在我看来像CSDN.博客园.掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章,其实Gihu ...
- Eclipse Git分支实战
切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...
- GitHub 运用实战入门,奶妈级教学
## 前言: 我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意--在我看来像CSDN.博客园.掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章 ...
- 『现学现忘』Git分支 — 40、分支基本操作(一)
目录 1.创建分支 (1)创建分支 (2)图示理解 2.查看分支列表 3.分支切换 4.查看所有分支的最后一个提交 5.删除分支 1.创建分支 (1)创建分支 Git 是怎么创建新分支的呢? 很简单, ...
- .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练
写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...
- GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
最近听同事说他都在使用GitHub,GitHub是程序员的社区,在里面可以学到很多书上学不到的东西,所以最近在准备入手这方面的知识去尝试学习,正好碰到这么详细完整的文章,就转载了,希望对自己和大家有帮 ...
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
GitHub操作总结 : 总结看不明白就看下面的详细讲解. . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details ...
- 版本控制工具Git工具快速入门-Linux篇
版本控制工具Git工具快速入门-Linux篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.版本管理系统的介绍 1>.版本管理系统的特点 1.1>.自动生成备份: ...
- Git详解之三 Git分支
相关文档 — 更多 Git 基础培训.ppt GIT 使用经验.ppt GIT 介绍.pptx GIT 分支管理是一门艺术.docx Eclipse上GIT插件EGIT使用手册.docx git/gi ...
随机推荐
- thinkphp封装方法添加跨域请求
function wang_json($data){ //返回JSON数据格式到客户端,包含状态信息 header(' Content-Type:application/json; charset=u ...
- 一文读懂 JAVA 异常处理
JAVA 异常类型结构 Error 和 Exeption 受查异常和非受查异常 异常的抛出与捕获 直接抛出异常 封装异常并抛出 捕获异常 自定义异常 try-catch-finally try-wit ...
- 零代码第一步,做个添加数据的服务先。node.js + mysql
node.js + mysql 实现数据添加的功能.万事基于服务! 增删改查之添加数据. 优点:只需要设置一个json文件,就可以实现基本的添加功能,可以视为是零代码. 添加数据的服务实现的功能: 1 ...
- Arguments Optional 计算两个参数之和的 function
创建一个计算两个参数之和的 function.如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果. 例如,add(2, 3) 应该返回 5,而 add ...
- CRM公海自动回收规则
企微云CRM操作指南 – 道一云|企微https://wbg.do1.com.cn/xueyuan/2568.html 销售云 - 美洽 - 连接客户,亲密无间https://meiqia.com/s ...
- UA大全
####PC端UA #Opera "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Ch ...
- CountDownLatch、CyclicBarrier和Semaphore基本原理和使用
一.CountDownLatch CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能. 比如有一个任务A,它要等待其他4个任务执行完毕之后才 ...
- loj121-动态图连通性
Solution 线段树分治, 然后直接在线段树上dfs, 在进入/回溯的过程中维护并查集的merge/split. 对于split操作, 可以在merge时按秩合并, 然后利用栈记录, split时 ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- Xcode 打包(Shell)
1. xcodebuild 1.1 查当前可用的 sdk $xcodebuild -showsdks 1.2 查看所支持的target $xcodebuild -target 1.2 清空当前编译的a ...