导语:作者阐释了 git rebase 命令的原理和缺陷,rebase 会导致线性的历史没有分支。此外如果 rebase 过程中发生了冲突,还可能会引入更多的问题。作者推荐使用 git merge。
用了几年的 Git 后 ,我发现使用越来越多的先进的 Git 命令已经逐渐成为我日常工作流的一部分了。在我发现 Git rebase 后,我马上就把它收录到我日常工作流中。熟悉 rebase 的人都知道它的强大之处,并且它总是在诱惑别人使用它。然而,我很快就发现了在开始使用 rebase 后带来的一些不是很明显的挑战。在阐述挑战之前,我将快速地讲述一下 merge 和 rebase 之间的差别。
我们首先来思考一下将 feature 分支合并到 master 分支的基础案例。通过 merge 的话,我们创建了一个新的提交g
表示两个分支的合并。提交图清晰的展现了发生了什么,我们可以从更大的 Git-repos 中看到熟悉的“火车轨道”轮廓。
Example of merging
同样地,我们可以在 merge 之前选择 rebase。提交会被移除,并且 feature 分支被重置到 master 分支,feature 分支上的提交被重新应用到 master。差别在于这些重新应用的提交通常是原始的副本,它们的 SHA-1 密钥和原来的提交不一样。
Example of rebasing
我们现在将 feature 的基础提交从b
变为了c
,这就是 rebase 的意思。将 feature 合并到 master 是一个快进合并,因为在 feature 上的所有提交都是 master 的直接子代。
Example of fast-forward merging
和 merge 的方法比较起来,rebase 导致分支的历史都是线性的。我以前更喜欢在合并之前 rebase 分支的原因在于提高了可读性,我认为其他的开发者应该也是这种情况。
但是,这种方式带来了一些不是很明显的挑战。
考虑一下这种情况,有一个依赖在 master 上被移除了,但在 feature 上还在使用。当 feature 分支 rebase 到 master 上时,第一个重新应用的提交会打破你的构建,但只要没有合并冲突,rebase 就不会被中断。从第一个提交出现的错误会保留在随后的所有提交中,这导致了一个链式的错误提交。
这个错误只会在 rebase 完成后才会被发现,并且通常会在顶部增加一个修复 bug 的提交g
。
Example of failed rebasing
如果你在 rebase 过程中出现了冲突,Git 将会暂停在冲突的提交上,允许你在开始之前解决冲突。在一系列的提交中间解决冲突通常会让人困惑,难以改正,并且可能会导致额外的错误。
引入错误是在 rebase 过程中发生的。这样,当你重写历史的时候,新的错误就会被引入,它们可能会掩盖第一次写入历史时造成的真正的错误。尤其是,当我们使用 Git bisect 时会变得更加困难,Git bisect 可以说是 Git 工具箱中最强大的调试工具了。例如,思考一下下面的 feature 分支,我们假设在分支的末端引入了一个错误。
A branch with bugs introduced towards the end
为了找到引入错误的提交,你可能会搜索几十个甚至上百个提交。这个过程可以通过编写测试错误存在的脚本来自动执行,并通过 Git bisect 使用命令git bisect run <yourtest.sh>
来运行。
Bisect 会通过二分查找整个历史,识别出引入 bug 的提交。在上面展示的案例中,它成功地找到第一个错误的提交,因为所有的有问题的提交包含着我们正在寻找的真正的错误。
Example of successfull Git bisect
另一方面,如果我们在 rebase 过程中引入了额外的错误提交(下图的d
和e
),bisect 将会遇到麻烦。这个例子中,我们希望 Git 识别出f
提交,但它会错误地识别出d
,因为它包含了其他的错误打破了测试。
Example of a failed Git bisect
这个问题比看起来更大。
我们为什么要使用 Git?
因为它是我们追踪我们代码中错误来源最重要的工具。Git 是我们的安全网。通过 rebase 虽然能够达成线型历史,但我们会给予较少的优先权。
回顾一下,我必须使用 bisect 追踪系统中上百个提交。这个错误的提交在一条未编译的提交链中间,因为一个错误的 rebase。这个不必要的并且今天可以避免的错误导致我花了一天的时间来追踪提交。
所以,我们怎样才能避免在 rebase 过程中出现错误的提交链呢?一个方法是在 rebase 结束后,测试代码来发现错误,然后回到我们引进错误的地方修复它。另一个方法是,在 rebase 过程中暂停每一个步骤,在继续处理之前测试并修复它。
这是一个笨重的,并且容易犯错的过程。这么做的唯一结果是获得一个线型的历史。还有更简单,更好的方式吗?
答案是:Git merge。它是一个简单的,一步到位的过程,所有的冲突都可以在一个单一的提交中解决。合并的提交清晰地显示了我们的分支之间的交互点,并且我们的历史叙述了实际上发生的和什么时候发生的。
综上所述,推荐使用 merge 而不是 rebase。保持我们历史的真实性是不可低估的。至于人们为什么要使用 rebase,可能是出于虚荣心,科科。
- 译者:KenChoi
- 原文链接:Why you should stop using Git rebase
- 知乎专栏:极光日报
评论时间:2023-09-10 15:25:01
个人如何出租服务器 7、应云服务器租用价格 用软件开发
评论时间:2023-05-15 15:25:01
15.修复系统漏华为云主机价格一览表 洞虚拟主机免费试用3天 漏洞
评论时间:2023-03-04 09:25:02
12.接怎么在虚拟主机上搭建网站 着进入“工具→任务管理器”,选中“新建项目—>更改名称”复选框后即可进行项目的修改了服务器机柜水平布线 的修改了
评论时间:2023-02-06 09:25:02
那么对于一些中小型的企事业单位来说,如何才能更好的管理和使用呢?下面我们就一起来虚拟主机有哪几种 看看吧!首先需要注意的是:1.要有一定数量的机柜,这样可以减少机房空间的占ea交易必须用云主机吗 看吧!首先需要注意的是:1.要有一定数量的机柜,这样可以减少机房空间的占
评论时间:2023-01-28 03:25:01
为了保证您在网上交易时不会受到他搭建dns解析服务器 人恶意攻击而造成经济损失,我们承诺虚拟主机可以挂游戏吗 恶意攻击而造成经济损失,我们承诺提供完善的服务保障,包括但不限于:1.在线客服
评论时间:2023-01-09 15:25:02
只要能服务器硬件类型 够上网,便可享受到这些服务购买服务器搭建http代理 些服务
评论时间:2022-12-28 21:25:01
7.要经常检查服务器是否处于正常工作状态,一旦出现问题应及时虚拟主机型号及价格 虚拟主机搭建两个网站 7.要经常检查服务器是否处于正常工作状态,一旦出现问题应及时解决
2023-12-25 22:44:35 admin
活动发布区版规2023-05-27 22:03:52 御风而行
容器、无服务器、虚拟机:安全性差...2023-05-27 20:43:39 1356
服务器宕机的造成原因和解决方法介...2023-05-27 20:43:25 qingym
别糊涂了!服务器与工作站的五大区...2023-05-27 19:08:41 小绵羊0123
科技巨头布局云端 服务器 网络硬...2023-05-27 18:17:46 姐姐的跟屁虫
钉钉因系统访问流量激增,宕机1小...2022-07-23 00:34:02 freeatom
常见ftp命令 FTP命令使用详...2022-07-21 02:17:02 ares
双硬盘组建Raid0磁盘阵列图文...2022-07-20 06:17:02 mankeung123
用友软件客户端连接不上服务器的解...2022-07-23 00:51:02 antonfxb
WebService实例2022-07-13 05:38:02 苯小孩
开发、运维不可不看的Linux调...2022-07-20 18:51:02 nightstone
如何使用Charles抓取Web...2021-12-21 02:56:19 admin
置顶通知!发帖请务必遵守法律法规2021-12-25 05:38:01 青青子w
石家庄服务器托管并不局限于石家庄...2021-12-27 05:38:01 terryzxc001
什么是双线托管,比较便宜的双线托...2022-07-06 05:38:02 9999999999999
7个有效的物联网应用案例2022-07-19 03:34:02 chense
主要勒索软件使用的攻击工具和技术...2022-07-19 07:17:02 冷雨点枫
管理员可利用的4大开源自动化工具2022-07-19 20:17:02 dengyu0429
linux vi使用及详细介绍2022-07-20 01:00:05 激动的舌头
Linux视频教程:用户管理命令...2022-07-21 20:51:02 jessica-an
创建本地FTP站点2022-02-07 05:38:03 jasonkidd
WEB服务器配置详解2022-07-20 04:51:02 wolfssss
ACL权限-默认与递归(4)2022-07-22 15:00:05 淡水珊瑚
Linux下 Samba Ser...