title: Git Rebase和Merge的用法
categories: 后端
tags:
- Git

Rebase和Merge是什么?

merge和rebase的作用都是合并两个分支,其区别在于:

                     A---B---C topic
/ \
D---E---F---G---H master

在topic分支,想要引入master分支的F、G commit上的内容,可以用merge,然而merge的缺点是引入了一次不必要的合并记录

 					A--B--C--X topic
/ / \
D---E---F---G---H master

其实仔细想一下就会发现,引入master分支的F、G commit这个问题上,我们并没有要求两个分支必须进行交汇(join),我们只是想避免最终的merge conflict而已。

rebase是另一个选项。rebase的含义是改变当前分支branch out的位置。这个时候进行rebase其实意味着,将topic分支branch out的位置从E改为G,如图:

                             A---B---C topic
/
D---E---F---G master

在这个过程中会解决引入F、G导致的冲突,同时没有多余的history join。但是rebase的缺点是,改变了当前分支branch out的节点。如果这个信息对你很重要的话,那么rebase应该不是你想要的。rebase过程中也会有多次解决同一个地方的冲突的问题,不过可以用squash之类的选项解决。个人并不认为这个是rebase的主要问题。

以上部分内容来自知乎的回答: https://www.zhihu.com/question/36509119/answer/131513261

正确使用rebase的开发流程

  1. 第一天创建了一个feature分支开发自己的功能,并且进行了几次commit
C1 -- C2 -- C3 (master)
\
-- F1 -- F2 (feature)
  1. 多次commit后需要把多个commit合并(参考我之前的一篇博客:如何使用sourcetree合并多个commit
C1 -- C2 -- C3 (master)
\
-- F12 (feature)
  1. 当功能开发完成后合并到主分支时,主分支已经有其他人的commit:
C1 -- C2 -- C3 -- C4 -- C5 (master)
\
-- F12 (feature)
  1. 此时先在主分支上rebase,变成了下面这样:
C1 -- C2 -- C3 -- C4 -- C5 (master)
\
-- F12 (feature)
  1. 然后再merge到主分支:
C1 -- C2 -- C3 -- C4 -- C5 ---- C6 (master)
\ /
-- F12 (feature)

注意点:

  • 合并多个commit是为了在rebase的时候避免解决多次冲突

以上内容总结了这篇知乎回答:

  1. https://www.zhihu.com/question/36509119/answer/2006718263

部分有意义的回答

rebase的最大好处并不是消除merge,而是避免merge的交织。

简要来说,就是在merge进被合分支(如master)之前,最好将自己的分支给rebase到最新的被合分支(如master)上,然后用pull request创建merge请求。

我个人一般在pull request里面还是采用普通的merge,当然可能有的小伙伴喜欢rebase merge等,我觉得要看具体情况。

其实本文的关键就是合理利用 rebase和merge来避免git历史提交里的无意义的“交织”。

来自一个用户名的知乎回答

参考

  1. 知乎问题:在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?

  2. 知乎专栏:git merge和git rebase的区别, 切记:永远用rebase

Git Rebase和Merge的用法的更多相关文章

  1. [git]rebase和merge

    转自:http://blog.csdn.net/wh_19910525/article/details/7554489 Git merge是用来合并两个分支的. git merge b # 将b分支合 ...

  2. git rebase 与 merge 的那些事儿~(详细图解,通俗易懂)

    什么是 rebase? git rebase 你其实可以把它理解成是"重新设置基线",将你的当前分支重新设置开始点.这个时候才能知道你当前分支于你需要比较的分支之间的差异. 原理很 ...

  3. git rebase 还是 merge的使用场景最通俗的解释

    什么是 rebase? git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点.这个时候才能知道你当前分支于你需要比较的分支之间的差异. 原理很简单:rebase需 ...

  4. git rebase 与 merge(个人使用理解)

    merge 是“合并”,rebase.cherry-pick 中文能理解成“重现” merge 一般是对于整个分支做处理,比如一个feature分支,功能开发完成经过测试了,我们会合并(merge)到 ...

  5. git rebase 和 merge的区别

  6. git merge 与 git rebase

    git merge git rebase merge V.S. rebase 参考材料 写在开始: 对merge和rebase的用法总有疑惑,好像两个都能完成"获取别的branch的comm ...

  7. git合并之 merge和rebase

    合并有两种方法: git rebase 和git merge 优先用 rebase!!!! 区别: 1. 使用git merge git checkout dev git merge master 或 ...

  8. git merge 及 git rebase的区别

    Git上合并代码有git merge 及 git rebase 两种方式. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布. ...

  9. git rebase 的使用

    rebase 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是“rebase”,怎样使用“rebase”,并将展示该操作的惊艳之处,以及指 ...

  10. Git rebase的使用

    rebase 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是“rebase”,怎样使用“rebase”,并将展示该操作的惊艳之处,以及指 ...

随机推荐

  1. 图解不同版本的HTTP协议

    前言 大家好,我是蜗牛,今天我们聊聊HTTP协议,通过这篇文章我们能了解到不同版本HTTP优缺点.他们之间的性能差异以及现在主流的HTTP协议用的那个版本 HTTP/1.1 时代 HTTP/1.1 对 ...

  2. 畸变矫正、透视变换加速(OpenCV C++)

    前两周,同事和我说检测时间超时,其中对图像做畸变矫正和投影变换就要花费25ms(3000×3000的图).而此时我们已经用上了文章opencv图像畸变矫正加速.透视变换加速方法总结中的方法.突然我想到 ...

  3. Tesla-E380,4K eDP一键点屏神器问世

    eDP屏快速点亮,EDID回读, eDP屏调试 是否为点屏的准备工作感到烦躁: 1)查找LCD模组的数据手册(常常还未必能找着) 2)在上位机软件或者单片机程序里设置一大堆的LCD屏参,这个频率,那个 ...

  4. TCP 序列号和确认号是如何变化的?

    大家好,我是小林. 在网站上回答了很多人的问题,我发现很多人对 TCP 序列号和确认号的变化都是懵懵懂懂的,只知道三次握手和四次挥手过程中,ACK 报文中确认号要 +1,然后数据传输中 TCP 序列号 ...

  5. 用 VS Code 搞 Qt6:信号、槽,以及QObject

    Qt 里面的信号(Signal)和槽(Slot)虽然看着像事件,但它实际上是用来在两个对象之间进行通信的.既然是通信,就会有发送者和接收者. 1.信号是发送者,触发时通过特有的关键字"emi ...

  6. Dropout原理分析

    工作流程 dropout用于解决过拟合,通过在每个batch中删除某些节点(cell)进行训练,从而提高模型训练的效果. 通过随机化一个伯努利分布,然后于输入y进行乘法,将对应位置的cell置零.然后 ...

  7. Vue前端框架基础+Element的使用

    前置内容: AJAX基础+Axios快速入门+JSON使用 目录 1.VUE 1.1 概述 1.2 快速入门 1.3 Vue指令 1.3.1 v-bind & v-model 指令 1.3.2 ...

  8. Jmeter——请求响应内容乱码解决办法

    前段时间,换过一次设备,重新下载了Jmeter.有一次在编写脚本时,响应内容中的中文一直显示乱码. 遇到乱码不要慌,肯定是有办法来解决的.具体解决办法,可以参考之前的博文,Jmeter--BeanSh ...

  9. 题解合集 (update on 11.5)

    收录已发布的题解 按发布时间排序. 部分可能与我的其他文章有重复捏 qwq . AtCoder for Chinese: Link ZHOJ: Link 洛谷 \(1\sim 5\) : [题解]CF ...

  10. C#where关键字约束

    where关键字的用法 where关键词一个最重要的用法就是在泛型的声明.定义中做出约束. 约束又分为接口约束.基类约束.构造函数约束.函数方法的约束. 1.接口约束,泛型参数必须实现相应的接口才可以 ...