Git:如何在'git reset'之后重用/保留提交消息?


103

正如吉特用户经常我遇到的情况,我需要在不适合的方式来返工一个或更多的提交--amendrebase -i与修正的提交。通常我会做类似的事情

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

我非常认真地对待明智的编写提交消息。它们通常包含较大的文本,并带有更改的引用和说明。到目前为止,我对冗长的过程非常恼火,因为它需要通过未排序的git refloggit log复制和粘贴过程来恢复我的旧提交消息。

有更好的解决方案吗?如果我的提交不止一次,怎么办?

编辑:对此进行了一点思考之后,我认为我正在寻找的是类似git stash的提交消息功能,其中修正/修改提交不合适。


2
如果您所做的全部git reset head~1,您的旧提交消息是否仅会成为reflog?中的第二个条目?

是的-但是我如何能够在没有复制和粘贴的情况下重用消息(通常需要手动缩进)
bentolor

如今,只需gitk开放。这样,您甚至不必使用reflog。或者,使用rev-parse <branch>来在重置之前获取您的哈希值,并使用ibizaman的答案。
cst1992 '16

Answers:


141

经过git reset,此单线代码即可:

git commit --reuse-message=HEAD@{1}

甚至更短:

git commit -C HEAD@{1}

您可以使用@ user2718704给出的其他选项。


6
简短说明:git commit -C@@{1}
Phu Ngo

2
这是reflog的绝佳用法
David Mann

22
重置后,将设置ORIG_HEAD。我发现git commit --reuse-message=ORIG_HEAD是最清楚的。
Scott Jacobsen,

45

运行“ git commit”命令时,您必须检查以下选项,

要重复使用,

--reuse-message=<commit>

要编辑重用,

--reedit-message=<commit>

要更改作者,

--reset-author

1
将此标记为新解决方案,因为它提供了最全面的答案。尽管此解决方案仍不能完全解决我的“检索”问题。
bentolor

9

如果可以修改,修复,修改然后再运行git commit --amend --no-edit,为什么还要重置;因此,保留您的原始提交消息。

要使其适用于多个提交,只需创建具有最新更改的临时提交,然后使用交互式变基将新提交的临时提交(包含良好提交消息)与新的临时提交压缩在一起,并保留旧提交的提交消息。


2
在进行交互式基准时,您甚至可以使用fixup指令声明以后的提交是要修复先前的提交,它将自动使用原始提交中的提交消息,而不是来自fixup提交的消息。
qqx

例如,如果我想重新合并强制更新的拉取请求。或者,如果提交不是最后一次提交,并且无法基于HEAD轻松修复,并且更容易重做。
bentolor

@BenTebulin好吧,交互式基础可以让您修改指定提交范围内的任何提交。并非必须修改HEAD提交。
mart1n

@ mart1n感谢挑出编辑rebase -i。从未在这种情况下使用过它。对于剩下的情况,例如重新合并另一个答案更适合我的问题,因此我将其标记为答案。
bentolor

Intellij的作用域仅对尚未提交的文件起作用。将文件重置为未提交很有用,例如,可以指示intellij整理文件,然后使用相同的消息重新提交这些文件。由于intellij的范围限制,amend不会为此工作。
戴维·曼

5

您可以考虑使用git commit --reset-author -c <commit>,以便在编辑和当前时间重复使用提交消息。


谢谢-这很接近我一直在寻找的东西。
bentolor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.