git 交互式变基 - 编辑与中断

Posted

技术标签:

【中文标题】git 交互式变基 - 编辑与中断【英文标题】:git interactive rebase - edit vs break 【发布时间】:2020-11-08 04:07:55 【问题描述】:

我试过谷歌搜索,但找不到满意的答案。

想知道git rebase -i交互模式下editbreak有什么区别。

根据 cmets,edit 使用提交,但停止修改,而 break 停止在指定位置。但那有什么区别:

# Scenario 1

pick a9ca198 commit #1
pick 15948d1 commit #2
edit 2dbe941 commit #3  // this will apply commit #3 and then stop.
pick 33c012d commit #4
# Scenario 2

pick a9ca198 commit #1
pick 15948d1 commit #2
pick 2dbe941 commit #3
break                   // this will stop after commit #3
pick 33c012d commit #4

我都试过了,对我来说,它们似乎完全一样。

【问题讨论】:

奇怪,我在 git 版本 2.17.1 上没有 break 选项 @MickaelB。哦,也许break 是最近才添加的命令。我的版本是 2.24.3 (Apple Git-128)。 @SeminPark 是的,请参阅我编辑的答案。 【参考方案1】:

documentation 提到:

要中断变基(就像“edit”命令会做的那样,但没有先挑选任何提交),请使用“break”命令。

在你的情况下,区别是:

在提交 3 上使用edit,您仍然可以修改提交 3 的文件内容(在应用提交 3 之后)、提交(仍然是提交 3,但已修改/修改),然后继续应用(樱桃采摘)提交4 在git rebase --continue。 在提交 3 之后使用 break,将不会应用提交 4。并且提交 3 已经被应用(如果您在此时更改文件,添加并提交,这将创建一个新提交,除非您执行 git commit --amend)。

所以主要区别是:

edit:应用提交 3,但允许您修改最终结果。然后恢复并应用提交 4。 break:不应用提交 4(仅在恢复 rebase 时应用)

如果break 单独在它的行上,那么是的,它可以类似于提交 3 上的 edit,前提是您执行 git commit --amend(因为提交 3 已经在前一行中挑选出来)

但是随后git rebase --continue(在add+commit --amend之后)将停止,因为说break

正如DylanYoung 所说的the comments:

它允许您在 execmerge 之后立即中断,这在以前是不可能的。


注意:break 在 Git v1.5.3-rc0, June 2007, commit 1b1dce4 中引入了交互式变基。

但是单独的命令 break 是更新的:Git v2.20.0-rc0, Oct. 2018, commit 71f8246

参见commit 71f8246(2018 年 10 月 12 日)和 commit b8c0b21(2018 年 10 月 10 日)Johannes Schindelin (dscho)。(由 Junio C Hamano -- gitster -- 合并于 commit 789b1f7,2018 年 11 月 2 日)支持>

git rebase -i”学习了一条新指令(“insn”),“break”,用户可以将其插入到待办事项列表中。 击中它后,该命令会将控制权返回给用户。

rebase -i:引入'break'命令

'edit' 命令可用于挑选提交,然后 立即退出交互式变基,退出代码为 0,让 用户修改提交,或测试它,或环顾四周。

有时这个功能会派上用场没有 挑选一个提交,例如甚至中断交互式变基 在挑选提交之前,或在 'exec' 或 'merge'。

此提交引入了该功能,作为新的“break” 命令。


见"Give me a break"... well, you gave me one:

只是想对您介绍break的想法表示感谢 git rebase -i 的待办事项列表中的命令。我现在一直使用它

在此之前,我使用x bash,并在许多情况下最终在该shell 中使用git rebase --continue,结果并不那么好 当我终止所说的外壳时(不过,只是一条错误消息,什么都没有 结果实际上坏了)。此功能是一种祝福。

或者:

'x bash' 将启动另一个 shell,这似乎很奇怪。

我一直在使用'x false'生成错误退出状态来中断 变基并放入当前外壳。 然后 'git rebase --continue' 继续。

b 的输入比x false 短得多(我也不能 在深夜输入x flase,虽然那会是一样的 我猜是停止交互式变基的效果。

【讨论】:

但在我的示例中,如果我在提交后break,我可以修改或更改之前的提交,就像我使用editing 之前的提交一样。有什么我不能用break 做的,但可以用edit 做的事情吗?反之亦然? @SeminPark 通常,break 不是单独使用的,而是与提交一起使用(意思是在提交 4 上,以避免应用它):这就是区别所在。如果你单独使用它,那么是的,它就像对提交 3 的编辑。 我仍然不明白这是一个显着的差异。一件好事是它允许您在 TODO 列表中显示的第一个提交之前编辑提交(关于 rebase 的常见抱怨),但除此之外,这会改变什么?它会影响 post-rewrite 钩子的输入吗? @DylanYoung 比人为编辑之前的提交让rebase停止更清晰。 我在查看提交github.com/git/git/commit/… 后发现了它。它允许您在 execmerge 之后立即中断,这在以前是不可能的(这已经在答案中,但我必须跳过它)。【参考方案2】:

我使用break 来解决edit 不能做的一件事是应用fixup,然后做其他事情,比如更新代码审查。

例如如果我有

pick commit1 feature x
pick commit2 feature y
pick commit3 fixup for feature x

我可以

$ git rebase --interactive
pick commit1 feature x
fixup commit3 fixup for feature x
break
pick commit2 feature y

然后

$ command-to-update-cr
$ git rebase --continue

请注意,您可以将exec 用于相同的目的,但我更喜欢从命令行中获得的控制权。

【讨论】:

以上是关于git 交互式变基 - 编辑与中断的主要内容,如果未能解决你的问题,请参考以下文章

Git rebase变基如何使用

合并/其他提交交错后的交互式变基

如何修复“损坏的”交互式变基?

Excel 文件阻止我在 IntelliJ Idea 中进行交互式变基

git 修改已提交的 commit

git 交互式 rebase squash 进入下一个提交