git difftool、シリアルではなく、すべてのdiffファイルをすぐに開きます


240

デフォルトのgit diffの動作は、各diffファイルをシリアルで開くことです(前のファイルが閉じるのを待ってから、次のファイルを開きます)。

すべてのファイルを一度に開く方法を探しています-たとえばBeyondCompareでは、同じBCウィンドウ内のタブですべてのファイルを開きます。

これにより、複雑な一連の変更を簡単に確認できます。diffファイル間を前後にフリックして、重要でないファイルを無視します。


「git diff」または「git difftool」?リクエストを投稿することをお勧めします(すべてがオープンで、さまざまなWebインターフェースを使用)gitメーリングリスト:git@vger.kernel.org
JakubNarębskiAug

「git difftool」を使用して、外部のdiffアプリケーションをトリガーしています。メーリングリストのアイデアをありがとう。
Seba Illingworth、

プラットフォームを知っておくと役に立ちます。Unixベースのプラットフォームでは、差分を実行するスクリプトを記述し、そのスクリプトを使用するようにgitに指示します。スクリプトでは、バックグラウンドでdiffを実行し、スクリプトを終了させます。
クリスクリーランド

Windowsプラットフォームですが、Chrisのアイデアに感謝します。
Seba Illingworth、

回答:


214

以降ではgitv1.7.11、あなたが使用することができgit difftool --dir-diff、ディレクトリの差分を実行します。

この機能は、たとえばMeld 3.14.2でうまく機能し、変更されたすべてのファイルを参照できます。

git difftool --dir-diff --tool=meld HEAD~ HEAD

これは便利なBash関数です:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

以下の回答はgit、v1.7.11より前のインストールに適用されます。


これと同じ質問がgitメーリングリストで行われました

私は、任意のコミット間でディレクトリの差分を実行する、その電子メールスレッドに基づくシェルスクリプトをまとめました。

git v1.7.10以降、git-diffallスクリプトはcontrib標準のgitインストールのに含まれています。

v1.7.10より前のバージョンの場合git-diffallGitHubのプロジェクトからインストールできます

ここにプロジェクトの説明があります:

git-diffallスクリプトは、ディレクトリベースのgitの差分メカニズムを提供します。スクリプトは、diff.tool構成オプションに依存して、使用されるdiffビューアーを判別します。

このスクリプトは、diffのリビジョンの範囲を指定するために使用されるすべてのフォームと互換性があります。

1)git diffall:作業ツリーと段階的変更間の差分を表示
2)git diffall --cached [<commit>]:段階的変更とHEAD (または他の名前付きコミット)間の差分を表示
3)git diffall <commit>:作業ツリーと名前付きコミット間の差分を表示
4)git diffall <commit> <commit>:2つの名前付きコミット間の差分を表示
5)git diffall <commit>..<commit>:同じ上記のように
6)git diffall <commit>...<commit>:両方の共通の祖先から開始して、2つ目までを含むブランチの変更を表示します<commit>

注:すべてのフォームはオプションのパスリミッターを使用します [--] [<path>]

このスクリプトは、GitリストでThomas Rastが提供した例に基づいています


git-diffallとgithub.com/wmanley/git-meldの違いは何ですか?私は両方を試しましたが、一見すると同じ機能を提供しているようです。
キナン

5
私はあなたの脚本に大変感謝しています。率直に言って、なぜGitがこれに関して正しい動作をしないのか(Mercurialは動作し、何年もそうしている)の理由を理解することも、Gitコミュニティからの関心の欠如を理解することもできません。
ダグラス

6
更新git difftool --dir-diffおよびBeyond Compare について):Scooter Software(Beyond Compareの作成者)に問い合わせbcompare.exeたところ、これはサポートされているソリューションではなく、同時に複数の差分が開いていると問題が発生する可能性があるとのことです。bcomp.exe将来のバージョンでは、フォルダーの差分のサポートを追加する予定です(当面はbcompare.exe、サポートされない回避策として引き続き使用します)。
Peter Rust 2012

4
Beyond Compare 4と--dir-diffでテストした@coinは、サポートされているbcomp.exeで動作するようです。
Peter Rust

5
それ--dir-diffはメルドで完璧に動作すると言うためにコメントするだけです。そこから、個々のファイルの差分を選択して表示できます。
mkasberg 2015年

61

これが私が解決したものです...

次のコードをgit-diffall(拡張子なし)というファイルにコピーします。

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

内のファイルを置きcmd、あなたのgitのフォルダディレクトリ(例をインストールしますC:\Program Files (x86)\Git\cmd

そして、あなたがするように使用してくださいgit diff

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

注:その鍵となるのは paramで、外部のdiffコマンドにバックグラウンドタスクで実行してファイルをすぐに処理するように指示します。BeyondCompareの場合、これにより、1つの画面が開き、各ファイルが独自のタブに表示されます。


投稿いただきありがとうございます。残念ながら、WinMergeの-sオプションでは機能しません。WinMergeが一時ファイルを確認する前に、最初の一時ファイルを除くすべての一時ファイルが削除されます。
カルロスレンドン2010

カルロス:私はGitでWinMergeを使用しています。私のアプローチは、WinMergeを起動した後に 'sleep 1'を追加することでした(私の場合、「バックグラウンドで」起動されているようです-&は必要ありません)。このようにして、一時ファイルは、WinMergeが一時ファイルを一度だけ取得するのに十分な長さ存続します(奇妙な場合を除きます)。また、すべてのファイルを開くには、ファイルごとに1秒かかることも意味します。これは厄介なハックですが(「答え」として提示することは決してしません!)、簡単でかなり効果的なハックです。
Woody Zenfell III 2010

2
Linuxで使用するには、Git 2.xを使用して、少し変更する必要があり"$filename"ました"../$filename"。その後、Beyond Compare
Dave Cで

1
@DaveCは、元のスレッドで「ファイルをgitインストールのcmdフォルダーに保存する」と言っており、Windowsでの例に進みます。Linuxの「git-diffall」ファイルはどこに保存しましたか?
m4l490n 2017

2
git-diffallファイルをC:\Program Files\Git\cmdフォルダーに追加した後、Windowsを再起動する必要がありますか?私は指示されたとおりに行いましたが、実行すると $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld ソース管理下のディレクトリ(Git、Mercurial、Subversion、Bazaarなど)を指定すると、変更されたすべてのファイルが自動的に一覧表示され、ダブルクリックして個々の違いを表示できるという便利な機能があります。

IMOはmeld .、VCSを起動するように構成するよりも、入力してVCSを理解する方がはるかに簡単meldです。さらに、プロジェクトで使用しているVCSが何であっても同じコマンドを使用できます。これは、それらを頻繁に切り替える場合に便利です。

唯一の欠点は、meldが変更をスキャンするのがgit / hg / svnから変更を渡すよりも遅いことですが、問題になるほど遅いかどうかは、それをどのように使用しているかによって異なります。


4
私にとっての主な欠点は、(何らかの理由で)meldが新しいタブではなく新しいウィンドウでdiffを開き、diffを閉じた後に、作業ディレクトリ内のファイルが新しいタブで開き、以前に迷惑なポップアップメッセージが表示されることです。
kynan

素晴らしいツールですが、恐ろしいWindowsのインストール(2012年初頭現在)。
2012

@kynanこれは、面倒な二重ウィンドウのポップアップのものでなければ、VCSに依存しない方法で差分を比較するのに最適なソリューションのようです。それは残念だ。:(
PKKid

meldの優れた機能は、diffフィルターです。たとえば、コメントの変更や空白行の追加/削除は無視git diffしてください。これは提供されていません。
kynan 2012年

1
私はこのアプローチを1年ほど使用しています。小規模なプロジェクトでは問題なく機能しますが、大規模なプロジェクト(つまり、多数のファイル)があると、手動でgit diffを「スキャン」するため、非常に遅くなります(gitが明確にリストを提供できるのに、なぜこのアプローチを取るのかわかりません)ファイルを直接...)
namuol 2013

3

私はこの方法(GitDiff.batおよびGitDiff.rb)を見つけ、ファイルを古い/新しい一時ディレクトリにコピーしてから、それらをフォルダー比較します。

ただし、BeyondCompareには差分ウィンドウ内からファイルを編集できる便利な機能があるため、作業ファイルを直接(作業ディレクトリから)表示したいので、すばやくクリーンアップできます。

編集:gitメーリングリストでの私の質問に対する回答として、ここ同様の方法



2

Araxis Mergeには '-nowait'コマンドオプションがあることに注意してください

-nowaitは、compareが比較が終了するのを待つのを防ぎます。

多分これはすぐに終了コードを返し、うまくいくでしょう、誰もがこれを経験しましたか?BeyondCompareの同様のオプションが見つかりません...


2

DiffuseにはVCSも統合されています。SVN、Mercurial、Bazaarなど、他の多数のVCSと相互運用します。Gitの場合、すべてではないが一部の変更がステージングされると、3つのペインが表示されます。競合が発生した場合は、4つのペインが表示されます。

段階的編集と段階的でない編集を伴う拡散のスクリーンショット

で呼び出す

diffuse -m

あなたのGit作業コピーに。

あなたが私に尋ねると、私が10年間見てきた中で最高のビジュアルは異なります。(そして私もmeldを試しました。)


特にディフューズで、ディフューズのどの部分が好きかわかりますか?
musiphil 2015

@musiphil:私はその単純さが好きです-タスクを解決するために必要な機能の正確なセットを持っているようです。(違いの再調整やタブサイズの幅と同様です。)meldから切り替えた理由を覚えていません。それ以来、meldを使用していないため、実際に比較することはできません。
krlmlr 2015

1
拡散は設定なしでgitで動作しました。Diffuse -mは単一のウィンドウを開き、異なるタブにgit diffを表示します。他のツールでは、始めるのに多くの設定が必要です。
モッシュ2018

1

あなたがしたいすべてが現在変更されているすべてのファイルを開くことである場合、次のようなことを試してください:

vi $(git status | sed -n '/.*modified:* / s /// p')

「複雑な一連の変更」をコミットする場合は、ワークフローを再検討する必要があります。gitの非常に優れた機能の1つは、開発者が複雑な変更セットを一連の単純なパッチに簡単に削減できることです。現在変更されているすべてのファイルを編集しようとするのではなく、

git add --patch
これにより、ハンクを選択的にステージングできます。


1

2つの作業ツリーを複製してDiffMergeと比較するPowerShellスクリプトを作成しました。だからあなたはできる:

GitNdiff master~3 .

たとえば、3回前のマスターブランチと現在の作業ツリーを比較します。

その光沢があり、新しく、おそらくバグがたくさんあります。1つの欠点は、まだ追加されていない作業ツリー内のファイルが両方の作業ツリーにコピーされることです。遅くなることもあります。

http://github.com/fschwiet/GitNdiff


1

Mac OS XでAraxisを使用してgit-diffallを使用することに関心がある人のために、githubでgit-diffallプロジェクトをforkし、Araxis MergeコマンドをラップするAppleScriptを追加しました。注:これは、araxisgitdiffMac OS XのAraxis Mergeに同梱されているファイルのわずかに変更されたクローンです。

https://github.com/sorens/git-diffall


1

以下は、meldおよびkdiff3で動作します

git difftool --dir-diff origin/branch1..origin/branch2

簡単に閲覧できるウィンドウですべてのファイルを開きます。origin / branch-nameの代わりにチェンジセットで使用できます

例えば: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

gitkを使用して、すべての違いを同時に確認できます


3
はい、私はgitkが便利だと思いますが、BCを比較することに関しては、私が見たいものです:)
Seba Illingworth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.