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

问题描述 投票:0回答:15

如何将文件(例如

pom.xml
)从 master 分支与 Git 中的任意旧版本进行比较?

git diff git-diff
15个回答
467
投票

你可以这样做:

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

...将您当前的

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

请注意,这实际上是将旧的

pom.xml
与工作树中的版本进行比较,而不是在
master
中提交的版本。 如果您想要这样,那么您可以执行以下操作:

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

200
投票
git diff <revision> <path>

例如:

git diff b0d14a4 foobar.txt

60
投票

如果您想查看单个文件的最后一次提交之间的差异,您可以执行以下操作:

git log -p -1 filename

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


53
投票

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

git diff HEAD~1 -- path/to/file

您可以将数字 (~1) 更改为您想要比较的第 n 个提交。


13
投票
git diff -w HEAD origin/master path/to/file

-w 忽略空格


11
投票

通用语法:

$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 进行测试。


8
投票

如果两个提交都不是您的 HEAD,那么 bash 的 brace 扩展 证明非常有用,特别是如果您的文件名很长,如上面的示例:

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

会成为

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

更多关于 bash 的大括号扩展


7
投票

为了与当前的 5 次提交进行比较,都在

master
上,只需简单地执行:

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

你也可以参考commit hash number,例如如果hash number是

x110bd64
,你可以这样做来看看差异:

git diff x110bd64 pom.xml

3
投票
git diff master~20 -- pom.xml

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


2
投票

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

gitk pom.xml

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


1
投票

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


1
投票

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

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

1
投票

假设您想要比较位于

interrupt.c
 的文件 
firmware/src/


工作区域(尚未提交或暂存的内容)和最新提交之间的差异工具:

git difftool头固件/src/interrupt.c

git difftool 头 *interrupt.c

注意:要在最后提交的版本之前比较 x 版本,请将“head”替换为 head~x。例如,将“head”替换为“head~2”,以区分工作区域和最新提交之前的 2 个版本


两个特定提交版本之间的差异工具:

首先使用下一行获取要比较的版本的 id

git log --oneline

您将获得所有已提交版本的列表。选择两个并复制他们的 ID。

enter image description here

在里面输入id

{}
:

git difftool {2fae9e6,a21dd00} 固件/src/interrupt.c

git difftool {2fae9e6,a21dd00} *中断.c

注意:如果文件之间没有差异,则不会打开任何内容。你只会在 git bash 中得到一个空行


0
投票

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

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

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


0
投票

检查特定目录中所有文件的差异,例如。

develop
分支和
feature/my_feature
分支:

git checkout develop
git diff feature/my_feature: src/main/
© www.soinside.com 2019 - 2024. All rights reserved.