web-dev-qa-db-ja.com

マージの競合を解決した後、デフォルトのgitコミットメッセージを使用する方法は?

マージを実行して競合を解決した後、コマンドラインからデフォルトで生成されたコミットメッセージを受け入れる「簡単な」方法はありますか?開発者の1人がすべての競合を解決してから、git commit -m"Merge Commit"は、すべての競合ファイルをリストした生成されたコミットメッセージを置き換えます。現在のファイルを変更せずに取得する別のフラグが必要です。 -Fまたは--file =オプションがあることは知っていますが、そのためには常にファイル名を知っている必要があります。

ありがとうございました

53
yoyodyn

明らかに、ここでの「正しい」答えは、開発者がマージコミットを生成するときにチームの正しいプラクティスに従うようにすることです。使用したい動作がデフォルトであり、最近ではgitがマージのために「人間が生成した」コミットメッセージを要求し始めていることに注意してください。それには理由があり、開発者が無意味なメッセージでプロセスを短絡させることはありませんでした。

開発者は、代わりにリベースする必要があるときにマージコミットを生成している可能性がありますか?

ただし、マージコミットはgit fmt-merge-msgの出力であり、マージコミットの親にフィードする必要があります。

7
Andy Ross

ドキュメント ごとに、この単純なコマンドを試したところ、うまくいきました:

git commit --no-edit

その後、git logを実行して、デフォルトのメッセージが使用されたことを確認します。

80
gMale

デフォルトでは、マージが失敗すると、使用されるコミットメッセージはgitフォルダーのファイル(通常は.git/MERGE_MSG)に保存されます。競合が解決された後、git commitを実行すると、この保存されたメッセージがデフォルトのエディターに送られます。

メッセージがそれ自体でピックアップされていない場合、ファイルからコミットメッセージを読み取る--fileオプションを使用してgitコマンドにフィードできます。

git commit --file .git/MERGE_MSG
18
LopSae

何もしないコマンドにエディターを設定するだけです:

GIT_EDITOR=true git commit
14
Chronial

_git commit --file .git/MERGE_MSG_は既に述べたように問題ありませんが、いくつかの点を無視します:

  • 現在のディレクトリは最上位ディレクトリではありません
  • 現在のリポジトリはGitサブモジュールであるため、_.git_ディレクトリはなく、ファイル_.git_があります。

オプションで:

  • _MERGE_MSG_には、競合のあるファイルに関する情報が含まれています。

最初の2つのポイントは、_git rev-parse_で使用できます。

_git commit -F "$(git rev-parse --git-dir)/MERGE_MSG"
_

または、代わりに、Gitエイリアスを使用します。

_commit-merge = !cat $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -
_

これは、「通常の」リポジトリとサブモジュールの両方で機能します。 _#_-マークの競合マーカーを破棄する必要がある場合、簡単にするために、マージメッセージの最初の行のみを取得できます。

_git commit -m $(head -1 $(git rev-parse --git-dir)/MERGE_MSG)
_

または別のエイリアス:

_commit-merge = !head -1 $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -
_

エイリアスで_-F_キーを使用する必要があったのは、bashを使用して生成されたコマンドでGitに処理される引用符を発行させることができなかったためです(そうでない場合、_git commit_はマージ中の部分コミットに対して文句を言います)。


リリース済み 2日前のGit 2.12.0では、_git merge --continue_が導入され、マージ中に競合が発生したときに停止したマージコミットが行われます。サブモジュールでも同様に動作しますが、少なくとも_--no-edit_は受け入れないため、エディターはマージを完了する前にコミットメッセージを変更することをお勧めします。

3

このルールを本当に実行したい場合は、gitフックを使用してこれを強制する方法があるかもしれません。

マージの競合が発生するたびに、「combined diff」により、競合したファイルが表示されます:git diff HEAD HEAD^1 HEAD^2 --name-only。技術的には、結合されたdiffが競合するものよりもmoreファイルを表示できるかどうかはわかりません。

しかし、私たちが望むように動作すると仮定すると(これは仮定です)、git commit-msgメッセージをチェックするフックユーザーが入力したとアサート

  1. これはマージコミットですか?
  2. もしそうなら、結合された差分はファイルを表示しますか?
  3. その場合、文字列「Conflicts:」の後にそれらのファイル名が続きますか?

これらの条件が失敗した場合は、スクリプトを印刷して問題点の説明を表示させ、ゼロ以外を返してコミットを中止します。開発者にこのコミットフックをインストールさせるか、サーバーにインストールして確実に強制することができます。

0
Alexander Bird