Git 分支合并
理解核心
Git最初只有一个分支,所有后续分支都是直接或间接的从这个分支切出来的。
在任意两个分支上,向前追溯提交记录,都能找到一个最近的提交同时属于这两个分支,这个提交就是两个分支的分叉节点
分支合并,就是把其它分支相对于分叉节点发生的变化合并到当前分支中。
Git合并(merge)的是变化!
假设情景
时间点1:两个分支master和dev,现在这两个分支完全一样,处在同一个提交(commit)上,内容含A、B、C、D四部分。
时间点2:dev上开发新内容,不断修改提交,最后dev分支的内容是A、b'、D、E。修改B为b',删除内容C,新增内容E。
时间点3:master分支发现bug,在该分支修改bug并提交,最后master分支内容是A、b''、c、F。修改内容B为b'',修改内容C为c,删除内容D,新增内容F。
时间点4:此时,如果把master分支合并到dev分支上,master和dev上的内容是什么呢?
合并过程
git checkout dev # 切换到dev分支
git merge master # 合并master分支
合并merge做的几件事儿:
1、在dev上删除D,新增F。
这是master分支在时间点3上相对于时间点1发生的部分变化,D在dev分支上没有变化过,F相对于dev是新内容,合并时没有冲突,可直接合并。
2、C上产生冲突,该冲突是"修改、删除"两种不同动作引起的。
时间点2上dev删除了C,时间点3上master修改了C,删除和修改的对象都是同一个C。相对于时间点1,产生了不一致的变化,无法直接合并。
3、B上产生冲突,该冲突是内容变化后不一致引起的。
时间点2上dev修改B为b',时间点3上master修改B为b'',修改后B内容不一致。相对于时间点1,也是产生了不一致的变化,无法直接合并。
merge遇到无法合并的冲突(conflict)时,会先记录下冲突信息,然后跳过冲突继续合并后面的内容,直至合并完所有可以合并的内容后,只剩下无法合并的冲突。此时,merge再也无法继续执行了,只能被迫中断。中断前merge做了最后一件事儿,就是在dev分支上标识出冲突信息,提示用户需要解决冲突,然后再自行完成merge后面的操作——提交合并后的新commit到版本库。
如果合并过程顺利,是不会产生冲突的,merge就可以在合并完成后,自行提交新commit到版本库。
这种合并方式是真实的合并(TRUE MERGE),合并后会在dev分支上产生一个新的commit。还有一种合并方式是快进合并(FAST-FORWARD MERGE),这种方式不会产生新的commit。
解决冲突
1、删除C
2、修改B为正确内容b'''
3、解决冲突后,提交一个新的commit
至此,分支内容如下:
master:A、b''、c、F(master是被合并的,所以自己的内容不会变化)
dev:A、b'''、E、F(合并了master在时间点3上相对于时间点1发生的所有变化,并解决了冲突,生产了新commit)
Git 分支合并的更多相关文章
- Git分支合并冲突解决(续)
接Git分支合并冲突解决,在使用rebase合并冲突情况下,如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态(即HEAD指向未知的分支),如何解决? 解决方法 (1)此时, ...
- git分支合并解决冲突
git分支合并,解决冲突 1.手动解决冲突 手动解决冲突,需要使用编辑器,把所有文件中出现的冲突地方修改,然后再添加到暂存区再提交 >>>>>>brancha so ...
- git 分支合并时如何忽略某个文件
[转]git 分支合并时如何忽略某个文件 - 神奇的旋风 - 博客园 https://www.cnblogs.com/xuan52rock/p/13268872.html Git - git-merg ...
- Git分支合并选择
用Git进行多人协作开发时,必然会合并代码,解决冲突.然而合并代码也是需要点技巧的,如果对一些关键命令没有理解去使用的话,git的版本演进路线就会变得很乱,从而造成了日后维护的一些麻烦. Git上合并 ...
- git 分支合并 强制合并
常用的提交流程git add *.XXXgit commit -m "备注....." # 提交到本地分支git fetch git merge #"合并远程分支情况,如 ...
- Git分支合并冲突解决
前2天群里发了张git历史图,如下: 根据提交历史,可以看出图中所有分支合并都采用merge的方式,具体merge是怎么操作的,可以阅读下边文章. 根据项目上的需求,如果要求git提交历史是比较简单的 ...
- Git分支合并:Merge、Rebase的选择
git代码合并:Merge.Rebase的选择 - iTech - 博客园http://www.cnblogs.com/itech/p/5188932.html Git如何将一个分支的修改同步到另一个 ...
- git 分支合并冲突
准备新的feature1分支,继续我们的新分支开发 [root@node1 git]# git checkout -b feature1 D git/LICENSE.txt Switched to a ...
- git 分支合并develop 重新拉取
1.本地包 zb-local 上传到对应的线上分支 zb-online cd 进入本地所在文件夹,然后执行下面三项 git add . git commit -m '修改' git push 或者 ...
随机推荐
- javascript设计模式与开发实践阅读笔记(6)——代理模式
代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对 ...
- C#类、接口、虚方法和抽象方法0322
虚拟方法和抽象方法有什么区别与联系: 1.抽象方法只有声明没有实现代码,需要在子类中实现:虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现. 2.抽象类不能被实例化(不可 ...
- gearman mysql udf
gearman安装 apt-get install gearman gearman-server libgearman-dev 配置bindip /etc/defalut/gearman-job-se ...
- 在Servlet中出现一个输出中文乱码的问题(已经解)。
在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResp ...
- 代码生成器Kalman Studio2.2发布,完美支持Oracle,不需要安装Oracle客户端
这次更新主要是增加对Oracle的支持,不需要安装Oracle客户端,下面的配置文件列出了Kalman Studio支持的几种数据库 <?xml version="1.0" ...
- Qt 调试时的错误——Debug Assertion Failed!
在VS2008中写qt程序时调试出现此问题,但在release模式下就不存在,在网上搜罗了一圈,是指针的问题. 问题是这样的: 需要打开两个文件,文件中数据类型是float,我使用QVector进行保 ...
- web项目中加入struts2、spring的支持,并整合两者
Web项目中加入struts2 的支持 在lib下加入strut2的jar包 2. 在web.xml中添加配置 <filter> <filter-name>struts2< ...
- Selenium实战脚本集(3)--抓取infoq里的测试新闻
描述 打开infoq页面,抓取最新的一些测试文章 需要抓取文章的标题和内容 如果你有个人blog的话,可以将这些文章转载到自己的blog 要求 不要在新窗口打开文章 自行了解最新的测试思潮与实践
- 【转】JavaScript中的对象复制(Object Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...
- c2ph
http://bolenot.ru/library/cmd/blcmdl1_c2ph.htm?-c2ph---Linux%E5%91%BD%E4%BB%A4--UNIX%E5%91%BD%E4%BB% ...