Gitで、同じブランチ(たとえばマスター)上の2つの異なるコミット(隣接していない)の間で同じファイルをどのように比較できますか?
Visual SourceSafe(VSS)やTeam Foundation Server(TFS)のような比較機能を探しています。
Gitでそれは可能ですか?
Gitで、同じブランチ(たとえばマスター)上の2つの異なるコミット(隣接していない)の間で同じファイルをどのように比較できますか?
Visual SourceSafe(VSS)やTeam Foundation Server(TFS)のような比較機能を探しています。
Gitでそれは可能ですか?
回答:
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
--
は、という名前のファイルがある場合などに便利です-p
。スクリプトで使用すると効果的ですが、実際に必要になるのはまれな場合だけです。
次のように、2つの異なるリビジョンの2つの異なるファイルを比較することもできます。
git diff <revision_1>:<file_1> <revision_2>:<file_2>
<file_1>
して<file_2>
、現在のディレクトリではなく、トップレベルのgitの管理ディレクトリにあり、1が先頭に追加する必要があり./
ます。UNIXの場合<revision_1>:./filename_1
「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\"
チェックして$ git log
、2つの異なるコミットのSHA-1 IDをコピーし、git diff
それらのIDを使用してコマンドを実行します。例えば:
$ git diff (sha-id-one) (sha-id-two)
git diff (sha-id-one) (sha-id-two) -- filename.ext
ファイル名がない場合、これらの2つのコミットのすべてのファイルの差分がリストされます。
コミットごとに2つのコミット間のファイルへのすべての変更を確認する場合は、次のようにすることもできます。
git log -u $start_commit..$end_commit -- path/to/file
これは、Gitログコマンドで見つかった特定のファイルの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
次に、シェルウィンドウセッションでカットアンドペーストするか、パイプでに転送し/bin/sh
ます。
ノート:
コード:
# 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;
}
@mipadiで指定されたメソッドを使用して、複数のファイルでdiffを作成する場合:
たとえば、HEAD
との差分を作成してmaster
、すべての.coffee
ファイルを見つけます。
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
これによりyour_search_folder/
、すべての.coffee
ファイルが再帰的に検索され、それらのファイルとそのmaster
バージョンとの差分が作成されます。
複数のファイルまたはディレクトリがあり、非継続的なコミットを比較したい場合、これを行うことができます:
一時的なブランチを作成します(この例では「リビジョン」)
git checkout -b revision
最初のコミットターゲットまで巻き戻し
git reset --hard <commit_target>
興味のあるコミットのチェリーピッキング
git cherry-pick <commit_interested> ...
差分を適用
git diff <commit-target>^
終わったら
git branch -D revision
Visual SourceSafeやTeam Foundation Server(TFS)で取得できるようなWindowsでの単純な視覚的比較が必要な場合は、次のことを試してください。
注:Windows 10にアップグレードした後、Gitコンテキストメニューオプションが失われました。ただし、コマンドウィンドウで「gitk」または「gitk filename」を使用して同じことを実現できます。
「Git履歴」を呼び出すと、Git GUIツールが起動し、左上のペインにファイルの履歴が表示されます。比較するバージョンの1つを選択します。次に、2番目のバージョンを右クリックし、いずれかを選択します
これを比較->選択
または
選択した差分->これ
色分けされた違いが左下のペインに表示されます。
..
は機能しますが、実際には必要ありません(かなり古いバージョンを除いて)。2つのコミットが非常に離れている場合は、git log
またはgitk
を使用して、使用するSHA1を見つけることもできます。gitk
また、コンテキストメニューに「diff selected-> this」と「diff this-> selected」があります。