Git
英語 ▾ トピック ▾ 最新バージョン ▾ 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つのシェルglobパターンがあります。これは、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、nvimdiff、gvimdiffのいずれかである<variant> の分割ウィンドウレイアウトを設定します。--tool=<variant>(またはmerge.tool<variant>として設定されている場合は--toolなし)でgit mergetoolを起動すると、Gitはツールレイアウトを決定するためにmergetool.<variant>.layoutを参照します。バリアント固有の設定がない場合は、vimdiffの設定がフォールバックとして使用されます。それも利用できない場合は、4つのウィンドウを持つデフォルトのレイアウトが使用されます。レイアウトの設定については、「バックエンド固有のヒント」セクションを参照してください。

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を指定すると、次の方法で配布された4つのウィンドウレイアウトでVimが開きます。

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

LOCALBASEREMOTEは、特定のコミットにおける競合ファイルの内容を表示する読み取り専用バッファです(それぞれ「マージ先のコミット」、「共通の祖先コミット」、「マージ元のコミット」)。

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

レイアウト設定

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

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

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

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

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

演算子の優先順位は次のとおりです(優先順位を変更するために括弧を使用できます)。

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

動作方法を理解するためのいくつかの例を示します。

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

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

    /,よりも優先順位が高いため、この場合は括弧は必要ありません。次のレイアウト定義は同等です。

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

    何らかの理由でBASEバッファに関心がない場合。

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

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

    ------------------------------------------
    |                                        |
    |                                        |
    |                 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の代わりに、これらの他のバリアントのいずれかを使用することもできます。

  • Vimの代わりにgVimを開くには--tool=gvimdiff

  • Vimの代わりにNeovimを開くには--tool=nvimdiff

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

さらに、以前のバージョンのGitとの下位互換性のために、vimdiffまたはそのいずれかのバリアント(例:vimdiff3nvimdiff1など)に12、または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