我如何重写第一个 git 提交消息?

我有一个包含3个提交的工作树:

Something ~ myproject git: (master) 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)的提交消息

Something ~ myproject git: (master) 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

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

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

变得合适。

毫不奇怪,我上面的尝试没有成功,因为第一次提交显然没有任何 家长提交。(当您使用 rebase时,您需要将下一个最老的提交 副院长引用到您希望使用的 reword,对吗?)

因此,我的问题的要点是,你能通过任何其他方法来达到这个目的吗?

22825 次浏览

你可以随时使用 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

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

git rebase -i --root

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

这样,第一次提交也包括在内,您可以像其他提交一样对它进行 reword

--root选项是在 Git v1.7.12(2012)中引入的。在那之前,唯一的选择就是使用 filter-branch--amend,这通常比较困难。

注: 另见 这个类似的问题和答案