web-dev-qa-db-ja.com

同じブランチ上の2つの異なるコミット間で同じファイルをどこのように比較すればいいですか?

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

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

994
systempuntoout

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
1316
mipadi

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

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

242
Jakub Narębski

あなたが "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\"
78
Anver Sadhat

$ git logを確認してから、2つの異なるコミットのSHA idをコピーして、それらのIDを指定してgit diffコマンドを実行します。次に例を示します。

$ git diff (sha-id-one) (sha-id-two)
40
Vibhuti

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

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

38
cxreg

これは、git logコマンドで見つかった、特定のファイルに対するgit diffコマンドを出力する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

これは、シェルウィンドウセッションでNを貼り付けるか、/ bin/shにパイプで送ることができます。

ノート:

  1. 数値(この場合は3)は、印刷する行数を指定します。
  2. ファイル(この場合はpom.xml)は両方の場所で一致する必要があります(両方の場所で同じファイルを提供するためにShell関数でラップすることができます)。

コード:

# 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;
}
21
user2520657

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

一時的な分岐をする

git checkout -b revision

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

git reset --hard <commit_target>

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

git cherry-pick <commit_interested> ...

差分を適用

git diff <commit-target>^

終わったら

git branch -D revision
13
dvdvck

@mipadiで指定された方法で、複数のファイルとの差分を作りたい場合は、

例えば。すべての.coffeeファイルを見つけるためのHEADとあなたのmasterとの差分:

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

これは、すべてのyour_search_folder/ファイルについてあなたの.coffeeを再帰的に検索し、それらとそれらのmasterバージョンの間の差分を作ります。

11

Gitの素晴らしさを使うためのもう一つの方法...

git difftool HEAD HEAD@{N} /PATH/FILE.ext
8
Eddie B

あなたがVSSまたはTFSで得ることができるようにあなたがWindowsで単純な視覚的な比較をしたいならば、これを試してください:

  • ファイルエクスプローラでファイルを右クリック
  • [Git History]を選択します

注:Windows 10にアップグレードした後、私はgitのコンテキストメニューオプションを失いました。ただし、コマンドウィンドウで 'gitk'または 'gitk filename'を使用しても同じことができます。

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

これを差分 - >選択

または

差分選択 - >これ

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

1
Resource