1322

Gitでは、同じブランチ(マスターなど)の2つの異なるコミット(連続していない)間で同じファイルを比較するにはどうすればよいですか?

Visual SourceSafe(VSS)やTeam Foundation Server(TFS)のような比較機能を探しています。 Gitで可能ですか?

4

11 に答える 11

1673

マンページからgit-diff

git diff [--options] <commit> <commit> [--] [<path>...]

たとえば、ファイル「main.c」の現在と2つのコミットの違いを確認するには、次の3つの同等のコマンドを使用します。

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
于 2010-07-26T19:13:13.993 に答える
338

次のように、2つの異なるリビジョンの2つの異なるファイルを比較することもできます。

git diff <revision_1>:<file_1> <revision_2>:<file_2>

于 2010-07-27T12:18:06.937 に答える
99

「difftool」を構成している場合は、次を使用できます

git difftool revision_1:file_1 revision_2:file_2

例:ファイルを最後のコミットから同じブランチの前のコミットと比較する:プロジェクトのルートフォルダーにいる場合

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

〜/.gitconfigまたはproject/ .git/configファイルに次のエントリが必要です。p4mergeをインストールします[これは私の好みの差分およびマージツールです]

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

注:IntellijEnterpriseまたはCommunityEditionを使用している場合-3ウェイマージに最適なツールの1つです。

于 2012-01-03T11:45:07.500 に答える
67

チェックして、2つの異なるコミットのSHA-1$ git log IDをコピーし、それらのIDでコマンドを実行します。例えば:git diff

$ git diff (sha-id-one) (sha-id-two)
于 2012-04-19T00:14:48.537 に答える
42

コミットごとに2つのコミット間のファイルへのすべての変更を確認したい場合は、次のこともできます。

git log -u $start_commit..$end_commit -- path/to/file

于 2010-07-26T20:50:54.087 に答える
22

これは、Gitログコマンドで見つかった特定のファイルのGitdiffコマンドを出力するPerlスクリプトです。

例えば

git log pom.xml | perl gldiff.pl 3 pom.xml

収量:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

次に、シェルウィンドウセッションで切り取って貼り付けるか、にパイプすることができます/bin/sh

ノート:

  1. 数字(この場合は3)は、印刷する行数を指定します
  2. ファイル(この場合はpom.xml)は、両方の場所で一致する必要があります(シェル関数でラップして、両方の場所で同じファイルを提供できます)。または、シェルスクリプトとしてバイナリディレクトリに配置する必要があります。

コード:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}
于 2013-07-11T22:24:10.800 に答える
16

複数のファイルまたはディレクトリがあり、非連続コミットを比較したい場合は、次のようにすることができます。

一時的なブランチを作成します(この例では「リビジョン」 )

git checkout -b revision

最初のコミットターゲットに巻き戻します

git reset --hard <commit_target>

興味のあるコミットをチェリーピッキング

git cherry-pick <commit_interested> ...

差分を適用する

git diff <commit-target>^

終わったら

git branch -D revision
于 2012-08-25T14:08:51.653 に答える
15

@mipadiで指定されたメソッドを使用して、複数のファイルで差分を作成する場合:

HEADたとえば、との間の差分、すべてのファイルmasterを検索するには:.coffee

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

your_search_folder/これにより、すべてのファイルが再帰的に検索され.coffee、それらのファイルとそのmasterバージョンが異なります。

于 2012-11-30T15:04:43.167 に答える
12

Gitの素晴らしさを使用するもう1つの方法...

git difftool HEAD HEAD@{N} /PATH/FILE.ext
于 2012-08-02T20:13:45.813 に答える
5

他のすべての回答はより完全なので、賛成してください。これは、最近のコミットのIDを知らないようにすることができることを覚えておいてください。通常、私は比較したいブランチに自分自身を設定し、古いコミットuidを知っているdiffツールを実行します(他の表記法を使用できます):

git checkout master
git difftool 6f8bba my/file/relative/path.py

また、ここでこの他の応答をチェックして、ファイルを比較するためにgitを開きたいツールを設定します 。.gitconfigを使用したdiffツールの構成 そしてdifftoolの詳細については、difftoolドキュメントにアクセスしてください。

于 2020-08-11T17:00:56.083 に答える
4

VisualSourceSafeTeamFoundationServer(TFS)で取得できるような、Windowsでの簡単な視覚的な比較が必要な場合は、次のことを試してください。

  • ファイルエクスプローラーでファイルを右クリックします
  • 「Git履歴」を選択します

注:Windows 10にアップグレードした後、Gitのコンテキストメニューオプションが失われました。ただし、コマンドウィンドウで「gitk」または「gitkfilename」を使用して同じことを実現できます。

「Git履歴」を呼び出すと、Git GUIツールが起動し、左上のペインにファイルの履歴が表示されます。比較するバージョンの1つを選択します。次に、2番目のバージョンを右クリックして、いずれかを選択します

これを比較->選択

また

選択した差分->これ

色分けされた違いが左下のペインに表示されます。

于 2015-01-08T14:35:45.920 に答える