自 Git 2.26(2020 年第一季度)起,"
git rebase
"
(man) 默认使用合并后端(即驱动 "
rebase -i
" 的机制),同时允许 "
--apply
" 选项使用应用后端(例如道德等价于 "
format-patch piped to am
")。
可以设置
rebase.backend
配置变量进行自定义。
这有助于说明
--merge
(现在的默认值)和旧的
--apply
之间的区别。
请查看 commit 10cdb9f, commit 2ac0d62, commit 8295ed6, commit 76340c8, commit 980b482, commit c2417d3, commit 6d04ce7, commit 52eb738, commit 8af14f0, commit be50c93, commit befb89c, commit 9a70f3d, commit 93122c9, commit 55d2b6d, commit 8a997ed, commit 7db00f0, commit e98c426, commit d48e5e2 (2020年2月15日),以及 commit a9ae8fd, commit 22a69fd (2020年1月16日) 由 Elijah Newren (newren
) 提交。
(由 Junio C Hamano -- gitster
-- 合并于 commit 8c22bd9,2020年3月2日)
rebase
:将默认后端从“am”更改为“merge”
签名作者:Elijah Newren
am-backend丢失了信息,从而限制了我们的功能:
此外,合并/交互式后端具有更强大的能力,目前似乎有轻微的性能优势,并且比am后端具有更多优化空间(目前正在进行利用其中一些可能性的工作)。
git rebase
现在在其手册页面中包括:
可中断性
使用am后端在错误时间按下Ctrl-C尝试中止rebase会存在安全问题,
此时rebase可能进入无法通过后续的git rebase --abort
中止的状态。
交互式后端似乎不会遇到同样的缺点。(有关详细信息,请参见此线程。)
从那时起,Git 2.39(2022年第四季度)修复了在变基时的reflog消息中的一些错误,并将"rebase --apply
"的reflog消息更改为与"rebase --merge
"匹配,以使reflog更易于解析。
再次说明了两个选项之间的另一个差异,现在已经得到解决。
请查看 commit 9a1925b, commit 6159e7a, commit be0d29d, commit 33f2b61, commit 1f2d5dc, commit da1d633, commit 4e5e1b4, commit 57a1498(由Phillip Wood (phillipwood
)于2022年10月12日提交)。
请查看commit a524c62(由Junio C Hamano (gitster
)于2022年10月17日提交)。
(已于2022年10月30日合并至commit 8851c4b,操作者为Taylor Blau -- ttaylorr
--)
rebase --apply
:使 reflog 消息与 rebase --merge 匹配
签名作者:Phillip Wood
应用后端在开始或完成变基以及挑选提交时创建的reflog消息与合并后端略有不同。这些差异使得解析reflog比必要的更加困难(我有一个脚本,可以从rebase中读取完成消息,但是必须适应两种不同的消息格式,这很麻烦)。虽然可以从reflog消息中确定用于变基的后端,但这些差异并非为此目的而设计。《
c2417d3》(“rebase:从交互式变基的reflog中删除'-i'”,2020-02-15,Git v2.26.0-rc0 --
merge列在
batch #8中)在不发出警告的情况下消除了两个后端的reflog消息之间的明显区别。
由于合并后端是默认设置,因此它很可能是现有reflog中最常见的格式。因此,将应用后端更改为尽可能接近合并后端的格式来格式化其reflog消息。请注意,仍存在差异,因为在提交冲突解决时,应用后端将使用“(pick)”而不是“(continue)”,因为目前无法更改单个提交的消息。
除了
c2417d3之外,我们还在
68aa495(“rebase:通过交互式机制实现
--merge
”,2018-12-11,Git v2.21.0-rc0 --
merge)和
2ac0d62(“rebase:将默认后端从
am
更改为
merge
”,2020-02-15,Git v2.26.0-rc0 --
merge列在
batch #8中)中更改了reflog消息。此提交对“
git rebase --apply
”
(man)进行了与
2ac0d62对
git rebase
(man)相同的更改,而没有任何特定于后端的选项。由于更改消息以使用现有格式,因此可以解析默认变基后端的reflog消息的任何脚本都不会受到此更改的影响。
已经存在针对两个后端的消息的测试,这些测试已调整以确保它们不会在未来失步。
-s
和/或-X
来指定合并策略(两者都意味着-m
)。我这么说是因为尽管-m
在技术上改变了使用的算法,在我测试的几个案例中最终结果是相同的。更令人困惑的是,我能够创建一个场景,在这种情况下git merge upstream
和git rebase upstream
给出了不同的结果,但在那种情况下,git rebase -m upstream
给出了与git rebase upstream
相同的结果,尽管日志消息在过程中看起来不同。 - joanis