如何在Git中将一个文件与任意版本进行比较?


324

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

Answers:


347

你可以做:

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

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

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

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

12
请注意,这不仅适用于文件,还适用于(子)目录git diff <revision>:foo/ HEAD:foo/

2
另请注意,在Windows上,如果您使用的是版本说明符,则需要对目录使用正斜杠,否则git会为您提供有关该版本中不存在的文件/目录的错误。
Dylan Nissley 2014年

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

与Windows文件我发现它更容易更改目录,然后调用git的差异高手〜20:./的pom.xml ./pom.xml
劳埃德

某些版本的git在<revision>和<path>之间需要“-”
Josh

140
git diff <revision> <path>

例如:

git diff b0d14a4 foobar.txt

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

1
@ user1663987仅传递相对于项目根目录的完整路径git diff <revision> root/path/file

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

41

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

git log -p -1 filename

这将为您提供git中文件的差异,而不是比较本地文件。


2
这不会返回任何内容
Andrei Cristian Prodan 2014年

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

很好 我创建了一个bash函数,该函数可能会有用: gitlog () { git log -${3:-p} -${2:-1} $1; } 像这样使用:gitlog Rakefilegitlog Rakefile 5gitlog Rakefile 10 s。第一个显示一个差异。第二个显示五个差异;第三个显示十个--no-patch
auxbuss,2018年

18

要查看上次提交中文件中的更改:

git diff HEAD~1 path/to/file.

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


这个答案实际上只是这个更通用的答案的一个特例,其中HEAD~1替换为<revision>,这使这个答案成为重复。

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

对于我来说,这个答案是简单而实用的。
道格拉斯·弗雷里

6

通用语法:

$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

如果两个提交都不是您的HEAD,那么bash的大括号扩展被证明是非常有用的,尤其是在文件名很长的情况下,上述示例:

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

会成为

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

有关使用bash 扩展Brace的更多信息。


6

为了比较5个提交到当前提交master,只需在上做一下:

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

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

git diff x110bd64 pom.xml



2

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

gitk pom.xml

然后,在gitk中,您可以单击任何提交(以“选择”它),然后右键单击任何其他提交以在弹出菜单中选择“ Diff this-> selected”或“ Diff selected-> this”,具体取决于您喜欢的顺序。



0

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

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

-1

如果您正在寻找特定提交上的差异,并且想要使用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

请注意右上角的“上一个”和“下一个”链接,这些链接使您可以浏览提交中的所有文件。

但是,这仅适用于特定的提交,不适用于任何两个任意版本之间的比较。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.