如何改写第一个git commit消息?


116

我有一棵包含3个命令的工作树:

➜〜myproject git :(主) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <my@mail.com>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

现在我希望第一次提交reword的提交消息(6707a66)

➜〜myproject git :(主) git rebase -i 6707

(…进入vim)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

在这种情况下,我希望更正(reword以git的说法)有问题的提交消息:

初次提交(带有误导性消息)

……采取适当的措施。

毫不奇怪,我的上述尝试没有成功,因为第一次提交显然没有任何提交。(当你rebase,你需要引用下一个最早提交之前您要的一个reword,对吧?)

因此,我的问题的要点是,您可以通过其他任何方式来实现这一目标吗?


或者,您也可以将其作为存储库杂种古怪的东西放任
克里斯托弗·


^非常正确...我以为我已经对这个特定问题进行了适当的搜索,但这与我的问题相同。有大量完善我的问题的文案写作的方法。:-P
Henrik

1
@hced::)您的广告文案不会浪费-它将帮助其他人在将来找到解决方案,即使它被关闭也是如此
Mark Longair 2012年

2
遇到此问题的任何人都可以找到我的答案,更改第一次提交的消息?(git)会有所帮助。

Answers:


214

git rebase -i --root

(指向root而不是指向特定的提交)

这样,第一次提交也包括在内,您可以reword像其他任何提交一样进行操作。

--root选项在Git v1.7.12(2012)中引入。在此之前,唯一的选择是使用filter-branch--amend,通常很难做到。

注意:另请参阅类似的问答


12

您可以随时使用git filter-branch --msg-filter

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master

1
fork0:很好,谢谢。奇怪的是,由于缺乏更好的用词,这被认为是“合法”的做法。我的意思是,这样做是普遍的还是建议的?另外,在提交错误的消息中,您可以一次又一次地执行此操作吗?问这个的原因是因为我首先使用错误的SHA-1提交,复制了您的摘要(您是最新的提交,而我想更改第一个)。再次使用命令后,这次使用正确的SHA-1(首次提交; 6707a66),它对我发了怒。
亨里克

好吧,这很常见:)是的,您可以重复一遍。如果只添加-f它,它将继续进行并始终重写给定分支的提交。refs/original/master在运行命令之前,第一次的分支参考值已保存在中。
fork0 2012年

当然,您可以删除(或重命名)保存的参考。
fork0 2012年

2
我更新了代码,以确保不会发生带有复制提交ID的错误。现在,代码甚至可以复制粘贴了。一个字的警告,虽然:它不正确,如果有工作超过一个初始提交(即当您合并两个或多个不相关的分支机构)
fork0

3
@hced:您应该意识到,重写任何被认为是“已发布历史”的提交通常是一个坏主意。在您的情况下,这意味着如果其他任何人曾经从事过以您的根提交为祖先的提交工作,则通常不应该这样做。
Mark Longair

12

pcreux的要旨有一个很好的方法来重新编写第一次提交:

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master

3
由于git的1.7.12git rebase -i --root是去,通过florisla所建议的方式。
道格拉斯
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.