web-dev-qa-db-ja.com

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

この質問と回答の多くの情報は StackOverflow にありますが、たくさんのページにまたがって間違っているか誤解を招く可能性のある他の答えの中に広がっています。知りたいことすべてをまとめるのにしばらく時間がかかりました。

あなたのgit difftoolとmergetoolとして使えるプログラムはたくさんありますが、どれが best であるかについては意見が一致していません(意見、要求、そしてOSは明らかに異なります)。

StackOverflow questionに示すように、Meldはクロスプラットフォーム(UNIX/Linux、OSX、Windows)で一般的な選択肢です。 Gitに最適なビジュアルマージツールは何ですか? 、Meldを提案している答えが他のツールの3倍以上の投票をしている。

以下の2つの質問に答えてください。

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

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

181
mattst

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

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

-t <tool> / --tool=<tool>を使用してコマンドラインでGUIプログラムを設定できますが、.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

正しく設定されていれば、Meldウィンドウが開き、GUIインターフェイスを使って差分が表示されます。

Meld GUIウィンドウペインの順序は、cmd内の$LOCAL$REMOTEの順序、つまり左側のペインに表示されるファイルと右側のペインに表示されるファイルの順序によって制御できます。あなたがそれらを逆にしたいのであれば、単にこのようにそれらを交換してください。

    cmd = meld "$REMOTE" "$LOCAL"

最後にPrompt = false行は単にMeldを起動したいかどうかについてgitがあなたにプロンプ​​トを出すのをやめさせます。デフォルトではgitはプロンプトを出します。


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

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

Difftoolと同様に、-t <tool> / --tool=<tool>を使用してコマンドラインでGUIプログラムを設定できますが、以前と同様に、.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

正しく設定されていれば、Meldウィンドウが開き、3つのファイルが表示されます。各ファイルは、そのGUIインターフェイスの別々のペインに含まれます。

上記の.gitconfigエントリの例では、2行が[mergetool "meld"]cmd行として推奨されています。実際、上級ユーザーが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$REMOTE、中央のペインに$MERGEDまたは$BASEの3つのペインを表示します。

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

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

中央のペインを編集してマージの競合を解決したら、ファイルを保存してMeldウィンドウを閉じます。 Gitは自動的に更新を行い、現在のブランチ(例えばmaster)のファイルには、中央のウィンドウに表示されたものがすべて含まれるようになります。

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

この時点で、変更をコミットするためのコミットを実行できます。

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

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

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


引用符のエスケープ

オペレーティングシステムによっては、cmd内の引用符をエスケープする必要があるかもしれません。熟練していないユーザは、configコマンドラインがスペースを含むファイル名でテストされるべきであることを覚えておくべきです、そして、cmd行がスペースを含むファイル名でうまくいかないなら、引用符をエスケープすることを試みなさい。例えば.

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

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

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

Windowsのパス

Windowsユーザーは、おそらくMeldのcmd行に追加の設定を追加する必要があるでしょう。コマンドラインからWindows上で呼び出されるように設計されているmeldcへのフルパスを使用する必要があるかもしれませんし、ラッパーを使用する必要があるか、使用する必要があるかもしれません。彼らは以下のリンクされている StackOverflow ページを読んでください。これはWindows用の正しいMeld cmd行の設定についてです。私はLinuxユーザーなので、さまざまなWindowsのcmd行をテストすることはできず、Meldまたはmeldcへのフルパスを追加するか、Meldプログラムフォルダーを追加することを推奨します。あなたのpath

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

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

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

末尾の空白文字を無視することは、特に共同作業をするときに非常に便利です。また、Meldの設定のText Filtersタブにある簡単な正規表現を使って手動で簡単に追加することができます。

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

これが皆さんに役立つことを願っています。

316
mattst

他の答えは正しいのですが、ここに進んでMeldをあなたの視覚的な差分ツールとして設定する最も早い方法があります。これをコピーするか貼り付けるだけです。

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

ディレクトリでgit difftoolを実行すると、Meldはそれぞれ異なるファイルに対して起動されます。

サイドノート: Meldは驚くほど遅い CSVファイルの比較には時間がかからず、私が見つけたLinux diffツールは、2009年のWindows用のCompareIt!ツールほど高速ではない。

57
Dan Dascalescu

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

このコマンドを使用してMeldのパスを確認できます。

which meld
43
MarredCheese

私は、meldを別のコマンドとして設定することを好みます。

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

これにより、git-meld.plスクリプトと同じようになります。 https://github.com/wmanley/git-meld

あなたはその後実行することができます

git meld
18
Ulf Adams

Windows 10のために私は私の.gitconfigにこれを入れなければなりませんでした:

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

あなたが知る必要がある他のすべてのものは、上でさらにマットによってこのスーパー answer に書かれています。

シモンズ:何らかの理由で、これはMeld 3.18.xでのみ動作しました、Meld 3.20.xは私にエラーを与えます。

1
Jeremy Benks

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

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

git config --global -e

注意してほしいのなら、デフォルトのVimの代わりにSublime Text 3をコアditorとして使いたい場合は、これを.gitconfigファイルに追加することができます。

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

次に、innto 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では必要です。

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

エイリアスは.gitconfigファイルの中、 [alias] sectionの下にあります。

showchanges = difftool --dir-diff

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

git showchanges

次の図は、この--dir-diffオプションで変更されたファイルのリストを表示する方法を示しています(例)。 Meld showing list of files with changes between the $LOCAL and $REMOTE

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

1
Tore Aurstad

$ 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に迷惑なポップアップが表示されます。
0
mnieber