git 交互式变基 - 编辑与中断
Posted
技术标签:
【中文标题】git 交互式变基 - 编辑与中断【英文标题】:git interactive rebase - edit vs break 【发布时间】:2020-11-08 04:07:55 【问题描述】:我试过谷歌搜索,但找不到满意的答案。
想知道git rebase -i
交互模式下edit
和break
有什么区别。
根据 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:
它允许您在
exec
或merge
之后立即中断,这在以前是不可能的。
注意: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
,我可以修改或更改之前的提交,就像我使用edit
ing 之前的提交一样。有什么我不能用break
做的,但可以用edit
做的事情吗?反之亦然?
@SeminPark 通常,break 不是单独使用的,而是与提交一起使用(意思是在提交 4 上,以避免应用它):这就是区别所在。如果你单独使用它,那么是的,它就像对提交 3 的编辑。
我仍然不明白这是一个显着的差异。一件好事是它允许您在 TODO 列表中显示的第一个提交之前编辑提交(关于 rebase 的常见抱怨),但除此之外,这会改变什么?它会影响 post-rewrite 钩子的输入吗?
@DylanYoung 比人为编辑之前的提交让rebase停止更清晰。
我在查看提交github.com/git/git/commit/… 后发现了它。它允许您在 exec
或 merge
之后立即中断,这在以前是不可能的(这已经在答案中,但我必须跳过它)。【参考方案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 交互式变基 - 编辑与中断的主要内容,如果未能解决你的问题,请参考以下文章