我们在命令行上使用内部工具来触发主分支上的还原。典型的呼叫类似
$ supertool revert SOME-TICKET
在内部,这个PHP工具运行
...
$result = shell_exec("git revert -m1 --no-commit <COMMIT HASH>");
...
对于与CCD_ 1相关联的所有提交。
我对恢复提交的默认提交消息很满意
Revert "<MESSAGE>"
This reverts commit <COMMIT HASH>.
我现在需要做的是在消息后面加一行,使其看起来像:
Revert "<MESSAGE>"
This reverts commit <COMMIT HASH>.
<ADDING A LINE HERE>
如果我在终端中执行git revert
,就会打开一个编辑器,我可以手动编辑提交消息。但是,当revert
命令由另一个程序发出时,我如何在交互式环境中将消息传递给git revert
?
理想情况下,我们的工具可以shell_exec
这个命令:
$result = shell_exec("git revert -message='...' -m1 --no-commit <COMMIT HASH>");
但我在git revert
文档中找不到这样的参数https://git-scm.com/docs/git-revert
对此有什么变通办法吗?
当您使用任何基于定序器的命令(revert和cherry-pick)并使用--no-commit
时,这些命令会在.git/MERGE_MSG
中留下默认消息,git commit
会在其中拾取它以进行进一步编辑。因此,可以简单地将结果附加到该文件,然后SOME-TICKET
0。
正如你所注意到的,这在任何地方都没有记录在案,因此它可能在未来崩溃。为了避免这种情况,您可能只需要生成自己的提交消息。例如,作为shell脚本,如果要恢复提交$H
,则添加额外的文本$extra
:
git revert --no-commit $H
[pause for user interaction as needed/desired]
tmpfile=$(mktemp)
printf >$tmpfile 'Revert %snnThis reverts commit %s.nn%s'
"$(git log --no-walk --pretty=format:%s $H)"
$H
"$extra"
git commit -F $tmpfile
rm $tmpfile
(根据需要对其进行更多的修改,例如,添加陷阱代码以在退出和/或信号时删除临时文件;mktemp
的-t
参数;等等)。
注意,当恢复合并时,sequencer.c
代码产生的不仅仅是通常的This reverts ...
消息:
if (opts->action == REPLAY_REVERT) {
base = commit;
base_label = msg.label;
next = parent;
next_label = msg.parent_label;
strbuf_addstr(&msgbuf, "Revert "");
strbuf_addstr(&msgbuf, msg.subject);
strbuf_addstr(&msgbuf, ""nnThis reverts commit ");
strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
if (commit->parents && commit->parents->next) {
strbuf_addstr(&msgbuf, ", reversingnchanges made to ");
strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
}
strbuf_addstr(&msgbuf, ".n");
} else {
当然,如果你选择不依赖.git/MERGE_MSG
,你也可以遵循这一点。
(顺便说一句,对于所有出现的.git
,请使用git rev-parse --git-dir
。)
Git 2.37(2022年第三季度)提供了一种可以避免任何脚本/钩子的替代方案:
"CCD_ 20">(man)学习--reference
选项,以使用对它在为用户准备的消息模板中回复的提交的更具人类可读性的引用。
参见Junio C Hamano(gitster
)提交的191faaf(2022年5月31日)和43966ab(2022年五月26日)
(由Junio C Hamano合并——gitster
——提交bfca631,2022年6月15日)
CCD_;参考";格式
典型的";CCD_ 25">(man)提交在其标题中使用原始提交的完整标题,并以开始其消息正文
This reverts commit 8fa7f667cf61386257c00d6e954855cc3215ae91.
这并不鼓励不仅描述";什么";(即
标题上的"还原X"说明了我们所做的)但是为什么";(即
,并且没有说明为什么X不受欢迎)。相反,我们可以将正文的第一行表述为更像
This reverts commit 8fa7f667 (do this and that, 2022-04-25)
这样标题就不必是
Revert "do this and that"
相反,我们可以使用标题来描述";为什么";我们正在恢复最初的提交。
介绍";CCD_ 26";选择";CCD_ 27";,以及revert.reference配置变量(默认为false),以在创建"提交"消息时调整草案提交消息的标题和第一行;恢复";犯罪
使用此选项时,预先填充的编辑器缓冲区的第一行变为注释行,告诉用户说为什么
如果用户退出编辑器时没有误触这一行,那么我们准备的内容将成为正文的第一行,即
"CCD_ 28";,最终成为结果提交的标题
这种行为被设计成帮助这样的用户在"恢复"中识别这样的恢复;CCD_ 29">(man),以便以后用CCD_。
git config
现在在其手册页中包括:
revert.reference
将此变量设置为true会使
git revert
行为就好像给出了CCD_ 34选项一样。
git revert
现在在其手册页中包括:
--reference
代替以"0"开始日志消息的正文;这则回复CCD_ 37&";,参考使用"提交"的提交;CCD_ 38";总体安排(参见
git log
)。
revert.reference
配置变量可用于启用此选项违约