web-dev-qa-db-ja.com

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

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

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

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

226

ここに私が決めたものがあります...

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

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

Git install dirのcmdフォルダーにファイルを配置します(例: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つの画面が開きます。

61

git v1.7.11以降では、 git difftool --dir-diff を使用してディレクトリ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}"
)

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


これと同じ質問が git mail list で行われました。

そのメールスレッドに基づいて、任意のコミット間でディレクトリdiffを実行するシェルスクリプトを作成しました。

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

V1.7.10より前のバージョンでは、 git-diffall プロジェクトから GitHub にインストールできます。

プロジェクトの説明は次のとおりです。

Git-diffallスクリプトは、gitのディレクトリベースのdiffメカニズムを提供します。このスクリプトは、使用するdiffビューアを決定するためにdiff.tool構成オプションに依存しています。

このスクリプトは、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>:両方の<commit>の共通の祖先から始まる、2番目までのブランチの変更を表示します

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

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

199
Tim Henigan

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

IMOでは、meldを起動するようにVCSを設定するよりも、meld .と入力してVCSを把握する方がはるかに簡単です。さらに、プロジェクトで使用しているVCSに関係なく同じコマンドを使用できます。これは、頻繁に切り替える場合に最適です。

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

19
Tom

git meld => https://github.com/wmanley/git-meld は、すべてのファイルのきちんとした差分を1つのウィンドウで開く素晴らしいスクリプトです。

3

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

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

編集:a 同様の方法 gitメーリングリストでの私の質問への回答。

3

Diffuse にはVCS統合もあります。 SVN、Mercurial、Bazaarなど、他の多数のVCSと相互運用します。競合の場合、4つのペインもあります。

Screenshot of diffuse with staged and unstaged edits

で呼び出す

diffuse -m

gitの作業コピーに。

あなたが私に尋ねると、私が10年間見てきた最高の視覚的な違いがあります。 (そして、私もメルドを試みました。)

2
krlmlr

現在変更されているすべてのファイルを開くだけの場合は、次のようにします。

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

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

git add --patch
1
William Pursell

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

GitNdiff master~3 .

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

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

http://github.com/fschwiet/GitNdiff

1

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

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

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

例:git difftool --dir-diff Origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1

1
feltspar

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

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

1
sorens

ここで表記 Araxis Mergeには「-nowait」コマンドオプションがあります:

-nowait比較が比較のクローズを待機しないようにします

たぶん、これは即時終了コードを返し、動作するでしょう、誰もがこれを経験しましたか? BeyondCompareの同様のオプションが見つかりません...

1