Git:マージコミットのメッセージを編集/言い換える方法は?


147

マージコミットのメッセージを編集または言い換えるにはどうすればよいですか?

git commit --amend最後に行われたコミット(HEAD)であれば機能しますが、前にコミットされた場合はどうなりHEADますか?

git rebase -i HEAD~5 マージコミットは表示されません。

回答:


206

コマンドに--preserve-mergesオプション(またはその同義語、-p)を追加git rebase -iすると、gitは履歴を線形化するのではなく、リベース時にマージを保持しようとします。マージコミットも修正できるはずです。

git rebase -i -p HEAD~5

1
私はこれをやったが、私の変更を行ったとした後、私は試してみて、私はこれを取得、私の変更を押し上げる! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
マルク・

1
git push -fを実行してから、オリジンブランチを実行してみてください。これはうまくいくはずです。私は同じ問題を抱えていましたが、何らかの理由でこれはリベースのアーティファクトです。これは、基本的に起こったのは、リベースした後、分離されたhedになってしまったためです。
Radu Comaneci 2013

11
@Marcこれは、すでに送信したコミットを変更したために発生します。サーバーとあなたの同僚を完全に非同期にすることができるので、サーバーへのプッシュを強制することは悪い習慣と考えられています。まあ、あなたが一人でいるなら、それは問題ではないはずです。
ibizaman 2014年

HEAD~5変更するコミットの親はどこですか(通常はsha1 ^)。
Gabriel Devillers

2
--preserve-mergesis now--rebase-merges
OrangeDog

32

git1.7.9.6(およびgit1.7.10 +)を開始すると、マージに詳細を追加するために、git mergeそれ自体が常にエディターをトリガーすることに注意してください。

git merge $tag注釈付きタグをマージするための" "は、インタラクティブな編集セッション中に常にエディターを開きます。v1.7.10シリーズでは、古いスクリプトがこの動作を拒否できるように環境変数GIT_MERGE_AUTOEDITが導入されましたが、メンテナンストラックもこれをサポートする必要があります。

また、GIT_MERGE_AUTOEDIT古いスクリプトこの動作を拒否するのに役立つ環境変数が導入されています。

Git 1.7.10の予測」を参照してください。

最近、Gitメーリングリストに関する議論で、Linusは、これがGitの歴史の初期に私たちが犯した設計ミスの1つであることを認めました(そして私も同意しました)。
そして、1.7.10以降では、対話型セッション(つまり、標準入力と標準出力の両方が端末に接続されている)で実行されるgit mergeコマンドは、マージ結果を記録するコミットを作成する前にエディターを開き、ユーザーがマージについて説明する機会。衝突したマージを解決した後にユーザーが実行したgit commitコマンドと同じです。

Linusさんのコメント:

しかし、私はそれが実際にどのように機能するかを深く気にしません-私の主な問題は、gitが悪いマージメッセージを持つことをあまりにも簡単にしすぎることです。
その一部はさらに単純なバカだと思います。デフォルトで「git merge」のためにエディタを起動することさえありませんが、「git commit」のために実行します。
これは設計ミスでした。つまり、実際にマージにメモを追加したい場合は、追加の作業を行う必要があります。だから人々はそうしません


Git 2.17(2018年第2四半期)以前git rebase -pは、マージコミットのログメッセージが破損していることに注意してください。これは修正されました。

Gregory Herrero( ``)によるコミットed5144d(2018年2月8日)を参照してください。 提案者:Vegard Nossum(、およびQuentin Casasnovas((合併によりJunio C浜野- -8b49408コミット、2018年2月27日)を
vegardcasasnovas
gitster

rebase -p:呼び出し時の不正なコミットメッセージを修正しましたgit merge

以来dd6fb00コミット(「rebase -p:呼び出し時に修正引用git merge」、2018年1月には、Gitの2.16.0-RC2)は、サブシェルで実行『を使用して、マージコマンドに渡されリベースされたコミットマージのコミットメッセージgit rev-parse --sq-quote』。

git mergeコマンドの改行が保持されるように、このサブシェルを囲む二重引用符が必要です。

このパッチの前に、次のマージメッセージ:

"Merge mybranch into mynewbranch

Awesome commit."

になる:

"Merge mybranch into mynewbranch Awesome commit."

の後rebase -p


Git 2.23(2019年第2四半期)では、 " merge -c"中の" "命令git rebase --rebase-mergesにより、新しいマージを作成して既存のマージを置き換える必要がない場合でも、ログメッセージを編集する機会がユーザーに与えられるはずです(つまり、代わりに早送り) )、しかししませんでした。
これは修正されました。

Phillip Wood(によるコミット6df8df0(2019年5月2日)を参照してください。(合併によりJunio C浜野- -コミットc510261、2019年6月13日)phillipwood
gitster


16

プリミティブコマンドのみを使用した別の良い答え-knittlによるhttps://stackoverflow.com/a/7599522/94687

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

またはより良い(より正確な)最終的なrebaseコマンド:

git rebase <sha of merge> previous_branch --onto HEAD

ところで、プリミティブコマンドを使用すると、CPUを過度に消費せず、Gitがリベースする必要のあるコミットのリストについて考えるまで未知の時間を待つことができますgit rebase -p -i HEAD^^^^(このようなコマンドは私の場合、私の場合の最後のコミットと同じように、マージが最後の4つのコミットのみのリストには約50秒かかりました!)


2
これは本当に便利です。かなりの時間を節約できます。私の会社は--amendまたはrebaseコマンドで簡単にリポジトリの一部のコミットメッセージをブロックしますが、ブランチをマージして、コミットしてプッシュしようとすると、大きな問題が発生し、gitのデフォルトのマージメッセージがブロックされます(これは修正されるべきだと私は知っています)それは私たちにそのメッセージを変えることを強います この回答まで、私は多くのことを試して、成功していないコミットの履歴間のマージメッセージを変更しました。
Giovanni Silva

2

git merge --edit
非インタラクティブなマージの場合でもコメントを付けることができます。

git merge --edit --no-ff 開発ブランチに基づいてgitフローを追跡し、早送りせずにマージする場合に役立ちます。


2

現在のGitバージョン(2020年5月)の場合:

git rebase -i -r <parent>

次に、エディターmerge -C ...でに置き換えmerge -c ...ます。

これにより、リベース中にエディタでコミットメッセージが開き、変更できます。

ヒントについてはVonCに感謝します。)


0

git rebase -i HEAD~5このコマンドは、エディタをポップアップ表示されます。指定されたコミット(この場合は5つ)をリストします。最初の列にはpick、すべてのコミットが含まれています。そのエディターpickrewordに置き換えて、エディターを保存して閉じます。次に、gitは変更pickしたコミットごとにエディターをポップアップしreword、コミットメッセージを編集できるようにします。


6
これは-pgit rebaseコマンドに追加しない限り、マージコミットでは機能しません。
ポールプライス

4
それが別の質問だった場合の良い答え
doz87
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.