最初の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

2
この質問に遭遇した人は誰でも、最初のコミットのメッセージ変更することに対する私の答えを見つけることができますか?(git)参考になります。

回答:


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)を使用して、それが私を攻撃しました。
Henrik

まあ、それは一般的です:)そして、はい、あなたはそれを繰り返すことができます。追加-fしただけの場合、先に進み、常に指定されたブランチのコミットを書き換えます。refs/original/masterコマンドを実行する前に、最初の分岐参照値がに保存されました。
fork0

もちろん、保存した参照を削除(または名前を変更)するだけです。
fork0

2
コピーしたコミットIDの間違いが起こらないようにコードを更新しました。これで、コードはコピーして貼り付けることもできます。ただし、一言:最初のコミットが複数ある場合(つまり、2つ以上の無関係なブランチをマージした場合)は正しく機能しません
fork0

3
@hced:「公開された履歴」と見なされるコミットを書き直すことは通常悪い考えであることを認識しておく必要があります。あなたのケースでは、あなたのルートコミットを祖先として持つコミットに他の誰かが取り組んでいたなら、あなたは一般的にこれをするべきではないことを意味します。
Mark Longair 2012

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 --rootflorislaによって示唆されているように、移動するための方法です。
ダグラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.