在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; }