理解核心

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. win7给C盘扩容

    win7给C盘扩容 需要给C盘在不重装系统的情况下进行扩容.在网上搜索了不少资料,包括使用系统自带的分区工具,PQ等软件,都没有成功.不小心看到了分区助手,使用之,迅速的解决了问题,而且解决的非常完美 ...

  2. Reservoir Sampling 蓄水池抽样算法,经典抽样

    随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...

  3. AsyncTask实现多任务多线程断点续传下载

    这篇博客是AsyncTask下载系列的最后一篇文章,前面写了关于断点续传的和多线程下载的博客,这篇是在前两篇的基础上面实现的,有兴趣的可以去看下. 一.AsyncTask实现断点续传 二.AsyncT ...

  4. android 页面跳转,数据回传

    package com.example.firstpg.firstpg; import android.support.v7.app.ActionBarActivity; import android ...

  5. WIN7、WIN8 右键在目录当前打开命令行Cmd窗口(图文)

    Win7系统大家习惯“Win+R”的组合键打开命令提示符. 通常右击文件夹是没有进入命令行 进入某个文件夹里面,先按住Shift键,然后鼠标右键,出现选项“在此处打开命令窗口(W)”也可以打开命令行. ...

  6. maven eclipse miss required library解决

    我是直接到C:\Users\admin\.m2\repository目录把所有的库包全删除,然后在项目里刷新一下,搞定!

  7. LCLFramework框架之Plugin模式

    插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...

  8. Openvswitch原理与代码分析(7): 添加一条流表flow

    添加一个flow,调用的命令为 ovs-ofctl add-flow hello "hard_timeout=0 idle_timeout=0 priority=1 table=21 pkt ...

  9. gitignore for vs

    */**/bin/Debug*/**/bin/Release*/**/obj/Debug*/**/obj/Release*/**/x86/Debug*/**/x86/Release*/**/x64/D ...

  10. X509证书中RSA公钥的提取与载入

    原文链接: http://blog.chinaunix.net/uid-16515626-id-2741894.html   由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等 ...