日本語 ▾ トピック ▾ 最新バージョン ▾ git-mergetool 最終更新日: 2.45.0

名前

git-mergetool - マージの競合を解決するためにマージ競合解決ツールを実行する

概要

git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…​]

説明

git mergetool を使用して、いくつかのマージユーティリティのいずれかを実行し、マージの競合を解決します。通常、git merge の後に実行されます。

1つ以上の <file> パラメータが与えられた場合、マージツールプログラムは各ファイル内の差分を解決するために実行されます(競合がないファイルはスキップされます)。ディレクトリを指定すると、そのパス内のすべての未解決ファイルが含まれます。<file> 名が指定されていない場合、git mergetool はマージの競合があるすべてのファイルに対してマージツールプログラムを実行します。

オプション

-t <tool>
--tool=<tool>

<tool> で指定されたマージ解決プログラムを使用します。有効な値には、emerge、gvimdiff、kdiff3、meld、vimdiff、tortoisemerge があります。有効な <tool> 設定のリストについては、git mergetool --tool-help を実行してください。

マージ解決プログラムが指定されていない場合、git mergetool は設定変数 merge.tool を使用します。設定変数 merge.tool が設定されていない場合、git mergetool は適切なデフォルトを選択します。

設定変数 mergetool.<tool>.path を設定することで、ツールのフルパスを明示的に指定できます。例えば、mergetool.kdiff3.path を設定することで kdiff3 の絶対パスを設定できます。そうでない場合、git mergetool はツールが PATH で利用可能であると仮定します。

既知のマージツールプログラムのいずれかを実行する代わりに、mergetool.<tool>.cmd という設定変数で呼び出すコマンドラインを指定することで、git mergetool を別のプログラムを実行するようにカスタマイズできます。

git mergetool がこのツールで呼び出された場合(-t または --tool オプション、または merge.tool 設定変数を通じて)、設定されたコマンドラインが呼び出され、マージの共通のベースを含む一時ファイルの名前に $BASE が設定され(利用可能な場合)、現在のブランチのファイルの内容を含む一時ファイルの名前に $LOCAL が設定され、マージされるファイルの内容を含む一時ファイルの名前に $REMOTE が設定され、マージツールがマージ解決の結果を書き込むファイルの名前に $MERGED が設定されます。

カスタムマージツールがその終了コードでマージ解決の成功を正しく示す場合、設定変数 mergetool.<tool>.trustExitCodetrue に設定できます。そうでない場合、git mergetool はカスタムツールが終了した後、解決の成功を示すようユーザーにプロンプトを表示します。

--tool-help

--tool とともに使用できるマージツールのリストを表示します。

-y
--no-prompt

マージ解決プログラムの各呼び出し前にプロンプトを表示しません。これは、--tool オプションまたは merge.tool 設定変数でマージ解決プログラムが明示的に指定されている場合のデフォルトです。

--prompt

マージ解決プログラムの各呼び出し前にプロンプトを表示し、ユーザーにパスをスキップする機会を与えます。

-g
--gui

git-mergetool-g または --gui オプションで呼び出された場合、デフォルトのマージツールは merge.tool ではなく設定された merge.guitool 変数から読み取られます。merge.guitool が設定されていない場合、merge.tool で設定されたツールにフォールバックします。これは、設定変数 mergetool.guiDefault を使用して自動選択できます。

--no-gui

これは、以前の -g または --gui 設定、または mergetool.guiDefault 設定を上書きし、設定された merge.tool 変数からデフォルトのマージツールを読み取ります。

-O<orderfile>

<orderfile> で指定された順序でファイルを処理します。<orderfile> は1行につき1つのシェルグロブパターンを含みます。これは diff.orderFile 設定変数を上書きします (git-config[1] を参照)。diff.orderFile をキャンセルするには -O/dev/null を使用します。

設定

このセクションのこれ以降の内容は、git-config[1] ドキュメントから選択的に含まれています。内容はそちらと同一です。

mergetool.<tool>.path

指定されたツールのパスを上書きします。これは、ツールが PATH にない場合に便利です。

mergetool.<tool>.cmd

指定されたマージツールを起動するコマンドを指定します。指定されたコマンドは、以下の変数が利用可能なシェルで評価されます: BASE はマージされるファイルの共通ベースを含む一時ファイルの名前 (利用可能な場合); LOCAL は現在のブランチ上のファイルの内容を含む一時ファイルの名前; REMOTE はマージされるブランチからのファイルの内容を含む一時ファイルの名前; MERGED はマージツールが成功したマージの結果を書き込むべきファイルの名前。

mergetool.<tool>.hideResolved

ユーザーが特定のツールに対してグローバルな mergetool.hideResolved の値を上書きできるようにします。完全な説明については mergetool.hideResolved を参照してください。

mergetool.<tool>.trustExitCode

カスタムマージコマンドの場合、マージが成功したかどうかを判断するためにマージコマンドの終了コードを使用できるかどうかを指定します。これがtrueに設定されていない場合、マージターゲットファイルのタイムスタンプがチェックされ、ファイルが更新されていればマージは成功したと見なされます。それ以外の場合、マージの成功を示すようユーザーにプロンプトが表示されます。

mergetool.meld.hasOutput

古いバージョンの meld--output オプションをサポートしていません。Git は meld --help の出力を検査することで、meld--output をサポートしているかどうかを検出しようとします。mergetool.meld.hasOutput を設定すると、Git はこれらのチェックをスキップし、設定された値を使用します。mergetool.meld.hasOutputtrue に設定すると、Git は無条件に --output オプションを使用し、false に設定すると --output の使用を回避します。

mergetool.meld.useAutoMerge

--auto-merge が与えられると、meld はすべての競合しない部分を自動的にマージし、競合する部分をハイライトし、ユーザーの決定を待ちます。mergetool.meld.useAutoMergetrue に設定すると、Git は meld とともに --auto-merge オプションを無条件に使用します。この値を auto に設定すると、git は --auto-merge がサポートされているかどうかを検出し、利用可能な場合にのみ --auto-merge を使用します。値が false の場合、--auto-merge は一切使用されず、これがデフォルト値です。

mergetool.<vimdiff variant>.layout

vimdiff の <variant> (vimdiff, nvimdiff, gvimdiff のいずれか) の分割ウィンドウレイアウトを設定します。--tool=<variant> (または merge.tool<variant> に設定されている場合は --tool なし) で git mergetool を起動すると、Git はツールのレイアウトを決定するために mergetool.<variant>.layout を参照します。バリアント固有の設定が利用できない場合は、vimdiff の設定がフォールバックとして使用されます。それも利用できない場合は、4つのウィンドウを持つデフォルトのレイアウトが使用されます。レイアウトを設定するには、BACKEND SPECIFIC HINTS セクションを参照してください。

mergetool.hideResolved

マージ中、Git は可能な限り多くの競合を自動的に解決し、解決できない競合の周りに競合マーカーを含む MERGED ファイルを書き込みます。LOCALREMOTE は通常、Git の競合解決前のファイルのバージョンを表します。このフラグを設定すると、LOCALREMOTE が上書きされ、未解決の競合のみがマージツールに提示されます。mergetool.<tool>.hideResolved 設定変数を使用して、ツールごとに設定できます。デフォルトは false です。

mergetool.keepBackup

マージを実行した後、競合マーカー付きの元のファイルは .orig 拡張子のファイルとして保存できます。この変数が false に設定されている場合、このファイルは保持されません。デフォルトは true です(つまり、バックアップファイルを保持します)。

mergetool.keepTemporaries

カスタムマージツールを呼び出す際、Git はツールに渡すための一時ファイルのセットを使用します。ツールがエラーを返し、この変数が true に設定されている場合、これらの一時ファイルは保持されます。そうでない場合、ツールが終了した後に削除されます。デフォルトは false です。

mergetool.writeToTemp

Git はデフォルトで、競合するファイルのワークツリーに一時的な BASELOCALREMOTE バージョンを書き込みます。true に設定されている場合、Git はこれらのファイルに一時ディレクトリを使用しようとします。デフォルトは false です。

mergetool.prompt

マージ解決プログラムの各呼び出し前にプロンプトを表示します。

mergetool.guiDefault

デフォルトで merge.guitool を使用するように true に設定するか (--gui 引数を指定するのと同等)、または DISPLAY 環境変数の値の有無に応じて merge.guitool または merge.tool を選択するように auto に設定します。デフォルトは false であり、merge.guitool を使用するには --gui 引数を明示的に指定する必要があります。

一時ファイル

git mergetool はマージを解決する際に *.orig バックアップファイルを作成します。これらはファイルがマージされ、git mergetool セッションが完了した後であれば安全に削除できます。

mergetool.keepBackup 設定変数を false に設定すると、ファイルが正常にマージされる際に git mergetool がバックアップファイルを自動的に削除します。

バックエンド固有のヒント

vimdiff

説明

git mergetool--tool=vimdiff を指定すると、Git は以下のように4つのウィンドウレイアウトでVimを開きます。

------------------------------------------
|             |           |              |
|   LOCAL     |   BASE    |   REMOTE     |
|             |           |              |
------------------------------------------
|                                        |
|                MERGED                  |
|                                        |
------------------------------------------

LOCAL, BASE および REMOTE は、特定のコミット(それぞれ「マージ中のコミット」、「共通の祖先コミット」、および「マージ元のコミット」)における競合ファイルのコンテンツを示す読み取り専用バッファです。

MERGED は、競合を解決する必要がある書き込み可能なバッファです(他の読み取り専用バッファを参照として使用します)。完了したら、通常通りVimを保存して終了するか(:wq)、中止したい場合は :cq で終了します。

レイアウト設定

Vim が使用するウィンドウレイアウトは、設定変数 mergetool.vimdiff.layout を設定することで変更できます。これは文字列を受け入れ、以下のセパレータに特別な意味があります。

  • + は「新しいタブを開く」ために使用されます。

  • , は「新しい垂直分割を開く」ために使用されます。

  • / は「新しい水平分割を開く」ために使用されます。

  • @ は、競合解決後の最終バージョンを含むファイルを示すために使用されます。存在しない場合、デフォルトで MERGED が使用されます。

演算子の優先順位は次の通りです(括弧を使用して変更できます)。

`@` > `+` > `/` > `,`

動作を理解するためにいくつかの例を見てみましょう。

  • layout = "(LOCAL,BASE,REMOTE)/MERGED"

    これは、すでに見たデフォルトのレイアウトと全く同じです。

    /, よりも優先されるため、この場合括弧は不要であることに注意してください。次のレイアウト定義は同等です。

    layout = "LOCAL,BASE,REMOTE / MERGED"
  • layout = "LOCAL,MERGED,REMOTE"

    何らかの理由で、BASE バッファに興味がない場合。

    ------------------------------------------
    |             |           |              |
    |             |           |              |
    |   LOCAL     |   MERGED  |   REMOTE     |
    |             |           |              |
    |             |           |              |
    ------------------------------------------
  • layout = "MERGED"

    MERGED バッファのみが表示されます。ただし、他のすべてのバッファもvimにロードされており、「buffers」コマンドでアクセスできることに注意してください。

    ------------------------------------------
    |                                        |
    |                                        |
    |                 MERGED                 |
    |                                        |
    |                                        |
    ------------------------------------------
  • layout = "@LOCAL,REMOTE"

    レイアウトに MERGED が存在しない場合は、バッファの1つをアスタリスクで「マーク」する必要があります。それが、競合解決後に編集して保存する必要があるバッファになります。

    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     LOCAL         |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE"

    3つのタブが開きます。最初のタブはデフォルトレイアウトのコピーであり、他の2つのタブはそれぞれ (BASELOCAL) および (BASEREMOTE) の間の差分のみを表示します。

    ------------------------------------------
    | <TAB #1> |  TAB #2  |  TAB #3  |       |
    ------------------------------------------
    |             |           |              |
    |   LOCAL     |   BASE    |   REMOTE     |
    |             |           |              |
    ------------------------------------------
    |                                        |
    |                MERGED                  |
    |                                        |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  | <TAB #2> |  TAB #3  |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    LOCAL           |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  |  TAB #2  | <TAB #3> |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE + (LOCAL/BASE/REMOTE),MERGED"

    前の例と同じですが、最初のタブと同じ情報を持つ4番目のタブが、異なるレイアウトで追加されています。

    ---------------------------------------------
    |  TAB #1  |  TAB #2  |  TAB #3  | <TAB #4> |
    ---------------------------------------------
    |       LOCAL         |                     |
    |---------------------|                     |
    |       BASE          |        MERGED       |
    |---------------------|                     |
    |       REMOTE        |                     |
    ---------------------------------------------

    3番目のタブ定義で、,/ よりも優先されるように括弧を使用する必要があることに注目してください。

バリアント

--tool=vimdiff の代わりに、以下のいずれかのバリアントを使用することもできます。

  • --tool=gvimdiff は、Vim の代わりに gVim を開きます。

  • --tool=nvimdiff は、Vim の代わりに Neovim を開きます。

これらのバリアントを使用する場合、カスタムレイアウトを指定するには、mergetool.vimdiff.layout の代わりに設定変数 mergetool.gvimdiff.layout および mergetool.nvimdiff.layout を設定する必要があります(ただし、バリアント固有の設定がされていない場合は、後者がフォールバックとして使用されます)。

さらに、以前のGitバージョンとの下位互換性のために、vimdiff または任意のバリアント (例: vimdiff3, nvimdiff1 など) に 1, 2, または 3 を付加することで、事前定義されたレイアウトを使用することもできます。言い換えれば、--tool=[g,n,]vimdiffx の使用は、--tool=[g,n,]vimdiff を使用し、設定変数 mergetool.[g,n,]vimdiff.layout を以下のように設定するのと同じです。

  • x=1: "@LOCAL, REMOTE"

  • x=2: "LOCAL, MERGED, REMOTE"

  • x=3: "MERGED"

例: --tool=gvimdiff2 を使用すると、3列 (LOCAL, MERGED, REMOTE) の gvim が開きます。

GIT

git[1] スイートの一部

scroll-to-top