履歴のより深いコミット メッセージを変更したいので、多くの新しいコミットをプッシュしました。
コミットメッセージを変更するにはどうすればよいですか? 出来ますか?
履歴のより深いコミット メッセージを変更したいので、多くの新しいコミットをプッシュしました。
コミットメッセージを変更するにはどうすればよいですか? 出来ますか?
Linus Torvalds からのメッセージがあなたの質問に答えるかもしれません:
短い答え: できません (押された場合)。
抽出 (Linus は BitKeeper を BK と呼んでいます):
余談ですが、歴史的な興味から: BK では可能でした。
もしあなたが(私のように)それに慣れていれば、それは本当に非常に実用的でした. アンドリューからパッチボムを適用し、何かがおかしいことに気づき、プッシュする前に編集するだけでした。
git でも同じことができたはずです。コミットメッセージだけを名前の一部にしないようにし、履歴が変更されていないことを保証し、「後でコメントを修正する」ことを許可するのは簡単だったでしょう。
しかし、私はしませんでした。
その一部は、純粋に「内部の一貫性」です。Git は 、オブジェクトの種類に関係なく、すべてが SHA1 で保護され、すべてのオブジェクトが同じように扱われるため、シンプルなシステムです。4 種類のオブジェクトがあり、それらはすべてまったく異なります。同じように使用することはできませんが、同時に、ディスク上でのエンコーディングが異なる場合でも、概念的にはすべて正確に機能します。同じ。
しかし、内部の一貫性は、実際には柔軟性がないことの言い訳にはなりません。間違いが起こった後に修正できれば、非常に柔軟になることは明らかです。だから、それは本当に強い議論ではありません。
git がコミット メッセージの変更を許可しない本当の理由は非常に単純です。そうすれば、メッセージを信頼できます。後で変更できるようにすると、メッセージは本質的にあまり信頼できなくなります。
完全にするには、sykora が示唆するように、必要なものを反映するためにローカルのコミット履歴を書き換えることができます(いくつかのリベースとリセットを使用して、ハード、あえぎ!)
ただし、修正した履歴を再度公開すると ( "早送り" コミットにならなかったとしても、プッシュを強制するgit push origin +master:master
,記号が表示されます)...トラブルが発生する可能性があります。+
この他の SO の質問から抽出します。
実際に --force で git.git リポジトリに push したことがあり、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
もう一度やり直して完了です。
次のようなツリーがあるとします。
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]
次に、それらのメッセージも変更する場合は、それらをコミットしてそれらをコミット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コミット。
または、rebase を使用してそれを行うことができます。新しい一時ブランチを作成し、 git reset --hard を使用して変更したいコミットに巻き戻し、そのコミットを変更し (現在のヘッドの先頭になります)、 git rebase --onto を使用して、変更されたコミットの上にブランチをリベースします。
または、パッチの並べ替え、折りたたみなどのさまざまな変更を可能にする git rebase --interactive を使用できます。
それはあなたの質問に答えるべきだと思います。ただし、コードをリモート リポジトリにプッシュし、人々がそこからプルした場合、コードの履歴と彼らが行った作業が台無しになることに注意してください。だから慎重にやってください。