cherry-pick,revert和rebase使用的3-way合并策略
git中的cherry-pick,revert和rebase都使用的是3-way合并策略,下面就来看看这3个方法使用的merge-base,ours和theirs分别是什么。
cherry-pick
假如有如下的提交历史,使用命令git cherry-pick alt(当前branch是master),那么merge-base就是加阴影的commit 1,ours就是加阴影的commit 3,theirs就是加阴影的commit 2。
revert
假如有如下提交历史,使用命令git revert master~2,那么merge-base就是加阴影的commit 1,ours就是加阴影的commit 3,theirs就是加阴影的commit 2.
rebase
假如有如下提交历史,每一个提交都向一个文件a里面增加一行,比如commit 1向文件a里面写入1,commit 2向文件a里面写入2,依次类推。使用命令git rebase --onto master alt1 alt2时,merge-base,ours,theirs分别是什么呢?
当使用rebase命令时,git如做如下3件事:
1 确定要rebase的commit是什么,这里要rebase的commit就是alt1..alt2。alt1..alt2表示从alt2可reachable的commit当中减去从alt1同样可以reachable的commit,这里就是commit 10,commit11,commit12;
2 使用一个匿名branch指向alt2
3 将alt2 reset到新的base,即master
如下图所示:
接下来git会依次将commit 10,commit 11, commit 12 rebase到新的alt2上。如果在rebase commit 10发生了冲突,那么merge-base就是commit 6,ours就是alt2指向的commit 5,theirs就是commit 10。如果commit 10 rebase成功后的commit记为commt 10’(此时alt2会指向commit 10'),接下来rebase commit 11如果也发生了冲突,那么merge-base同样是commit 6,ours是commit 10',theirs是commit 11。当rebase完成之后如果所示:
由于rebase之后commit 10,commit 11,commit 12没有被任何分支引用,它们最后会被git移除。
rebase有一个特殊的情况如下图所示:
如果运行命令git rebase --onto master alt1 alt2,要被rebase的commit应该是alt2上的commit 7,commit 8, commit 10,但是由于alt1(在git rebase --help中,alt1被称为upstream),上面也有commit 7和commit 8,它们对文件a所做的修改时一样的,这时,git只会rebase alt2上的commit 10,相应merge-base也会成为alt1上的commit 8,最后的结果如下图,rebase完成之后,虚线框中的commit 7,commit 8, commit 10同样会被git移除。
cherry-pick,revert和rebase使用的3-way合并策略的更多相关文章
- git之rebase、merge和cherry pick的区别(面试常问)
git flow图例镇楼 merge 这个简单,初学者常用.比如主分支是Dev,最新版本是01.然后小明基于此,搞了个feature 分支A,业务:打酱油.然后在上面多次提交,完成功能迭代开发,如A1 ...
- git revert和rebase
当前多个commit,想把这几个commit合并成一个,但是想把其中某个commit add2的去掉, 用git revert add2的commit_id,这里只是撤销那次代码提交,后面的add3的 ...
- git merge / rebase 分支的新建与合并
merge https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5% ...
- Git 企业开发者教程
为什么要写这样一个面向企业开发者的Git教程?这个问题也困扰我自己很久.其实我使用git的时间也不短了,但是就和正在阅读本文的每一位一样,常用的基本就是那么几个(git clone, git pu ...
- git合并分支上指定的commit
merge 能够胜任平常大部分的合并需求.但也会遇到某些特殊的情况,例如正在开发一个新的功能,线上说有一个紧急的bug要修复.bug修好了但并不像把仍在开发的新功能代码也提交到线上去.这时候也许想要一 ...
- [译]merge vs rebase
git rebase和git merge设计的初衷是解决相同的一件事, 即把一个分支合并到另外一个分支--只是他们两个处理的方式非常不一样. 当你在一个特定的分支开发新功能, 团队的其它成员在mast ...
- Eclipse来push,fetch,rebase代码
如何与项目里的其他人一起合作项目,提交代码并更新呢?这里提出我比最近用到的两种工具:一种是Eclipse,另外一个是SourceTree.个人推荐从事Java开发的话,可以用Eclipse.当然,还有 ...
- 【译文】Git merge 和 Git rebase比较
[译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之 ...
- Git 协作:Fetch Pull Push Branch Remote Rebase Cherry-pick相关
前言 学习git的时候,我们首先学习的是最常用的,自己独立开发Software时用的命令: git init //初始化git仓库 git add <file_name> //将文件添加到 ...
随机推荐
- OFBiz中根据店铺获取产品可用库存的方法
1.[ProductStoreFacility]获得店铺绑定的仓库列表 2.遍历仓库,调用[getInventoryAvailableByFacility],传入[facilityId : facil ...
- 一个商品练习的py
#!/usr/bin/env python # coding=utf-8 # by 星空刺 qian = int(raw_input("请输入当前money:")) gongzi ...
- Gizmos绘制塔防游戏网格
1.画线脚本写法及地面调整 首先,新建脚本GridMap 新建绘制网格方法(初始数值为10*10) 在类中创建变量 //定义地图宽度 public int m_mapWidth = 10; //地图高 ...
- Blogger支持Mobile行动版网页 - Blog透视镜
目前几乎人人都使用行动装置像是Pad,智能型手机等,而Blogger也针对此类的使用者,推出支持Mobile行动版网页,提供简单清爽的页面,方便在小屏幕上的阅读,在设定上也相当的简单,同时还可以在计算 ...
- 关于Fragment与Activity的想法
View,Fragment,Activity,ListView等都会涉及到Layout文件 不要从Layout来考虑,而是从Activity,Fragment,来考虑,Layout只是他们的一个属性 ...
- 2015北大夏令营day1 B:An Idea of Mr. A
题意:给定一个范围l,r计算i,j(i<j)属于这个范围内的gcd(2^(2^i)+1,2^(2^j)+1)的总和. 思路:费马数的应用,让我惊呆的是当年居然有123个人会做,我tm毛都不会.. ...
- LeetCode_Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", ...
- .NET 使用unity实现依赖注入
原文地址:http://www.cnblogs.com/wujy/p/3317795.html 一:理论部分 依赖注入:这是 Ioc 模式的一种特殊情况,是一种基于改变对象的行为而不改变类的内部的接口 ...
- 转:sql语句中GROUP BY 和 HAVING和使用 count()
在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7 例1:查询出现 ...
- 深入浅出Node.js (3) - 异步I/O
3.1 为什么要异步I/O 3.1.1 用户体验 3.1.2 资源分配 3.2 异步I/O实现现状 3.2.1 异步I/O与非阻塞I/O 3.2.2 理想的非阻塞异步I/O 3.2.3 现实的异步I/ ...