Git の difftool や mergetool として使用できるプログラムは多数ありますが、どれが最適であるかについては意見の一致はありません(意見、要件、OS は明らかに異なります)。
Meldは人気の無料オープンソースクロスプラットフォーム(Unix/Linux、OS X、Windows)の選択肢は、Stack Overflowの質問に示されているとおりです。Git に最適なビジュアルマージツールは何ですか?では、Meld を提案する回答が他のツールの 3 倍以上の票を獲得しています。
以下の 2 つの質問に対する私の回答は以下のとおりです。
- Meld を Git difftool として設定して使用するにはどうすればよいですか?
- Meld を Git マージツールとして設定して使用するにはどうすればよいですか?
注意: difftool と mergetool の両方に同じプログラムを使用する必要はありません。 両方に異なるプログラムを設定できます。
この質問と回答の情報の多くは Stack Overflow で入手できますが、多数のページにまたがり、他の回答も間違っているか誤解を招くものばかりです。知りたいことすべてを把握するのに時間がかかりました。
ベストアンサー1
Meld を Git difftool として設定して使用するにはどうすればよいですか?
git difftool
端末に diff 出力を表示する代わりに、GUI diff プログラム (Meld など) を使用して diff を表示します。
GUI プログラムはコマンド ラインで設定できますが、.gitconfig-t <tool> / --tool=<tool>
ファイルで設定する方が合理的です。(注: 引用符のエスケープと Windows パスに関するセクションを下部で参照してください。)
# Add the following to your .gitconfig file.
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
(注: これらの設定によって の動作が変更される場合はなく、git diff
通常どおり機能し続けます。)
git difftool
は とまったく同じように使用しますgit diff
。例:
git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name
適切に設定されていれば、GUI インターフェイスを使用して差分を表示する Meld ウィンドウが開きます。
$LOCAL
Meld GUI ウィンドウ ペインの順序は、 の と$REMOTE
の順序によって制御できますcmd
。つまり、どのファイルが左ペインに表示され、どのファイルが右ペインに表示されるかということです。逆の順序にしたい場合は、次のように入れ替えるだけです。
cmd = meld "$REMOTE" "$LOCAL"
最後に、このprompt = false
行は、Meld を起動するかどうかについて Git がプロンプトを表示しないようにするだけです。デフォルトでは、Git はプロンプトを表示します。
Meld を Git マージツールとして設定して使用するにはどうすればよいですか?
git マージツールGUI マージ プログラム (Meld など) を使用して、マージ中に発生したマージ競合を解決できます。
difftool と同様に、コマンドラインで GUI プログラムを設定できますが、以前と同様に、 .gitconfig-t <tool> / --tool=<tool>
ファイルで設定する方が合理的です。(注: 引用符のエスケープと Windows パスに関するセクションは下部を参照してください。)
# Add the following to your .gitconfig file.
[merge]
tool = meld
[mergetool "meld"]
# Choose one of these two lines (not both!) explained below.
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
実際のマージを実行するために使用しません。を使用する前に、通常の方法で Git でマージを実行します。例:git mergetool
git mergetool
git checkout master
git merge branch_name
マージの競合がある場合、Git は次のように表示します。
git merge branch_name
出力:
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.
この時点では、マージ競合情報を含む部分的にマージされたファイル (すべてのおよびエントリが含まれるfile_name
ファイル) が含まれます。>>>>>>>
<<<<<<<
Mergetool を使用してマージ競合を解決できるようになりました。次のコマンドで簡単に起動できます。
git mergetool
適切に設定されていれば、Meld ウィンドウが開き、3 つのファイルが表示されます。各ファイルは、GUI インターフェイスの個別のペインに含まれます。
上記の例では.gitconfig
、[mergetool "meld"]
cmd
行として 2 つの行が提案されています。実際には、上級ユーザーが行を構成する方法はいろいろありますcmd
が、それはこの回答の範囲を超えています。
この回答には 2 つの代替cmd
案があり、それらを組み合わせることでほとんどのユーザーの要望に応えられるだけでなく、ツールをさらに複雑なレベルに引き上げたい上級ユーザーにとっても適切な出発点となります。
まず、パラメータの意味は次のとおりです。
$LOCAL
現在のブランチ (例: master) 内のファイルです。$REMOTE
マージされるブランチ内のファイルです (例: branch_name)。$MERGED
マージ競合情報が含まれる部分的にマージされたファイルです。$BASE
$LOCAL
は、との共有コミット祖先です$REMOTE
。つまり、 を含むブランチが$REMOTE
最初に作成されたときのファイルです。
次のいずれかを使用することをお勧めします。
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
または:
[mergetool "meld"]
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
# See 'Note On Output File' which explains --output "$MERGED".
との間に と$MERGED
のどちらを使用するかを選択します。$BASE
$LOCAL
$REMOTE
どちらの場合も、Meld は、左ペインと右ペインに$LOCAL
と、中央ペインにまたは のいずれかを含む 3 つのペインを表示します。$REMOTE
$MERGED
$BASE
どちらの場合も、中央のペインは、マージ競合を解決するために編集する必要があるファイルです。違いは、マージ$MERGED
競合情報を含む部分的にマージされたファイルを含むファイルの場合と、および$BASE
の共有コミット祖先の場合のどちらの編集開始位置を好むかだけです。 [どちらの行も便利なので、私は両方の行をファイルに保持しています。ほとんどの場合、行を使用し、行はコメントアウトされていますが、 行を代わりに使用したい場合は、コメントアウトを入れ替えることができます。]$LOCAL
$REMOTE
cmd
.gitconfig
$MERGED
$BASE
$BASE
出力ファイルに関する注意: またはが行の前の方に使用されているかどうかに関係なく、--output "$MERGED"
が使用されることを心配する必要はありません。このオプションは、Git が競合解決ファイルを保存するファイル名を Meld に伝えるだけです。Meld は、開始編集ポイントとしてまたは のどちらを使用するかに関係なく、競合編集をそのファイルに保存します。cmd
$MERGED
$BASE
cmd
--output
$MERGED
$BASE
中央のペインを編集してマージの競合を解決したら、ファイルを保存して Meld ウィンドウを閉じます。Git は自動的に更新を実行し、現在のブランチ (例: master) のファイルに中央のペインで最終的に作成した内容が含まれるようになります。
.orig
Git は、元のファイル名に を追加することで、マージ競合情報を含む部分的にマージされたファイルのバックアップを作成します。例file_name.orig
: マージに問題がないことを確認し、必要なテストを実行したら、ファイル.orig
を削除できます。
この時点で、コミットを実行して変更をコミットできます。
Meld でマージ競合を編集しているときに、Meld の使用を中止したい場合は、中央のペインでマージ解決ファイルを保存せずに Meld を終了します。Git はメッセージで応答しfile_name seems unchanged
、 を尋ねますWas the merge successful? [y/n]
。応答するとn
、マージ競合解決は中止され、ファイルは変更されません。Meld でファイルを保存したことがある場合は、Git から警告とプロンプトは表示されません。[もちろん、ファイルを削除して、.orig
Git が作成したバックアップ ファイルに置き換えることもできます。]
マージ競合のあるファイルが複数ある場合、Git は各ファイルに対して新しい Meld ウィンドウを 1 つずつ開き、すべての競合が解決されるまでこれを繰り返します。すべてのファイルが同時に開かれるわけではありませんが、1 つのファイルで競合の編集を終えて Meld を閉じると、Git は次のファイルを開き、すべてのマージ競合が解決されるまでこれを繰り返します。
実際のgit mergetool
プロジェクトで使用する前に、ダミー プロジェクトを作成して使用方法をテストすることをお勧めします。OS で行内の引用符をエスケープする必要がある場合は、テストで必ずスペースを含むファイル名を使用してください(以下を参照)。cmd
引用符のエスケープ
一部のオペレーティング システムでは、引用符をエスケープする必要がありますcmd
。経験の浅いユーザーは、設定コマンド ラインはスペースを含むファイル名でテストする必要があることに注意してくださいcmd
。スペースを含むファイル名で行が機能しない場合は、引用符をエスケープしてみてください。例:
cmd = meld \"$LOCAL\" \"$REMOTE\"
場合によっては、より複雑な引用符のエスケープが必要になることがあります。以下の Windows パス リンクの 1 番目には、各引用符を 3 回エスケープする例が含まれています。退屈ですが、必要な場合もあります。例:
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Windows パス
Windows ユーザーは、Meldcmd
行に追加の設定を追加する必要がある可能性があります。 へのフル パスを使用する必要があるかもしれませmeldc
ん。これは、Windows のコマンド ラインから呼び出すように設計されているか、ラッパーを使用する必要があるか、または使用したい場合があります。Windowscmd
用の正しい Meld 行の設定に関する、以下のリンク先の Stack Overflow ページを読む必要があります。私は Linux ユーザーなので、さまざまな Windows 行をテストすることはできません。また、Meld または へのフル パスを追加した例を使用するか、Meld プログラム フォルダを に追加することcmd
を推奨する以外、この件に関する詳細情報はありません。meldc
path
Meld で末尾の空白を無視する
Meld には、GUI で設定できるさまざまな設定があります。
環境設定の「テキスト フィルター」タブには、差分を実行するときにコメントなどを無視する便利なフィルターがいくつかあります。すべての空白と先頭の空白を無視するフィルターはありますが、末尾の空白を無視するフィルターはありません(これは Meld メーリング リストで追加として提案されていますが、私のバージョンでは使用できません)。
末尾の空白を無視することは、特に共同作業を行う場合に非常に便利なことが多く、Meld 設定の[テキスト フィルター]タブで単純な正規表現を使用して手動で簡単に追加できます。
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$