git使用—rebase还是merge

转载自:https://segmentfault.com/q/1010000007704573/

我猜现实中的情况是这样的:

使用 git 的人群中,不会用 rebase(哪怕是基础功能的)的至少一半(这个估计恐怕很保守了)
剩下一半里真正理解何时应该正确 rebase 的恐怕也就一半……
merge 还是 rebase 并不是一个二者选其一的问题,而是应该根据具体情况来选择使用,而这个“具体情况”在现实中实在是不好一一列举出来了,对于大多数开发者来说在团队中的职能比较单一,也不是经常有机会遇到,所以在这里我只总结两个人人都应该理解并遵守的准则:

当你从 remote 去 pull 的时候,永远使用 rebase(除了一个例外,后面会讲)
当你完成了一个功能(假定你是单独开本地分支去做的)后打算合并到主干分支的时候,永远使用 merge
开发者应当理解:不同的合并策略影响的或许不是最终的代码结果,但却会影响 git 如何记录提交的历史(尽管很多时候这种理解只对个别人受益,而对自己没有什么影响)。其他的人在使用这些历史的时候(比如 code review 的时候,或者 bisect 的时候等等)会因为过去你做过的事情而感到无比幸福或痛苦。

第二点比较容易理解,把开发一个功能的具体细节隐藏在本地分支中,而把最终的结果作为一条完整的记录合并(merge)到主干分支去。

关键是第一点。大多数情况下大家会选择默认的 pull,也就是 fetch + merge,于是我们会看到主干上不停的出现 Merge commit xxx into xxx 之类的干扰信息。如果所有的人都图方便这么干,那就永远都别想有干净漂亮的历史树了,取而代之是类似这样的东西:

这里写图片描述

如果你去 clone 一个正确使用 git 的项目,你绝对不会看到上图这样乱七八糟的 master。为什么呢?答案就是:git pull –rebase,这条命令会使用 rebase 来代替默认的 pull 对合并的历史树进行变基处理,就可以避免因为无法快进(fast forward)而产生的额外合并记录。

现在绝大多数的 git 客户端都允许设置 git pull 的默认行为是 –rebase,所以掌握了这个诀窍可以让大部分的日常拉取操作都产生清爽漂亮的历史记录,但这并不是完美的结局。有一种例外是这样的:

在你使用 git merge 完成了一个功能分支向主干分支的合并之后(当然是 –no-ff 的)
在你运行 git fetch 发现远程主干又领先你若干提交
此时你若 git pull –rebase,你会发现你刚才合并功能分支的记录没了……
这是因为变基会忽略合并记录,因此变基命令会有一个特别的参数叫做:–preserve-merges 用于重建被忽略的合并记录。所以比 git pull –rebase 更好的方案就是用 git fetch + git rebase -p 代替之。

当然这个仅针对上面提到的特殊情况,随着 git 的升级说不好哪一天就不存在这种问题了也不一定。我一般都不会遇到这种情况,因为我都是这么做的:

完成功能分支之后先不 merge,而是回到主干分支去 git pull –rebase
如果主干有更新,rebase 更新的内容到功能分支来预检一下,看看在加入了最近别人的改动之后我的功能是否依然 OK(在这个过程中可能会有冲突处理,别怪我没提醒哦)
一切就绪之后再次 git fetch 主干看看有没有变动(因为在第二步的进行期间没准又有人 push 了新的变化),有的话重复第二步,没有则——
合并功能分支到主干然后 push,收工。
我这么做可以避免前面提到的意外,看似复杂了些但其实做熟练了之后也没什么难度,更重要的原因是 git rebase -p 是有缺陷的:

不能和 git pull 连用,一条命令分成俩,怎么都觉得“亏”了(虽说你可以写脚本,但最好不要因为习惯了之后反而有时候会害了你)
由于无法和 git pull 配合使用,所以你必须指明目标分支给 rebase,这一点比较烦人,特别是很多 GUI 客户端压根不支持 git rebase -p 的时候(我经常会在 CLI/GUI 之间切换环境使用 git)
ORIG_HEAD 会被破坏。
ORIG_HEAD 在很多情形下非常有用,比如说你可以用 git log -p -reverse ORIG_HEAD 来回看最近一次合并所产生的所有变化等等。–preserve-merges 会让它失去本来应该指向的位置,你不得不先找到正确的 hash 来代替它,这会有点烦。

以上答案最终说明一件事情,现实的复杂性永远超出你在菜鸟时期所能做出的想象,真想把 git 用好那就要在日常工作的基础上好好理解 git 的工作原理吧,可以去看官方网站电子书(中文版),里面的 git internal 一节仔细看懂之后,该用什么命令心里就有数了。

补充一点:如果你的团队不在乎主干分支上有很多不重要的干扰提交记录,那你可以始终使用 rebase,这样至少可以不会出现很多分岔,处理得当也可以得到干净(但是啰嗦)的主干分支历史记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝网轮播图

转载于:https://www.cnblogs.com/wxwxwx/p/10264370.html

atob和btoa的趣谈

2019独角兽企业重金招聘Python工程师标准>>> 不了解的人突然看到window对象的atob和btoa 函数,估计会认为哪个臭小子添加全局函数了。 你如果告诉他这是原生函数,他一定会怒骂:哪个脑残给api起个这样的名子。 你能猜出来这两个函数…

esp32使用lvgl,给图片取模显示图片

使用LVGL官方工具。 https://lvgl.io/tools/imageconverter 上传图片,如果想要透明效果,那么选择 输出格式C array,点击Convert进行转换。 下载.c文件放置到工程下使用即可。

ASM 判定一个类,实现了指定接口

为什么80%的码农都做不了架构师?>>> ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法。 通过 ClassReader ,实现对一个类的解析。 …

exgcd模板

逆元模板P1082 1 #include <cstdio>2 #include <algorithm>3 4 int exgcd(int a, int b, int &x, int &y) {5 if(!b) {6 x 1;7 y 0;8 return a;9 } 10 int g exgcd(b, a % b, x, y); 11 std::swap(x, y); 12 …

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说…

用jenkins创建节点

原料&#xff1a;(1)jre下载链接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html (2)jdk:下载链接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 一、创建SLAVE节点…

解决 Script Error 的另类思路

2019独角兽企业重金招聘Python工程师标准>>> 本文由小芭乐发表 前端的同学如果用 window.onerror 事件做过监控&#xff0c;应该知道&#xff0c;跨域的脚本会给出 "Script Error." 提示&#xff0c;拿不到具体的错误信息和堆栈信息。 这里读者可以跟我一…

迅雷影音怎样 1.5倍速度播放

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 看视频 觉得播放速度太慢&#xff0c;想让1.5速度播放可以这样设置&#xff1a; 点击快进按钮&#xff0c;点一次变为1.1倍&#xff0c…

git pull时冲突的几种解决方式

仅结合本人使用场景&#xff0c;方法可能不是最优的 1. 忽略本地修改&#xff0c;强制拉取远程到本地 主要是项目中的文档目录&#xff0c;看的时候可能多了些标注&#xff0c;现在远程文档更新&#xff0c;本地的版本已无用&#xff0c;可以强拉 git fetch --allgit reset --h…

Linux:echo命令详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 echo命令 用于字符串的输出 格式 echo string使用echo实现更复杂的输出格式控制 1.显示普通字符串: echo "It is a test"这里…

学习 shell脚本之前的基础知识

见 : http://www.92csz.com/study/linux/12.htm【什么是shell】 简单点理解&#xff0c;就是系统跟计算机硬件交互时使用的中间介质&#xff0c;它只是系统的一个工具。实际上&#xff0c;在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方&#xff0c;如果把计算…

Git cherry-pick后再merge出现一个“奇怪”的现象

背景描述&#xff1a;有的时候基于一个master branch拉出一个独立feature分支做开发时&#xff0c;两条分支都在并行开发&#xff0c;如果master分支增加了某些功能&#xff0c;解决了某些关键bug&#xff0c;而独立feature分支不需要所有的增加的commit&#xff0c;只需要某一…

Sublime Text3中文环境设置

Sublime Text3中文环境设置 1、首先打开安装好的的Sublime软件,选择Preferences下面的Package Contorol选项出现弹窗方框 2、在弹窗输入install package,选择对应&#xff08;默认第一个&#xff0c;如图这个&#xff09;命令点击进入;安装的时候&#xff0c;左下角会有进度条显…

C/C++图形化编程(2)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 站在巨人的肩上是为了超过巨人&#x…

Git clone之后你的硬盘上究竟发生了什么?

网上关于Git的使用有太多的博客&#xff0c;文章在讲解了&#xff0c;大部分是在讲解命令的用法&#xff0c;剩下一部分则在讲解git的内部原理&#xff0c;看过讲解基础命令使用的文章后&#xff0c;正常的开发使用是没有什么问题的了&#xff0c;而如果想更深入的了解git“高级…

感知机模型的对偶形式[转载]

转自:https://blog.csdn.net/jaster_wisdom/article/details/78240949#commentBox 1.区分一下易混淆的两个概念&#xff0c;梯度下降和随机梯度下降&#xff1a; 梯度下降&#xff1a;一次将误分类集合中所有误分类点的梯度下降&#xff1b; 随机梯度下降&#xff1a;随机选取一…

go语言渐入佳境[6]-operator运算符

运算符和其他语言一样&#xff0c;Go语言支持多种运算符&#xff0c;用于对变量进行运算。12345678910111213package mainimport "fmt"func main(){ //math() //relation() //logic() //wei() Assign()}算术运算符123456789101112func math(){ a : 4 b:2 fmt.Printf(…

记录腾讯云中矿机病毒处理过程(重装系统了fu*k)

2019-1-21日常上班的周一 刚想学学kafka&#xff0c;登录与服务器看看把&#xff0c;谁知ssh特别慢&#xff0c;很奇怪&#xff0c;我以为是我网速问题&#xff0c;断了wifi&#xff0c;换了网线&#xff0c;通过iterm想要ssh rootx.x.x.x&#xff0c;但是上不去&#xff1f; 就…

对象反序列化出现类型不匹配的情况(spring-boot-devtools)

目前在做springboot项目的shiro session redis共享功能。但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常 AuthorizationUser user (AuthorizationUser) cache.getSuper(key); 异常信息&#xff1a; java.lang.ClassCastException: com.ch.evaluation.a…