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 或者 ...
随机推荐
- 【转】C++11 标准新特性: 右值引用与转移语义
VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...
- 那些在学习iOS开发前就应该知道的事(part 1)
英文原文:Things I wish I had known before starting iOS development—Part 1 http://www.cocoachina.com/ios/ ...
- Gulan查询UI排布
遇到一个问题,如何在相对布局里把两个item放在同一行,而且高度一样呢? <RelativeLayout xmlns:android="http://schemas.android.c ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Visual Studio 2013 prerequisites
http://www.visualstudio.com/zh-cn/products/visual-studio-ultimate-with-msdn-vs#Fragment_SystemRequir ...
- pip install使用豆瓣源
这个是老问题了 pip install -i https://pypi.douban.com/simple/ selenium 类似的,npm和gem安装的时候可以使用淘宝源.
- 【网络编程】——linux socket demo
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket ...
- CKEditor4.1和CKFinder2.3.1 for Mvc4最新 破解版,结合 打造"帅"的编辑器 For .Net
CKEditor4.1+CKFinder2.3.1 FOR MVC4 最新破解版:(2013-3-23) baidu share: http://pan.baidu.com/share/link?sh ...
- 记录javascript 验证字符串布尔类型 及url 参数获取
/^true$/i.test("false");false/^true$/i.test("true");true //获取请求参数的值 function Req ...
- Mac 下安装mitmproxy
环境: Mac OS X 10.9.4 1. 安装 直接用pip 安装 pip install mitmproxy 发现在安装依赖包 lxml 的时候报错 In : /private/tmp/pip ...