この質問と回答の多くの情報は StackOverflow にありますが、たくさんのページにまたがって間違っているか誤解を招く可能性のある他の答えの中に広がっています。知りたいことすべてをまとめるのにしばらく時間がかかりました。
あなたのgit difftoolとmergetoolとして使えるプログラムはたくさんありますが、どれが best であるかについては意見が一致していません(意見、要求、そしてOSは明らかに異なります)。
StackOverflow questionに示すように、Meldはクロスプラットフォーム(UNIX/Linux、OSX、Windows)で一般的な選択肢です。 Gitに最適なビジュアルマージツールは何ですか? 、Meldを提案している答えが他のツールの3倍以上の投票をしている。
以下の2つの質問に答えてください。
注:difftoolとmergetoolの両方に同じプログラムを使用する必要はありません。両方に異なるプログラムを設定できます。
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はプロンプトを出します。
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ユーザーは、おそらくMeldのcmd
行に追加の設定を追加する必要があるでしょう。コマンドラインからWindows上で呼び出されるように設計されているmeldc
へのフルパスを使用する必要があるかもしれませんし、ラッパーを使用する必要があるか、使用する必要があるかもしれません。彼らは以下のリンクされている StackOverflow ページを読んでください。これはWindows用の正しいMeld cmd
行の設定についてです。私はLinuxユーザーなので、さまざまなWindowsのcmd
行をテストすることはできず、Meldまたはmeldc
へのフルパスを追加するか、Meldプログラムフォルダーを追加することを推奨します。あなたのpath
。
Meldには、GUIで設定できるいくつかの設定があります。
Preferences Text Filters
タブには、diffを実行するときにコメントのようなものを無視するための便利なフィルタがいくつかあります。 All whitespace
とLeading 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]*$
これが皆さんに役立つことを願っています。
他の答えは正しいのですが、ここに進んでMeldをあなたの視覚的な差分ツールとして設定する最も早い方法があります。これをコピーするか貼り付けるだけです。
git config --global diff.tool meld
git config --global difftool.Prompt false
ディレクトリでgit difftool
を実行すると、Meldはそれぞれ異なるファイルに対して起動されます。
サイドノート: Meldは驚くほど遅い CSVファイルの比較には時間がかからず、私が見つけたLinux diffツールは、2009年のWindows用のCompareIt!ツールほど高速ではない。
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
私は、meldを別のコマンドとして設定することを好みます。
git config --global alias.meld '!git difftool -t meld --dir-diff'
これにより、git-meld.plスクリプトと同じようになります。 https://github.com/wmanley/git-meld
あなたはその後実行することができます
git meld
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は私にエラーを与えます。
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内の変更を表示することができます。
$ MERGEDのさまざまなセクションから頭の中の差分を計算してそれを適用するのは複雑になることがあります。私の設定では、meldはこれらの差分を視覚的に表示することで助けになります。
[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED
奇妙に見えますが、3つのタブを使用して非常に便利なワークフローを提供します。
タブ1には、マージの競合を解決するためにタブ2に加えるべき変更が(左から右に)表示されます。
タブ2の右側にある「変更する必要がある変更」を適用し、ファイルの内容全体をクリップボードにコピーします(ctrl-aとctrl-cを使用)。
タブ3で、右側をクリップボードの内容に置き換えます。すべてが正しい場合は、左から右へ、タブ1と同じ変更が表示されます(ただし、コンテキストは異なります)。このタブで行った変更を保存します。
ノート: