我有一个功能分支,有很多提交。
A---B---C master
\
\-B'---C'---D'...---Z' feature
我正在feature
工作,但另一位开发人员创建了提交B
和C
。现在我想在提交feature
上重新定义C
,但我和/或automerge在rebase期间引入了错误。我的项目具有非常好的测试覆盖率,我可以使用ant rebuild test
从控制台运行测试,现在我希望git告诉我哪个提交是第一次破坏我的测试的提交,所以我可以修复该提交。我怎么能这样做?
答案 0 :(得分:17)
当你在分支feature
时执行:
git rebase --interactive --exec "ant rebuild test" C
这将导致git在提交C上重新开始,在顶部重放你的工作,它将在重放阶段每次提交后运行你的测试。
如果您的测试失败,希望您的ant任务将具有非零退出代码。在这种情况下,一旦测试失败,git就会停止。您立即处于正确的位置以修改您的提交,以便测试将再次开心。修改后,只需像往常一样执行git rebase --continue
,git将继续检查您提交的所有内容。
答案 1 :(得分:4)
在Git 2.9中引入,您现在可以使用-x
选项为每个提交执行命令,而无需添加--interactive
。
现在可以运行git rebase -i --exec "cmd1 && cmd2 && ..."
。
git rebase -x "cmd1 && cmd2 && ..."
答案 2 :(得分:3)
要添加到OP yankee excellent answer,Git 2.5+将提供更强大的git rebase --interactive --exec
体验,尤其是在失败的情况下 exec。
实际上,请参阅此答案最后部分的新的--reschedule-failed-exec
Git 2.21 。
见commit b12d3e9 [2015年5月22日]和commit 1d968ca [2015年5月22日] Matthieu Moy (moy
)。
(由Junio C Hamano -- gitster
--合并于commit a6be52e,2015年6月1日)
'
exec
'命令是将当前提交发送到stopped-sha
,它应该包含原始提交(在rebase之前) 因此,如果exec
'命令失败,下一个'git rebase --continue
'将发送当前提交作为post-rewrite hook。
完整文档:
rebase -i
:使用失败的post-rewrite
命令修复exec
挂钩通常,当'
git rebase
'在完成rebase之前停止,它是为用户提供编辑提交的机会(例如使用'edit
' 命令)。
在这种情况下,'git rebase
'保留在"$state_dir"/stopped-sha
中重写的提交的sha1,以及随后的git rebase --continue
'将使用此sha1调用post-rewrite
挂钩作为<old-sha1>
挂钩的post-rewrite
参数。&#39;
git rebase
&#39;由于失败而被停止&#39;exec
&#39;命令不同:它为用户提供了检查或修复的机会 失败,但并没有停止说&#34;这是一个提交编辑,使用--continue
当你完成时#34; 所以,没有理由为{exe}&#39; exec&#39;拨打post-rewrite
钩子。命令。
如果用户确实重写了提交,则会使用&#39;git commit --amend
&#39;已经调用了post-rewrite
钩子。将行为修复为:
- 在
stopped-sha
命令失败的情况下不留exec
个文件,- 并教导&#39;
git rebase --continue
&#39;如果,请跳过record_in_rewritten
找不到stopped-sha
个文件。
为了便于管理与rebase相关联的失败的exec指令,Git 2.21(2019年第一季度)引入了--reschedule-failed-exec
,其中包含&#34; git rebase -i
&#34;,它学会了重新执行命令用&#39; exec
&#39;在最后一次失败后运行。
commit 81ef8ee见commit 969de3f,commit d421afa,Johannes Schindelin (dscho
)(2018年12月10日)。{
(由Junio C Hamano -- gitster
--合并于commit d9d9ab0,2019年1月29日)
rebase
:介绍--reschedule-failed-exec
--exec
选项的常见用例是验证每次提交 在主题分支中通过git rebase -x make <base>
干净地编译。但是,当这样的rebase中的
exec
失败时,它不会被重新安排,在这种情况下不是特别有帮助。让我们提供一个标志来重新安排失败的
exec
命令。基于 Paul Morelle 的想法。
git rebase
man page现在包括:
--reschedule-failed-exec:: --no-reschedule-failed-exec::
自动重新安排失败的
exec
命令 这只适用于交互模式(或提供--exec
选项时)。
和
的快捷方式
rebase
:介绍--reschedule-failed-exec
在
--reschedule-failed-exec
之前一直写出-x <cmd>
选项有点麻烦;让我们同时介绍一个方便的选项:-y <cmd>
。
注意:第一次提交请参阅commit e11ff89(2019年2月6日)和commit 81ef8ee(2018年12月10日)Johannes Schindelin (dscho
)。
(Junio C Hamano -- gitster
--合并于commit b966813,2019年2月9日)
还原&#34; rebase:为--reschedule-failed-exec&#34;
引入快捷方式这个补丁只是作为一个暂定的提供&#34;我们可以介绍一个 如果我们不想更改默认行为,则方便的短选项 从长远来看&#34;补丁,开启讨论是否其他人 同意弃用目前的行为,转而支持重新安排 行为。
但是Git邮件列表上的共识是,在不久的将来显示警告是有意义的,并且默认情况下将默认
rebase.rescheduleFailedExec
翻转为重新安排失败的exec
命令。所以,让我们退出那个添加
-y
短选项的补丁 同意是没有必要或不可取的。
同样在Git 2.21(2019年2月):&#34; git rebase -x $cmd
&#34;没有拒绝多行命令,即使该命令无法处理这样的命令
它现在被拒绝了。
commit c762aad见Phillip Wood (phillipwood
)(2019年1月29日)
(由Junio C Hamano -- gitster
--合并于commit 96e6547,2019年2月7日)
rebase -x
:完整性检查命令如果用户向
--exec
提供一个空参数,那么git会创建一个待办事项 列表,它无法解析。在出错之前,rebase开始运行 用:error: missing arguments for exec error: invalid line 2: exec You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'. Or you can abort the rebase with 'git rebase --abort'.
在启动rebase之前检查空命令。
同时检查该命令是否包含任何换行符,因为待办事项列表格式无法处理多行命令。
请注意,在此更改之前,这会更改行为:git rebase --exec='echo one exec echo two'
它会在todo
列表中插入两个exec行,现在它会出错。