回答:
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 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
完了しました。
git rebase -i
(分岐元のブランチに対して) 'i'をインタラクティブに使用できます。
pick
変更したいコミットコメントの隣をr
(またはreword
)に置き換え、保存して終了します。そうすると、編集を行うことができます。
git push
もう一度、あなたは終わりました!
-p
の引数rebase
たp
マージを留保します。
次のようなツリーがあるとします。
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
先のすべてのコミットとそれらをコミットします。メッセージも変更したい場合は、次を使用します。946992
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
です。
これで、ローカルとリモートの両方ですべてのメッセージが更新されます。
私たちのショップでは、間違ったメッセージでコミットするために、わかりやすい名前の注釈付きタグを追加し、その注釈を代わりに使用するという規則を導入しました。
これはカジュアルな「git log」コマンドを実行する人には役立ちませんが、コメント内の誤ったバグトラッカー参照を修正する方法を提供し、すべてのビルドツールとリリースツールは規則を理解しています。
これは明らかに一般的な答えではありませんが、特定のコミュニティ内で採用できるものかもしれません。これがより大きな規模で使用される場合、それに対する何らかの磁器サポートが最終的に出現する可能性があると確信しています...
(http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0から)
歴史を深くコミットを変更する方法
Gitの履歴は不変であるため、最新のコミット(ブランチヘッドではないコミット)以外を修正するには、変更されたコミットから履歴を書き直して転送する必要があります。
そのためにStGITを使用し、必要に応じてブランチを初期化し、変更するコミットまでコミット解除し、必要に応じてそこにポップし、変更を加えてパッチを更新し(コミットメッセージを修正する場合は-eオプションを使用)、プッシュします。すべてとstgコミット。
または、リベースを使用してそれを行うことができます。新しい一時ブランチを作成し、git reset --hardを使用して変更するコミットに巻き戻し、そのコミットを変更します(現在のヘッドの先頭になります)、次にgit rebase --ontoを使用して変更されたコミットの上にブランチをリベースします。
または、git rebase --interactiveを使用して、パッチの並べ替え、折りたたみなどのさまざまな変更を行うことができます...
私はそれがあなたの質問に答えるべきだと思います。ただし、リモートリポジトリにコードをプッシュし、そこからユーザーがプルした場合は、これにより、コードの履歴と実行した作業が台無しになります。慎重に行ってください。