web-dev-qa-db-ja.com

gitで間違ったコミットメッセージを編集するにはどうすればいいですか(プッシュしました)?

コミットメッセージを履歴の中でさらに修正したいので、多くの新しいコミットをプッシュしました。

コミットメッセージを変更するにはどうすればよいですか?出来ますか?

149
Jimmy

Linus Torvaldsからのメッセージがあなたの質問に答えるかもしれません:

古いコミットメッセージの変更/編集

短い答え:できません(プッシュされた場合)。


抽出(LinusはBitKeeperをBKと呼びます):

サイドノート、歴史的興味からだけ:BKでできます。

そして、(私がそうだったように)それに慣れているなら、それは本当に非常に実用的でした。私はアンドリューからパッチ爆弾を適用し、何かが間違っていることに気付き、それを押し出す前に編集します。

Gitでも同じことができます。コミットメッセージだけを名前の一部にせずに、履歴が変更されていないことを保証し、「後でコメントを修正する」ことを許可するのは簡単だったでしょう。

しかし、私はしませんでした。

その一部は、純粋に「内部一貫性」です。 Gitは単純にcleanerシステムであり、すべてがSHA1で保護されており、オブジェクトタイプに関係なくすべてのオブジェクトが同じように扱われます。ええ、4種類のオブジェクトがあり、それらはすべて本当に異なり、同じ方法で使用することはできませんが、同時に、ディスク上でエンコードが異なる場合でも、conceptuallyこれらはすべてまったく同じように機能します。

しかし、内部の一貫性は実際には柔軟性がないという言い訳にはなりません。間違いが発生した後に修正することができれば、明らかに柔軟性があります。だから、それは本当に強力な議論ではありません。

real理由gitではコミットメッセージを変更できないため、非常に単純になります。そのようにして、メッセージを信頼できます。後で人々に変更を許可した場合、メッセージは本質的にあまり信頼できません。


完了するには、couldを使用して、目的の内容を反映するためにローカルコミット履歴を書き換えます sykoraが推奨 (withいくつかのリベースとリセット-ハード、あえぎ!)

ただし、改訂された履歴を公開するとagaingit Push Origin +master:master、プッシュを強制する+記号、 「早送り」コミットにならない場合)... 何らかのトラブルが発生する可能性があります

この他のSO質問から抽出:

私は実際に--forceでgit.gitリポジトリにプッシュし、Linus BIG TIMEにbyられました。それは他の人にとって多くの問題を引き起こすでしょう。簡単な答えは「やってはいけない」です。

125
VonC

現在、 git replace がトリックを行う可能性があります。

詳細:一時的な作業ブランチを作成する

git checkout -b temp

置き換えるコミットにリセットする

git reset --hard <sha1>

適切なメッセージでコミットを修正する

git commit --amend -m "<right message>"

古いコミットを新しいものに置き換えます

git replace <old commit sha1> <new commit sha1>

あなたがいたブランチに戻ります

git checkout <branch>

一時ブランチを削除

git branch -D temp

押す

guess

できた。

26
Johan

インタラクティブにはgit rebase -i(分岐元のブランチに対して) 'i'を使用できます。

変更するコミットコメントの横のpickr(またはreword)に置き換え、保存して終了すると、編集を行うことができます。

git Pushもう一度すれば完了です!

17
Marcus

次のようなツリーがあるとします:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

まず、checkout tempブランチ:

git checkout -b temp

tempブランチで、メッセージを変更するコミットにreset --hardします(たとえば、そのコミットは946992):

git reset --hard 946992

amendを使用して、メッセージを変更します。

git commit --amend -m "<new_message>"

その後、ツリーは次のようになります。

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]

次に、cherry-pick946992からmasterからtempへのすべてのコミットをコミットし、それらをコミットします。メッセージも変更する場合は、amendを使用します。 :

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>

ツリーは次のようになります。

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]

次に、tempブランチをリモートに強制的にプッシュします。

git Push --force Origin temp:master

最後のステップは、ローカルのブランチmasterを削除し、git fetch Originからブランチmasterをサーバーからプルし、ブランチmasterに切り替えて、ブランチtempを削除します。

これで、ローカルとリモートの両方ですべてのメッセージが更新されます。

13
Huy Vo

当店では、認識できない名前の注釈付きタグを誤ったメッセージでコミットに追加し、その注釈を置換として使用する規則を導入しました。

これは、カジュアルな「git log」コマンドを実行する人には役に立たないが、コメント内の誤ったバグトラッカーの参照を修正する方法を提供し、すべてのビルドツールとリリースツールは規約を理解します。

これは明らかに一般的な答えではありませんが、特定のコミュニティ内で採用できるものかもしれません。これが大規模に使用されていると、何らかの磁器のサポートが最終的に現れる可能性があります...

5

http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c から)

コミットを履歴のより深く変更する方法

Gitの履歴は不変であるため、最新のコミット(ブランチヘッドではないコミット)以外のすべてを修正するには、変更されたコミットおよびフォワードから履歴を書き換える必要があります。

そのためにStGITを使用し、必要に応じてブランチを初期化し、変更したいコミットまでコミットせず、必要に応じてポップし、変更してからパッチを更新します(コミットメッセージを修正する場合は-eオプションを使用)、次にプッシュすべてとstgがコミットします。

または、リベースを使用してそれを行うことができます。新しい一時ブランチを作成し、git reset --hardを使用して変更したいコミットに巻き戻し、そのコミットを変更し(現在の先頭になります)、次にgit rebase --ontoを使用して変更されたコミットの先頭にブランチをリベースします。

または、git rebase --interactiveを使用して、パッチの並べ替え、折りたたみなどのさまざまな変更を行うことができます。

あなたの質問に答えるべきだと思います。ただし、リモートリポジトリにpushedコードがあり、人々がそこからプルした場合、コード履歴が台無しになることに注意してください。そして彼らがやった仕事。慎重に行ってください。

2
sykora