回答:
コマンドに--preserve-merges
オプション(またはその同義語、-p
)を追加git rebase -i
すると、gitは履歴を線形化するのではなく、リベース時にマージを保持しようとします。マージコミットも修正できるはずです。
git rebase -i -p HEAD~5
HEAD~5
変更するコミットの親はどこですか(通常はsha1 ^)。
--preserve-merges
is now--rebase-merges
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日)をvegard
casasnovas
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
プリミティブコマンドのみを使用した別の良い答え-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秒かかりました!)
! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to