如何将文件(例如pom.xml)从master分支与Git中的任意较旧版本进行比较?

#1 楼

您可以执行以下操作:

git diff master~20:pom.xml pom.xml


...将您当前的pom.xml与20个修订版中的master到第一个父级的版本进行比较。当然,您可以用提交的对象名称(SHA1sum)或指定修订版本的许多其他方式中的任何一种来替换master~20

请注意,这实际上是将旧的pom.xml与版本进行比较在您的工作树中,而不是在master中提交的版本。如果需要,则可以改为执行以下操作:

git diff master~20:pom.xml master:pom.xml


评论


请注意,这不仅适用于文件,还适用于(子)目录,例如git diff :foo / HEAD:foo /。

–user456814
2014年7月5日在18:59



还要注意,在Windows上,如果您使用的是版本说明符,则需要对目录使用正斜杠,否则git会给您有关该版本中不存在的文件/目录的错误。

–迪伦·尼斯利(Dylan Nissley)
2014年11月21日13:38

@DylanNissley否则它不会给您带来任何错误和差异。这就是我所看到的。无论如何,感谢您提供有关使用正斜杠而不是反斜杠的提示。

–加里·谢泼德(Gary Sheppard)
17年8月17日在20:05

使用Windows文件,我发现更容易更改目录,然后调用git diff master〜20:./ pom.xml ./pom.xml

–劳埃德
18年8月24日在6:16

某些版本的git在之间需要“-”

–乔什
20-4-27的3:36

#2 楼

git diff <revision> <path>


例如:

git diff b0d14a4 foobar.txt


评论


如果文件不在当前目录中,则不适用于1.7.11版本。示例:'git diff f76d078 test / Config'产生“错误:无法访问'test / f76d078'”

–简单用户
2013年12月4日21:21



@ user1663987仅传递相对于项目根目录的完整路径:git diff <版本>根目录/路径/文件。

–user456814
14年6月27日在17:23

test / Config是相对于根目录的(例如test是根目录的子目录)。但是您的示例根目录/路径/文件似乎包含根目录了吗?

–简单用户
2014年6月29日下午5:55

#3 楼

如果要查看单个文件的最后一次提交之间的区别,可以执行以下操作:比较您的本地文件。

评论


这没有返回任何东西

– Andrei Cristian Prodan
14-10-17在12:05

@AndreiCristianProdan然后,您在那里没有任何更改。您可以逐步增加-1,直到获得更改。

– kaiser
2014年10月30日11:30

很好我创建了一个可能有用的bash函数:gitlog(){git log-$ {3 :-p}-$ {2:-1} $ 1; }的用法:gitlog Rakefile或gitlog Rakefile 5和gitlog Rakefile 10 s。第一个显示一个差异。第二个显示五个差异;第三个显示十个-不打补丁。

–辅助总线
18年6月7日在13:12



#4 楼

要查看上次提交中文件中的更改:
git diff HEAD~1 path/to/file

您可以将数字(〜1)更改为要与之进行比较的第n个提交。

评论


这个答案实际上只是这个更通用答案的一个特例,用HEAD〜1代替,这使这个答案成为重复。

–user456814
14年7月17日在21:52

这不起作用!致命:参数“ HEAD〜1”不明确:未知版本或不在工作树中的路径。使用“-”将路径与修订分开

– Andrei Cristian Prodan
14-10-17在12:04

对于我来说,这个答案很简单且实用。

–道格拉斯·弗里(Douglas Frari)
19年5月9日在11:46

#5 楼

通用语法:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt


用于仓库中所有名为“ FileName.xml”的文件。

注意“-”之间的空格和“ **”

回答您的问题:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 


和git一样,您可以使用tag / sha1 /“ HEAD ^“表示提交。

在Ubuntu上使用git 1.9.1进行了测试。

#6 楼

要比较5个提交给当前提交的提交,只需在master上执行以下操作即可:

git diff master~5:pom.xml master:pom.xml


还可以引用提交哈希数,例如,如果哈希数是x110bd64,您可以执行以下操作以查看区别:

git diff x110bd64 pom.xml


#7 楼

如果两个提交都不是您的HEAD,那么bash的大括号扩展被证明真的很有用,特别是如果您的文件名很长,则上面的示例:

 git diff master~20:pom.xml master:pom.xml
  

将成为

 git diff {master~20,master}:pom.xml
 


有关Brace扩展的更多信息重击。

#8 楼

git diff -w HEAD原始/主路径/到/文件

#9 楼

git diff master~20 -- pom.xml


如果您也不在master分支中,也可以工作。

#10 楼

如果您可以使用图形工具(甚至更喜欢),可以:

gitk pom.xml


在gitk中,您可以单击任何提交(“选择”它),然后右键单击任何其他提交,以根据您喜欢的顺序在弹出菜单中选择“差异为->选定”或“差异为->此”。

#11 楼

对于有兴趣从GitHub执行相同操作的人,请参阅比较不同时间的提交。

#12 楼

例如,如果您需要对存储中的单个文件进行比较,则可以

git diff stash@{0} -- path/to/file


#13 楼

如果您要查找特定提交上的差异,并且要使用github UI而不是命令行(例如,您要将其链接到其他人),则可以执行以下操作:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>


例如:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

请注意右上角的Previous和Next链接,这些链接使您可以浏览提交中的所有文件。

尽管这仅适用于特定的提交,但不适用于在任意两个版本之间进行比较。