Meldをgit difftoolおよびmergetoolとして設定および使用する


255

この質問と回答の情報の多くはStackOverflowで入手できますが、多くのページやその他の回答のうち、間違っているか誤解を招く可能性がある情報に広がっています。知りたいことすべてをつなぎ合わせるのにしばらく時間がかかりました。

git difftoolとmergetoolとして使用できるさまざまなプログラムが多数あり、どちらが最適であるかについては確かにコンセンサスはありません(意見、要件、およびOSは明らかに異なります)。

Meldは、StackOverflowの質問「Gitに最適なビジュアルマージツールは何ですか?」に示されているように、人気のある無料のオープンソースのクロスプラットフォーム(UNIX / Linux、OSX、Windows)の選択肢です。、メルドを提案する答えは他のツールの3倍以上の票を持っています。

以下の2つの質問に対する回答を以下に示します。

  • Meldをgit difftoolとして設定して使用するにはどうすればよいですか?
  • Meldをgit mergetoolとして設定して使用するにはどうすればよいですか?

注:difftoolとmergetoolの両方に同じプログラムを使用する必要はありません。両方に異なるプログラムを設定できます。


1
関連する投稿- 一般的にGitでdiffツール設定する方法。
RBT

回答:


423

Meldをgit difftoolとして設定して使用するにはどうすればよいですか?

git difftoolは、端末にdiff出力を表示する代わりに、GUI diffプログラム(つまりMeld)を使用してdiffを表示します。

コマンドラインでGUIプログラムを設定することもできますが-t <tool> / --tool=<tool>.gitconfigファイルで構成する方が理にかなっています。[注:下部にある引用符と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インターフェイスを使用して差分が表示されます。

メルドGUIウィンドウペインの順序は、の順で制御することが可能$LOCAL$REMOTEcmd、左ペインに示し、右ペイン内のどのされているファイルと言うことです。逆にしたい場合は、次のように入れ替えます。

    cmd = meld "$REMOTE" "$LOCAL"

最後に、このprompt = false行は単にMeldを起動するかどうかについてgitがプロンプトを出さないようにするだけで、デフォルトではgitがプロンプトを出します。


Meldをgit mergetoolとして設定して使用するにはどうすればよいですか?

git mergetoolを使用すると、GUIマージプログラム(つまりMeld)を使用して、マージ中に発生したマージの競合を解決できます。

difftoolと同様に、コマンドラインでGUIプログラムを設定できます-t <tool> / --tool=<tool>が、以前と同様に、.gitconfigファイルで構成する方が理にかなっています。[注:下部にある引用符とWindowsパスのエスケープに関するセクションを参照してください。]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

git mergetool実際のマージの実行には使用しません。使用git mergetoolする前に、通常の方法でgitを使用してマージを実行します。例えば

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

適切に構成されている場合、3つのファイルを表示するMeldウィンドウが開きます。各ファイルは、GUIインターフェイスの個別のペインに含まれます。

.gitconfig上記の例のエントリでは、2行が行として提案されてい[mergetool "meld"] cmdます。実際、上級ユーザーがcmd回線を構成する方法にはさまざまな種類がありますが、それはこの回答の範囲を超えています。

この回答には2つの代替cmdラインがあり、それらの間でほとんどのユーザーに対応します。また、ツールを次のレベルの複雑さまで進めたい上級ユーザー向けの良い出発点になります。

まず、パラメータの意味は次のとおりです。

  • $LOCAL 現在のブランチ(マスターなど)内のファイルです。
  • $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

どちらの方法でもメルドはとの3つのペイン表示されます$LOCAL$REMOTE、左と右のペインでいずれか$MERGEDまたは$BASE中央ペインのを。

どちらの場合も、中央のペインは、マージの競合を解決するために編集する必要があるファイルです。違いは、どの編集位置を開始するかだけです。$MERGEDマージ競合情報を含む部分的にマージされたファイルを含むファイル、またはandの$BASE共有コミット祖先。[両方の行が役立つので、両方をファイルに保存します。ほとんどの場合、この行を使用し、その行はコメント化されていますが、代わりにその行を使用したい場合は、コメントアウトを入れ替えることができます。]$LOCAL$REMOTEcmd.gitconfig$MERGED$BASE$BASE

ない心配:出力ファイルノートオン--output "$MERGED"で使用されているcmdかどうかにかかわらずの$MERGED$BASE以前に使用したcmdライン。この--outputオプションは、競合解決ファイルを保存したいファイル名をgitにMeldに通知するだけです。Meldは、使用する$MERGED$BASE、開始編集ポイントとして使用するかに関係なく、競合編集をそのファイルに保存します。

中央のペインを編集してマージの競合を解決したら、ファイルを保存してメルドウィンドウを閉じます。Gitは自動的に更新を行い、現在のブランチ(マスターなど)のファイルには、中央のペインで最終的に作成されたものが含まれます。

gitは.orig、元のファイル名に追加することで、部分的にマージされたファイルのマージ競合情報を含むバックアップを作成します。例えばfile_name.orig。マージに問題がないことを確認し、必要なテストを実行した後、.origファイルを削除できます。

この時点で、コミットを実行して変更をコミットできます。

Meldでマージの競合を編集しているときに、Meldの使用を中止し、中央のペインにマージ解決ファイルを保存せずにMeldを終了します。gitはメッセージで応答してfile_name seems unchangedからを尋ねWas the merge successful? [y/n]ます。答えるnと、マージ競合の解決が中止され、ファイルは変更されません。Meldにファイルを保存したことがある場合は、gitから警告やプロンプトが表示されないことに注意してください。[もちろん、ファイルを削除して、.origgitが作成したバックアップファイルで置き換えることもできます。]

マージの競合があるファイルが複数ある場合、gitは、すべてが完了するまで、それぞれに新しいMeldウィンドウを次々に開きます。それらはすべて同時に開かれるわけではありませんが、1つの競合の編集を終了してMeldを閉じると、gitは次の競合を開き、すべてのマージの競合が解決されるまで続きます。

使用テストするダミーのプロジェクトを作成するために賢明だろうgit mergetoolにそれを使用する前に、ライブのプロジェクトを。OSでcmd行の引用符をエスケープする必要がある場合に備えて、必ずスペースを含むファイル名をテストで使用してください。以下を参照してください。


引用文字のエスケープ

一部のオペレーティングシステムでは、引用符をcmdエスケープする必要がある場合があります。経験の浅いユーザーは、configコマンドラインはスペースを含むファイル名でテストする必要があることを覚えておいてください。スペースを含むファイル名でこれらのcmd行が機能しない場合は、引用符をエスケープしてください。例えば

cmd = meld \"$LOCAL\" \"$REMOTE\"

場合によっては、より複雑な引用エスケープが必要になることがあります。以下の最初のWindowsパスリンクには、各引用符をトリプルエスケープする例が含まれています。それは退屈ですが、時には必要です。例えば

cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

Windowsパス

Windowsユーザーは、おそらくMeld cmdラインに追加の構成を追加する必要があります。meldcコマンドラインからWindowsで呼び出されるように設計されているへのフルパスを使用する必要がある場合や、ラッパーを使用する必要がある場合があります。彼らは、Windowsの正しいMeld 行の設定に関する以下のリンクのStackOverflowページを読む必要がありcmdます。私はLinuxユーザーなので、さまざまなWindowsのcmd行をテストすることはできず、Meldまたはへのフルパスを追加した私の例を使用しmeldcたり、Meldプログラムフォルダーをに追加したりする以外に、この件に関する詳細情報はありませんpath

Meldで末尾の空白を無視する

Meldには、GUIで構成できるいくつかの設定があります。

設定Text Filtersタブには、差分を実行するときにコメントなどを無視するための便利なフィルターがいくつかあります。All whitespaceとを無視Leading whitespaceするTrailing whitespaceフィルターはありますが、無視フィルターはありません(これはMeldメーリングリストの追加として提案されていますが、私のバージョンでは使用できません)。

末尾の空白を無視することは、多くの場合、特に共同作業を行うときに非常に役立ちText Filtersます。また、[ メルド設定]タブの単純な正規表現を使用して手動で簡単に追加できます。

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

これが皆さんのお役に立てば幸いです。


2
おかげで、使いそんなに簡単だということ[mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"~/.gitconfig、そしてちょうど真ん中皿に赤で強調表示競合を解決して保存します!これがデフォルト設定である必要があります。
KrisWebDev 2016年

1
$LOCAL $MERGED $REMOTE私がほとんどの場合に使用する設定です。解決するためのいくつかの競合がある場合、それは優れており、それは私のデフォルトでもあります。$LOCAL $BASE $REMOTEやることがたくさんあり、コードのどのセクションがどのファイルから来ているのかを正確に知っている場合、それは本当に役に立ちます。共有されたコミットの祖先は、散らかりのない優れた出発点になる可能性があります。衝突の強調表示が実際に邪魔になり、よりクリーンなベースが祝福になることもあります。
mattst 2016年

4
注:あなたがOSX上で、自作経由メルドをインストールした場合、出力パラメータが必要になります=。このように:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen

2
.dmgをインストールし、 'meld'がパスに含まれていないことに気付いた
KC Baltz

3
これは、Git Configuration-git mergetoolの説明よりもはるかに優れています。$ MERGEDと$ BASEの違いを説明していただき、ありがとうございます。狂気から私を救った!
ChrisG 2018年

81

他の答えは正しいですが、これが先に進んでMeldを視覚的な差分ツールとして構成する最も速い方法です。これをコピー/貼り付けしてください:

git config --global diff.tool meld
git config --global difftool.prompt false

ここgit difftoolでディレクトリで実行すると、異なるファイルごとにMeldが起動します。

補足:Meldは CSVファイルの比較が驚くほど遅く、私が見つけたLinux diffツールは、Compare Itと呼ばれるこのWindowsツールよりも高速です。(2010年に最終更新)。


13
おそらくgit config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'そこにもラインが必要でしょう。これが「デフォルト」ですが、設定とすぐにmergetooldifftool差分の設定が見つからない場合は、デフォルトとしてmergetoolの設定を使用して開始します。マージは通常、3方向のマージで3つのファイルを渡すように構成されているため、meld 差分ウィンドウに突然3つのペインが表示され、意味がありません。
BeeOnRope 2017

なぜ$とセットした後、コンフィギュレーションをチェックしませgitの設定-l
agfe2

56

Windowsの場合。Git Bashで次のコマンドを実行します。

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

(もし異なる場合はMeld.exeのファイルパスを更新してください。)

Linuxの場合。Git Bashで次のコマンドを実行します。

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

次のコマンドを使用して、メルドのパスを確認できます。

which meld

1
git difftoolを実行するとエラーが発生しました「diffツールmeldは 'D:\ software \ melddiff \ Meld.exe'として使用できません」
Allen

@AllenVork:Meld.exeが指定したフォルダにあることを確認しましたか?Gitの外で正常に実行できますか?実行するとGitは何を返しますgit config --global --get-regex diff*か?
MarredCheese 2017年

解決しました。「D:/software/melddiff/Meld.exe」に変更して動作します。.gitconfigの形式は、WindowsではなくUbuntuです。
Allen Vork 2017年

それはされるべきではありませんでした:git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
Jonathan Rosenne 2017

@ AllenVork、cygwinにgitを使用していますか?
エイドリアン

25

次のように、meldを別のコマンドとして設定することをお勧めします。

git config --global alias.meld '!git difftool -t meld --dir-diff'

これにより、次のgit-meld.plスクリプトに似たものになります:https : //github.com/wmanley/git-meld

その後、実行することができます

git meld

Cygwinと連携していたのですが、今は壊れています。これはそれを修正しました。ありがとう!(--dir-diff個人的な好みとしてその部分を削除しましたが)
PfunnyGuy 2017年

3

Windows 10の場合、これを.gitconfigに入れる必要がありました。

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

あなたが知る必要のある他のすべては、上記のマットストによるこのスーパーアンサーに書かれています。

PS:何らかの理由で、これはMeld 3.18.xでのみ機能し、Meld 3.20.xはエラーを表示します。


1

これは、diffツールのパス構文が他のプラットフォームと異なるため、主にWindowsを使用する開発者を対象とする回答です。

私はgit mergetoolとしてKdiff3を使用していますが、git difftoolをMeldとして設定するには、最初にMeldmerge.orgから最新バージョンのMeldをインストールしてから 、以下を使用して以下をグローバル.gitconfigに追加しました。

git config --global -e

コアditorとしてデフォルトのVimではなくSublime Text 3が必要な場合は、これを.gitconfigファイルに追加できます。

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

次に、インMeldをdifftoolとして追加します。

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\\Program Files (x86)\\Meld\\Meld.exe

上記のcmdの先頭のスラッシュに注意してください。Windowsでは必要です。

現在のgit diffを表示するエイリアスを設定することもできます。 --dir-diffを使用 オプションを使用ます。これはMeld内の変更されたファイルを一覧表示します。これは、複数のファイルを変更したときに便利です(非常に一般的なシナリオです)。

エイリアスは、.gitconfigファイル内の[alias]セクションの下で次のようになります。

showchanges = difftool --dir-diff

コードに加えた変更を表示するには、次のコマンドを入力します。

git showchanges

次の画像は、この--dir-diffオプションが変更されたファイルのリストを表示する方法を示しています(例): $ LOCALと$ REMOTEの間で変更されたファイルのリストを示すメルド

次に、各ファイルをクリックしてMeld内の変更を表示することができます。


0

$ MERGEDのさまざまなセクションから頭の差分を計算して適用するのは複雑になる場合があります。私の設定では、meldは以下を使用してこれらの差分を視覚的に表示するのに役立ちます。

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

奇妙に見えますが、3つのタブを使用する非常に便利なワークフローを提供します。

  1. タブ1には、マージの競合を解決するためにタブ2で行う必要がある変更が(左から右に)表示されます。

  2. タブ2の右側で、「行う必要のある変更」を適用し、ファイルの内容全体をクリップボードにコピーします(ctrl-aおよびctrl-cを使用)。

  3. タブ3で、右側をクリップボードの内容に置き換えます。すべてが正しい場合は、左から右に、タブ1と同じ変更が表示されます(ただし、コンテキストは異なります)。このタブで行った変更を保存します。

ノート:

  • タブ1で何も編集しないでください
  • タブ2には何も保存しないでください。タブ3に迷惑なポップアップが表示されます。

これは、単一のタブでの3者間マージ(ローカル/ベース/リモート)より優れていますか?
アンドレ・Werlang

@AndréWerlang1つのタブでの3者間マージの利点は、競合する変更のみを処理する必要があることです(他の変更は自動的にマージされます)。しかし、3ウェイマージでは何が変更されたか、およびすべての変更を保持する方法でマージする方法を理解するのが難しい場合は、「私の」アプローチを好みます。ある時点で3者間マージが混乱しない場合は、元に戻すことができます。
mnieber

ユーザーmattstが指摘したように、あなたが使用できる$BASE代わりの$MERGEDマージ操作を開始する
アンドレ・Werlang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.