在Git中跨多个分支比较单个文件的不同

5

在Git仓库中给定一个单独的文件,我该如何最轻松地跨多个本地分支进行差异比较? 我可以一次检出每个分支,并将其与公共基线进行差异比较,但我正在寻找一种轻松可视化5个或更多分支之间的差异的方法。

1个回答

9
在Git存储库中给定一个单独的文件,如何最轻松地跨多个本地分支进行diff?Git的git diff实际上只比较两个东西。这两个东西可以是整个提交/树或单个文件。要命名提交,可以使用 gitrevisions文档中描述的任何表达式,包括分支名称。如果您命名了提交,则git diff将比较该提交的已保存快照(其树)。如果您命名了文件,则git diff将比较该文件。正如 git diff文档所述,当您想要比较特定的两个文件时,必须同时命名两个文件。(与例如git diff HEAD相反,后者将HEAD提交或更准确地说,它的树快照与整个工作树进行比较。)我可以逐个检出每个分支并将其与公共基线进行比较...

不需要将文件签出以供给 git diff 使用:

git diff <revision>:<path> <revision>:<path>

Git称之为blob的两个名称,这是它对文件的通用术语。1因此,如果您想比较提交a123456中文件README.txt的内容与提交fedcba9README.txt的内容:

git diff a123456:README.txt fedcba9:README.txt

如果您想要的提交(例如a123456)是分支develop的最新提交,那么分支名称在此处适用:
git diff develop:README.txt fedcba9:README.txt

但是,再次强调,比较仅限于成对的左侧文件和右侧文件。

正如eftshift0在评论中所指出的那样,如果文件在两个提交中具有相同的path,您可以让Git diff提交并告诉您有关该文件的信息:

git diff <commit1> <commit2> -- <path>

这在你想要比较几个文件或整个子树时特别有用:
git diff $old $new -- dir/sub/

这里为您提供一份指南,告诉您如何处理 dir/sub/ 目录下的 每一个 文件,以将提交记录 $old 的内容转换成提交记录 $new 的内容,并且:

git diff $old $new -- $file1 $file2

如果两个文件都被更改,它会告诉您关于这两个文件的更改。

1实际上,Git将符号链接目标存储为blob内容,因此更多的内容需要被存储。


2
如果修订版本之间的路径相同(大多数情况下是这样),可以执行以下操作:git diff revision1..revision2 -- some-path。使用@toreks的示例之一:git diff a123456..fedcba9 -- README.txt - eftshift0
1
@eftshift0:是的,你也不需要那两个点。从某种意义上说,这会让Git更加努力(提取两个提交,对它们进行差异比较,然后仅显示一个文件的差异),但Git在内部优化了这个任务(提取两个提交,丢弃除一个文件外的所有内容,对一个文件进行差异比较)。 - torek
1
非常感谢您的帮助,@torek! - blaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接