在Git中,我如何比較同一分支(例如master)上兩個不一樣提交(不連續)之間的相同文件? git
我正在搜索Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的比較功能。 Git有可能嗎? shell
檢查$ git log
,而後複製2個不一樣提交的SHA id,而後使用這些id運行git diff
命令,例如: less
$ git diff (sha-id-one) (sha-id-two)
另外一種使用git真棒的方法...... 函數
git difftool HEAD HEAD@{N} /PATH/FILE.ext
若是您有多個文件或目錄並想要比較非連續提交,則能夠執行如下操做: spa
作一個時間分支 rest
git checkout -b revision
回退到第一個提交目標 code
git reset --hard <commit_target>
對那些承諾感興趣的櫻桃採摘 xml
git cherry-pick <commit_interested> ...
應用差別 遞歸
git diff <commit-target>^
當你完成 ip
git branch -D revision
若是要使用多個文件進行差別,請使用@mipadi指定的方法:
例如HEAD
和你的master
之間的差別,找到全部.coffee
文件:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
這將遞歸搜索your_search_folder/
全部.coffee
文件,並在它們和master
版本之間進行.coffee
。
這是一個perl腳本,它打印出git log命令中找到的給定文件的git diff命令。
例如
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
而後能夠將其粘貼在shell窗口會話中或者經過管道傳送到/ 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; }