如何在同一分支上的两个不同的提交之间区分同一个文件?
在git上,我怎么能比较相同的分支(主例如)两个不同的提交(不连续)相同的文件?
我正在寻找一个像VSS或TFS中的比较function,可以在Git中吗?
从git-diff
页:
git diff [--options] <commit> <commit> [--] [<path>...]
例如,要看到现在和两个提交之间的文件“main.c”的差异,这里有三个等同的命令:
$ git diff HEAD^^ HEAD main.c $ git diff HEAD^^..HEAD -- main.c $ git diff HEAD~2 HEAD -- main.c
您还可以在两个不同的修订版本中比较两个不同的文件,如下所示:
git diff < revision_1 >:< file_1 > < revision_2 >:< file_2 >
如果您已经configuration了可以使用的“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 -u $start_commit..$end_commit -- path/to/file
检查$ git log
,然后复制2个不同提交的SHA id,然后用这些id运行git diff
命令,例如:
$ git diff (sha-id-one) (sha-id-two)
这是一个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
然后可以剪切N粘贴在shell窗口会话或pipe道到/ bin / sh。
笔记:
- 数字(在这种情况下为3)指定要打印的行数
- 这个文件(在这种情况下是pom.xml)必须在两个地方都一致(你可以把它包装在一个shell函数中,在两个地方提供相同的文件),或者把它作为一个shell脚本放到一个bin目录中
码:
# 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指定的方法对多个文件进行比较,请执行以下操作:
例如HEAD
和你的master
之间的差异,find所有.coffee
文件:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
这将recursionsearchyour_search_folder/
所有.coffee
文件,并在它们与其master
版本之间进行.coffee
。
只是另一种使用Git的迷人的方式…
git difftool HEAD HEAD@{N} /PATH/FILE.ext
如果你有几个文件或目录,并想比较非连续的提交,你可以这样做:
做一个时间分支
git checkout -b revision
倒回到第一个提交目标
git reset --hard <commit_target>
樱桃采摘那些提交感兴趣
git cherry-pick <commit_interested> ...
应用差异
git diff <commit-target>^
当你完成
git branch -D revision
如果你想在Windows上进行一个简单的视觉比较,例如你可以在VSS或TFS中获得,可以试试这个:
- 右键单击文件资源pipe理器中的文件
- select“Git History”
Git GUI工具将启动,并在左上方的窗格中显示该文件的历史logging。 select您想要比较的版本之一。 然后右键单击第二个版本并select其中一个
比较这个 – >选中
要么
差异select – >这个
颜色编码的差异将出现在左下方的窗格中。