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


152

履歴メッセージをより深く変更したいので、新しいコミットを多数プッシュしました。

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

回答:


125

Linus Torvaldsからのメッセージがあなたの質問に答えるでしょう:

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

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


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

余談ですが、歴史的な関心はありません。BKでは可能です。

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

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

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

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

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

本当の道、あなたがメッセージを信頼できること:理由gitのは、あなたは非常に単純で、最大メッセージの終了をコミットを変更することはできません。後で人々がそれらを変更することを許可した場合、メッセージは本質的にあまり信頼できません。


完全にするために、あなたは可能性として、あなたが望むものを反映させるためには、あなたの地元のコミットの歴史を書き換えsykoraによって提案された(一部のリベースとリセット--hardと、息をのみます!)

あなたの改訂の歴史を公開するとしかし、再び(とgit push origin +master:master+...あなたはプッシュを強制する記号は、それが「早送り」コミットが発生していない場合でも、発生する)いくつかのトラブルに巻き込まれるかもしれません

この他のSOの質問から抽出します。

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


いい答えだ。新しいバージョンのgitですでにプッシュされたコミットメッセージを変更できるかどうかをご存知ですか?これが'09に投稿されてから変更はありますか?
David West

@DavidWestでも同じ原則が適用されます。履歴を書き換えて強制的にプッシュできます。
VonC、2014

2
より具体的にするために、コミットを修正またはリベースすると、そのコミット識別子(gitインデックスの16進数のハッシュ)は必然的に変更されます。これは、編集されたコミットがgit VCS履歴の古いコミットとは異なる方法で処理されることを意味します。つまり、開発チームのメンバーが残念ながらすでに古いコミットをプルしている場合、編集済みの新しいコミットをプルし、ローカルの作業コピーで新旧のマージを実行する義務があります。
Shigerello、2014年

1
同僚の便宜のために、編集されたコミットを新たにプッシュすることをお勧めします。これにより、同僚の作業コピーでマージする必要がなくなります。
Shigerello、2014年

28

現在、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

完了しました。


11
@Jonah:リモートブランチにプッシュしようとすると、「すべて最新」のメッセージが表示される
Simon Kagwi

1
別の回答で述べたように、rebaseでrebase -iを使用します。そして、それは歴史を書き換えます。
シルヴァン

私が探していた解決策をありがとう。あなたは私の時間を節約します!
Tomasz Kuter 2014

1
@ジョナ-問題があります...あなたの解決策はコミットログをローカルではなくリモートで更新しました。それらをそこにプッシュする方法は?
Tomasz Kuter 2014

1
@TomaszKuter、私はあなたと同じ問題を抱えていました。コミットメッセージがリモートで更新されませんでした。私はGitHubの次のヘルプを使用して解決しました:help.github.com/articles/changing-a-commit-message。従う:古いまたは複数のコミットメッセージのメッセージの修正セクション。これは基本的に、user987419が下から提供する回答です。すでにコミットメッセージを変更している場合は、再度変更せずに選択して保存できます。
evaldeslacasa 2015年

19

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

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

git push もう一度、あなたは終わりました!


1
これはマージコミットでメッセージを編集することを許可しません。このコマンドのいくつかのバリアントでそれは可能ですか?
Andrew Mao

1
お試し-pの引数rebasepマージを留保します。
サボテン

3
私はこの手順が好きですが、最初は答えがよくわかりませんでした。誰かが助けを必要としている場合に備えて、Githulbのヘルプページはそれに関する良い情報を提供します: help.github.com/articles/changing-a-commit-message
evaldeslacasa

15

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

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

まず、checkout一時ブランチ:

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]

次に、to からcherry-pick先のすべてのコミットとそれらをコミットします。メッセージも変更したい場合は、次を使用します。946992mastertempamend

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です。

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


5

私たちのショップでは、間違ったメッセージでコミットするために、わかりやすい名前の注釈付きタグを追加し、その注釈を代わりに使用するという規則を導入しました。

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

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


3
「git notes」は同様の目的を果たすかもしれません
クリスチャンゲッツェ

2

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

歴史を深くコミットを変更する方法

Gitの履歴は不変であるため、最新のコミット(ブランチヘッドではないコミット)以外を修正するには、変更されたコミットから履歴を書き直して転送する必要があります。

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

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

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

私はそれがあなたの質問に答えるべきだと思います。ただし、リモートリポジトリにコードをプッシュし、そこからユーザーがプルした場合は、これにより、コードの履歴と実行した作業が台無しになります。慎重に行ってください。


理論的には良い答えですが、実際には
非常に

0

Git拡張機能を使用している場合:コミット画面に移動すると、下に表示されているように、下部に「コミットを修正する」というチェックボックスがあります。

ここに画像の説明を入力してください


@KrunalPandyaはい、または単にコミットしてプッシュ
batsheva
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.