How can I diff a file, say pom.xml
, from the master branch to an arbitrary older version in Git?
13 回答
你可以做:
git diff master~20:pom.xml pom.xml
...将您的当前版本pom.xml
与master
20 年前通过第一个父版本的版本进行比较。当然,您可以将 替换master~20
为提交的对象名称 (SHA1sum) 或指定修订的许多其他方式中的任何一种。
请注意,这实际上是将旧pom.xml
版本与工作树中的版本进行比较,而不是在master
. 如果你愿意,那么你可以改为执行以下操作:
git diff master~20:pom.xml master:pom.xml
git diff <revision> <path>
例如:
git diff b0d14a4 foobar.txt
如果您想查看单个文件的最后一次提交之间的差异,您可以执行以下操作:
git log -p -1 filename
这将为您提供 git 中文件的差异,而不是比较您的本地文件。
要查看上次提交中文件的更改内容:
git diff HEAD~1 path/to/file
您可以将数字 (~1) 更改为您想要比较的第 n 个提交。
通用语法:
$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 进行了测试。
为了将 5 提交与当前提交进行比较,两者都 on master
,只需执行以下操作:
git diff master~5:pom.xml master:pom.xml
您也可以参考提交哈希数,例如如果哈希数是x110bd64
,您可以执行以下操作来查看差异:
git diff x110bd64 pom.xml
如果两个提交都不是你的 HEAD,那么 bash 的大括号扩展证明真的很有用,特别是如果你的文件名很长,上面的例子:
git diff master~20:pom.xml master:pom.xml
会成为
git diff {master~20,master}:pom.xml
更多关于使用 bash进行Brace 扩展的信息。
git diff -w HEAD origin/master path/to/file
git diff master~20 -- pom.xml
如果您不在 master 分支中也可以使用。
如果您可以使用图形工具(甚至更喜欢它),您可以:
gitk pom.xml
然后在 gitk 中,您可以单击任何提交(以“选择”它)并右键单击任何其他提交以在弹出菜单中选择“Diff this -> selected”或“Diff selected -> this”,具体取决于您喜欢的顺序。
对于有兴趣在 GitHub 上做同样事情的人,请参阅跨时间比较提交。
例如,如果您需要对存储中的单个文件进行比较,您可以这样做
git diff stash@{0} -- path/to/file
如果您正在寻找特定提交的差异并且您想使用 github UI 而不是命令行(假设您想将其链接到其他人),您可以执行以下操作:
https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>
例如:
请注意右上角的上一个和下一个链接,它们允许您浏览提交中的所有文件。
但这仅适用于特定提交,不适用于比较任何两个任意版本。