meldを使用してブランチの違いを表示しますか?


159

HEADと現在の状態の違いをで表示できることを知っていますmeld .。しかし、たとえばmeld masterを使用develして、ブランチ間の違いをどのように表示できますか?

現時点では、次の手順を実行します。

  1. 作業コピーのフォルダ名を変更します(
    mv /projectA /projectA_master
  2. プロジェクトを再度複製する
    git clone url
  3. develブランチに切り替え
    cd projectA && git -b devel origin/devel
  4. meldとの違いを見る
    meld /projectA_Master projectA

meldで同じ結果を得る簡単な方法はありませんか?変更を確認するためだけに必要であり、主にマージのためではありません。


回答:


55

また、この問題は迷惑であることがわかったので、作業ツリーまたはステージング領域に対する任意のコミットをより快適に比較できるgit meldを作成しました。https://github.com/wmanley/git-meldで見つけることができます。マークのスクリプトに少し似ていますが、任意のコミット、ステージング領域、または作業ディレクトリを他のものと比較するために機能します。比較対象の1つが作業ツリーである場合、それも読み取り/書き込みであり、変更が失われることはありません。


1
優れたツール、ウィル。ありがとう!完全に推奨されます...マージでも機能する場合のみ。
ディップスティック

優れたツール用のTYVM-(エイリアスに!を追加することを自分に通知)
kfmfe04

26
ヒットしたgithubリポジトリのWillを引用:「注:git 1.7.11でgit difftoolが--dir-diffオプションを学習したため、git-meldは廃止されました。」
oluc 2013

318

短くて甘い:

git config --global diff.tool meld

これにより、Gitがmelddiffツールとして使用するように構成されます。(コマンドライン引数を指定する必要はありませんmeld。サポートはGitに組み込まれています。)

次に、テキストではなくグラフィカルな差分が必要な場合は、git difftool代わりに呼び出しますgit diff(どちらも同じ引数を取ります)。あなたの場合:

git difftool master..devel

更新:一度に1つのファイルの差分が不要で、代わりに2つのブランチ間のすべての変更を含むmeldの「サブディレクトリ」ビューを使用する場合は、-dまたはの--dir-diffオプションに注意してくださいgit difftool。たとえば、ブランチXYZにいて、これとブランチABCの違いを知りたい場合は、次のように実行します。

git difftool -d ABC

3
それは私が探しているものではありません。ファイルごとに違いが表示されます。以前にスクリプトdiff.pyと 'git diff master..devel'でアーカイブしました。'meld folderA / folderB /'と同じように、すべての違いとディレクトリツリーを確認します。
Marten Bauer

Marten、それがgitの動作方法です。これはファイルを追跡するだけなので、ファイルごとの違いのみを確認できます。gitでは、空のディレクトリだけをコミットすることはできません。dir間の差分を表示する特別な理由はありますか?
Donny Kurnia、2010年

@DonnyKurnia:OPが何をしようとしているのかを理解するのに少し時間がかかりました:Meldには、ディレクトリ内のすべての変更を表示するための個別のUIがあります。ファイルが同じか、変更されたか、新しいかどうかに基づいて、表示ファイルをフィルタリングできます。OPはそのUIを使用して変更を表示したいと考えています。(これにより、すべての変更のリストを表示して、比較する変更を選択できます。)これは、ディレクトリ間の比較ではなく、コミット間の比較ですが、全体として表示されます。
idbrii

17
@MartenBauer私はこれがあなたが望むものだと思います:gitのdifftool --dir-diffのマスターのdevel
ステファン

3
これを行うと、現在のブランチがtmpフォルダーにないため、編集が可能になりますか?
zkent 2014

100

git v1.7.11以降では、を使用git difftool --dir-diffしてディレクトリ比較を実行できます。これは、https://github.com/wmanley/git-meldスクリプトでmeldを使用すると非常にうまく機能します

gitを設定する

git config --global diff.tool meld

これを使って

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

macOSの場合

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
これは本当にOPが望んだことだと思います。guidiffツールを使用する-gオプションと--dir-diffを使用する-dオプションに注意してください。これはコードレビューを行うのに適しています。Nit:-dを指定する場合、少なくともGit 1.8では、difftool.promptオプションは必要ありません。
マイケルパーシー

1
これは素晴らしいです。まさに私が必要としたもの。ありがとうございました!
ニコラス

5
これを行うと、現在のブランチがtmpフォルダーにないため、編集が可能になりますか?
zkent 2014

2
@zkentの質問にもお答えいただければ幸いです... :(
tavlima 14年

3
@zkent @tavlima:このコマンドはすでに、現在のバージョンの編集を許可しています。tmp floderがmeldに表示された場合でも、保存すると- Ctrl+sファイルが変更されます。
ベンジャミン、

13

Meldで作業ファイルを編集し保存するgit difftool -dことができるということは重要です。これを実現するには、いくつかのブランチを現在の作業ツリーと比較する必要があります。次に例を示します。

git difftool -d branchname

Meldは、左と右の両方のディレクトリが/ tmpにあることを示します。ただし、正しいディレクトリ内のファイルは、実際には現在の作業ディレクトリ内のファイルへのシンボリックリンクです(Windowsには適用されません)。そのため、それらをMeldで直接編集することができ、それらを保存すると、変更は作業ディレクトリに保存されます。

さらに興味深いオプションは、現在の作業ディレクトリとstashの比較です。次のように入力するだけで実行できます。

git difftool -d stash

次にgit stash pop/apply、このコマンドによって引き起こされる可能性のある厄介な競合解決を使用および回避せずに、変更をstash(左側のウィンドウ)から現在の作業コピー(右側のウィンドウ)に転送できます。

私はそれが隠し場所でワークフローを大幅に後押しできると思います。変更をstashから作業用コピーに徐々に転送し、1つずつコミットして、必要に応じて別の変更を導入できます。


Piotr、これはまさに私がやろうとしてきたことですが、私の場合(CentOS)、シンボリックリンクは作成されていません。必要な構成設定、またはこれをサポートするmeldの最小バージョンはありますか?
wrjohns

GitはMeldではなく、シンボリックリンクの作成を担当していると思います。Gitのマニュアルでdifftoolコマンドを確認してください。多分あなたはそれを新しいバージョンに更新するべきですか?
Piotr Jurkiewicz

2
新しいファイルをブランチから作業ディレクトリにコピーしても機能しません:(
pykiss

5

他の回答から、現時点ではgitリポジトリでこれを直接行う方法がないように見えますが、2つのコミットのツリーを抽出するスクリプトを書くのは簡単です(別の質問への回答のおかげです:))。一時ディレクトリに移動してそれらに対してmeldを実行し、meldの終了時に両方のディレクトリを削除します。

http://gist.github.com/498628

もちろん、meldを介して加えられた変更はすべて失われますが、違いの概要をすばやく確認できるので非常に便利です。


3

私はこれを行うための簡単な方法を使用していると思いますgit reset --soft

目標:branch_aとbranch_bの違いをmeldと比較する

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

git V1.7.9では、コマンドラインなしで2つのコミットを比較できます。

'git gui'編集オプションでグローバルに設定する必要があります:「マージツールを使用:meld」。

gitkを起動し、コミットを選択して、別のコミットを右クリックします> " diff this-> selected "。「patch」の下で、ファイル>「external diff」を右クリックします。

meldが起動し、まだ選択されている状態で表示されます。最初に右側にコミットします。


0

macOSのMeldの場合、macOSアプリケーションのメンテナーyoussebが~/.gitconfig推奨するように、これをに追加します。

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

merge必要に応じて構成を省略できます。

@GutenYeの答えは、自動エスケープやで何かが原因でうまくいきませんでしたzsh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.