How do I reword the very first git commit message?
Solution 1
Do git rebase -i --root
(point to root
instead of pointing to a specific commit)
This way, the first commit is also included and you can just reword
it like any other commit.
The --root
option was introduced in Git v1.7.12
(2012). Before then the only option was to use filter-branch
or --amend
, which is typically harder to do.
Note: see also this similar question and answer.
Solution 2
pcreux's gist has a good way to reword the first commit:
# 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
Solution 3
You can always use 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
Comments
-
Henrik almost 2 years
I have a working tree containing 3 commmits:
➜ ~myproject git:(master)
git log
commit a99cce8240495de29254b5df8745e41815db5a75 Author: My Name <[email protected]> Date: Thu Aug 16 00:59:05 2012 +0200 .gitignore edits commit 5bccda674c7ca51e849741290530a0d48efd69e8 Author: My Name <[email protected]> Date: Mon Aug 13 01:36:39 2012 +0200 Create .gitignore file commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3 Author: My Name <[email protected]> Date: Mon Aug 13 01:13:05 2012 +0200 Initial commit (with a misleading message)
Now I wish to
reword
the commit message of my first commit (6707a66)➜ ~myproject git:(master)
git rebase -i 6707
(…entering 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
In this case, I wish to correct (
reword
in git parlance) the commit message in question:Initial commit (with a misleading message)
…to something appropriate.
Unsurprisingly, my attempt above didn't succeed since the first commit obviously doesn't have any parent commit. (And when you
rebase
, you need to reference the next oldest commit prior to the one you wish toreword
, right?)The gist of my question, thus, can you achieve this by any other means of doing it?
-
Henrik over 11 yearsfork0: That's great, thanks. Curious, is this to be considered "legitimate" practice, for lack of better word. I mean, is it common/recommended to do it like this? Also, can you do this time and time again in cases with faulty commit messages? Reason for asking that is because I first did it with the wrong commit SHA-1, copying your snippet (yours was the latest commit whereas I wanted to change the very first one). After using the command once again, this time with correct SHA-1 (first commit; 6707a66), it barfed on me.
-
fork0 over 11 yearsWell, it is common :) And yes, you can repeat it. If you just add
-f
it will go ahead and always rewrite the commits of the given branch. The branch reference value from the first time was saved inrefs/original/master
, before you ran the command. -
fork0 over 11 yearsOf course, you can just remove (or rename) the saved reference.
-
fork0 over 11 yearsI updated the code to make sure the mistake with copied commit id does not happen. Now the code is even copy-pastable. A word of warning, though: it does not work correctly if there are more than one initial commit (i.e. when you merged two or more unrelated branches)
-
Mark Longair over 11 years@hced: You should be aware that rewriting any commit that's considered to be "published history" is usually a bad idea. In your case, that would mean that you generally shouldn't do this if anyone else would ever have been working on a commit that had your root commit as an ancestor.
-
user276641 over 10 yearsAs of git 1.7.12,
git rebase -i --root
is the way to go, as suggested by florisla. -
Kate Donaldson about 2 yearsStill a hero in 2022