git interactive rebase - edit vs break

uklbhaso  于 2023-10-14  发布在  Git
关注(0)|答案(4)|浏览(173)

我试着在谷歌上搜索这个问题,但找不到满意的答案。
我想知道在git rebase -i的交互模式下,editbreak有什么区别。
根据注解,edit使用提交,但停止修改,而break停止在指定位置。那么,这两者之间的区别是什么呢?

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

我试过这两种,对我来说,它们似乎完全相同。

wn9m85ua

wn9m85ua1#

文件中提到:
要中断变基(就像“edit“命令所做的那样,但没有首先选择任何提交),请使用“break“命令。
在你的情况下,区别是:

  • 使用提交3上的edit,你仍然可以修改提交3的文件内容(在应用提交3之后),提交(仍然是提交3,但是修改/修改),然后继续在git rebase --continue上应用(挑选)提交4。
  • 在提交3之后使用break,提交4将不会被应用。提交3已经被应用了(如果你在此时修改文件,添加并提交,那将创建一个新的提交,除非你做一个git commit --amend)。

所以主要的区别是:

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

如果break在它的行上是单独的,那么是的,它可以类似于提交3上的edit,只要你做一个git commit --amend(因为提交3已经在前一行中被选中了)
但是git rebase --continue(在add + commit --amend之后)将停止,因为说break
正如DylanYoung在评论中所说:
它允许您在execmerge之后立即中断,这在以前是不可能的。
注意:edit是在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,让用户修改提交,或者测试它,或者四处看看。
有时候这个功能会派上用场 * 而不需要 * 挑选一个提交,例如。甚至在cherry-picking一个commit之前,或者在'exec'或'merge'之后立即中断交互式变基。
这次提交引入了这个功能,作为全新的'break'命令。
看“给我给予一个休息”.你给了我一个
只是想表达我对您在git rebase -i的todo列表中引入break命令的想法的感谢。我现在一直在用它。
在此之前,我使用的是x bash,在很多情况下,我都是在那个shell中执行git rebase --continue,当我终止那个shell时,结果并不好(只是一个错误消息,实际上没有什么结果)。这个特点是一种祝福。
或者:
'x bash'将启动另一个shell,这似乎是一件奇怪的事情。
我一直在使用'x false'来生成一个错误退出状态,以中断rebase并放入当前shell。
然后'git rebase --continue'恢复。
bx false要短得多(而且我也不能在深夜将其键入为x flase,尽管我猜这会产生停止交互式变基的相同效果)。

展开查看全部
uyto3xhc

uyto3xhc2#

我使用break的一件事是edit不能做的,那就是应用fixup,然后做其他事情,比如更新代码审查。
例如,如果我有

  1. pick commit1 feature x
  2. pick commit2 feature y
  3. pick commit3 fixup for feature x

我可以

  1. $ git rebase --interactive
  1. pick commit1 feature x
  2. fixup commit3 fixup for feature x
  3. break
  4. pick commit2 feature y

然后

  1. $ command-to-update-cr
  2. $ git rebase --continue

请注意,您可以使用exec来实现相同的目的,但我更喜欢通过将其放入命令行来获得控制权。

展开查看全部
pieyvz9o

pieyvz9o3#

在你提供的例子中,你是正确的。在pick之后使用break与只使用edit相同。这样使用break是没有意义的。当break跟随squashfixupmergeexec时,break变得有用。
这在the commit message that introduced the break command中有解释:

rebase -i:引入“break”命令

edit命令可以用来挑选一个提交,然后立即退出交互式变基,退出代码为0,让用户修改提交,或者测试它,或者四处看看。
有时候这个功能会派上用场 * 而不需要 * 挑选一个提交,例如。甚至在cherry-picking提交之前,或者在execmerge之后立即中断交互式变基。
这个提交引入了这个功能,作为全新的break命令。

wvmv3b1j

wvmv3b1j4#

简短的回答:
break允许你做编辑所做的一切,但是在edit之后超过10年才引入,所以edit仍然存在。
edit有一个非常温和的优势,即在git rebase --continue上隐含git commit --amend

相关问题