理解核心

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 分支合并的更多相关文章

  1. Git分支合并冲突解决(续)

    接Git分支合并冲突解决,在使用rebase合并冲突情况下,如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态(即HEAD指向未知的分支),如何解决? 解决方法 (1)此时, ...

  2. git分支合并解决冲突

    git分支合并,解决冲突 1.手动解决冲突 手动解决冲突,需要使用编辑器,把所有文件中出现的冲突地方修改,然后再添加到暂存区再提交 >>>>>>brancha so ...

  3. git 分支合并时如何忽略某个文件

    [转]git 分支合并时如何忽略某个文件 - 神奇的旋风 - 博客园 https://www.cnblogs.com/xuan52rock/p/13268872.html Git - git-merg ...

  4. Git分支合并选择

    用Git进行多人协作开发时,必然会合并代码,解决冲突.然而合并代码也是需要点技巧的,如果对一些关键命令没有理解去使用的话,git的版本演进路线就会变得很乱,从而造成了日后维护的一些麻烦. Git上合并 ...

  5. git 分支合并 强制合并

    常用的提交流程git add *.XXXgit commit -m "备注....." # 提交到本地分支git fetch git merge #"合并远程分支情况,如 ...

  6. Git分支合并冲突解决

    前2天群里发了张git历史图,如下: 根据提交历史,可以看出图中所有分支合并都采用merge的方式,具体merge是怎么操作的,可以阅读下边文章. 根据项目上的需求,如果要求git提交历史是比较简单的 ...

  7. Git分支合并:Merge、Rebase的选择

    git代码合并:Merge.Rebase的选择 - iTech - 博客园http://www.cnblogs.com/itech/p/5188932.html Git如何将一个分支的修改同步到另一个 ...

  8. git 分支合并冲突

    准备新的feature1分支,继续我们的新分支开发 [root@node1 git]# git checkout -b feature1 D git/LICENSE.txt Switched to a ...

  9. git 分支合并develop 重新拉取

    1.本地包 zb-local 上传到对应的线上分支 zb-online cd 进入本地所在文件夹,然后执行下面三项 git add . git commit -m '修改' git push   或者 ...

随机推荐

  1. JAVA的安装与软件使用

    1.JAVA的安装与环境 2.练习: (1)初识java (2)使用eclipse输出自己的名字

  2. python之对指定目录文件夹的批量重命名

    python之对指定目录文件夹的批量重命名 import os,shutil,string dir = "/Users/lee0oo0/Documents/python/test" ...

  3. LPC43xx SGPIO Pattern Match Mode

    模式匹配 所有位串均具有模式匹配功能. 该功能可用于检测启动代码等.要使用该功能,则必须用需匹配的模式来对REG_SS 编程 (请注意, POS 达到零时 REG_SS 不会与 REG  交换!) M ...

  4. Swift - UIView的无损截图

    Swift - UIView的无损截图 效果 源码 // // UIView+ScreensShot.swift // Swift-Animations // // Created by YouXia ...

  5. 解决ASP.NET在IE10中Session丢失问题【转】

    今天发现在IE10中登录我公司的一个网站时,点击其它菜单,页面总会自动重新退出到登录页,后检查发现,IE10送出的HTTP头,和.AUTH Cookie都没问题,但使用表单验证机制(FormsAuth ...

  6. 神舟K650c i7(W350STQ)上成功装好Mac OS X 10.9,兼谈如何安装WinXP、7、8.1、OSX、Ubuntu五系统(Chameleon、MBR)

    作者:zyl910 参考教程——http://bbs.pcbeta.com/viewthread-1432534-1-4.html笔记本SNB和IVY平台Win7/Win8/Win8.1安装OS X ...

  7. [算法导论]BFS @ Python

    class Graph: def __init__(self): self.V = [] class Vertex: def __init__(self, x): self.key = x self. ...

  8. js去掉html标签和去掉字符串文本的所有的空格

    去掉html标签的js <script> function delHtmlTag(str){  return str.replace(/<[^>]+>/g,"& ...

  9. 用户管理 之 Linux 用户(User)查询篇

    用户(User)和用户组(Group)的配置文件,是系统管理员最应该了解和掌握的系统基础文件之一,从另一方面来说,了解这些文件也是系统安全管理的重要组成部份:做为一个合格的系统管理员应该对用户和用户组 ...

  10. 【News】SpagoBI中国官方微信对外发布

    爱数据,爱分析,爱达比 致力于国际优秀开源BI应用在中国的普及推广,用数据开启中小企业智慧之门: 扫描上图二维码,关注SpagoBI中国官方微信,2015年8月18日将在腾讯课堂.百度传课.网易云课堂 ...