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

最新文章

  1. fiddler如何修改request header
  2. Jquery设置Cookie
  3. adb devices 端口占用
  4. Mysql 查看连接数,状态
  5. CFileDialog的用法
  6. 使用Emmet(前身Zen Coding)加速Web前端开发
  7. BZOJ 3123 SDOI2013 森林
  8. 怎么限制Google自动调整字体大小
  9. matlab numpy equivalents
  10. BZOJ1324: Exca王者之剑
  11. iOS 10中如何搭建一个语音转文字框架
  12. 分享两个网址,一个是使用mssql自带的跟踪工具和分析工具
  13. HTML5 桌面通知:Notification API
  14. 数据结构课程设计四则运算表达式求值(C语言版)
  15. struts2远程命令执行漏洞S2-045
  16. curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.报错
  17. python -django 之第三方支付
  18. 在树莓派是安装并配置NTP服务
  19. spring-jar包及架构介绍
  20. winform/timer控件/权限设置/三级联动

热门文章

  1. GitLab CI/CD 自动化部署入门
  2. docker swarm快速部署redis分布式集群
  3. (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复
  4. [转]VB中资源文件.res的使用方法详解
  5. JavaWeb4
  6. 推荐三个实用的 Go 开发工具
  7. 线程(Thread)基本用法
  8. 网络编程:软件开发架构、架构总结、网络编程前戏、OSI七层协议简介、OSI七层协议之物理连接层、数据链路层、网络相关专业名词、OSI七层协议之网络层
  9. i春秋xss平台
  10. python进阶(29)单例模式