在 Git 中跨多个分支区分单个文件

bla*_*ter 5 git

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

tor*_*rek 9

\n

给定 Git 存储库中的单个文件,我如何才能最轻松地diff跨多个本地分支?

\n
\n\n

Gitgit diff一次实际上只比较两个事物。这两件事可以是整个提交/树,也可以是单个文件。

\n\n

要命名提交,您可以使用gitrevisions 文档中描述的任何表达式,包括分支名称。如果您命名一个提交,git diff则会比较该提交的已保存快照(其树)。如果您命名一个文件,git diff则比较该文件。正如文档git diff所述,当您想要比较两个文件时,您必须命名这两个文件。(这与例如 相比git diff HEAD,它将HEAD提交\xe2\x80\x94 或者更确切地说,其树快照\xe2\x80\x94 与整个工作树进行比较。)

\n\n
\n

我可以一次检查每个分支,并将其与公共基线进行比较......

\n
\n\n

无需签出文件即可将其提供给git diff

\n\n
git diff <revision>:<path> <revision>:<path>\n
Run Code Online (Sandbox Code Playgroud)\n\n

命名了 Git 所称的blob中的两个,它或多或少是文件的通用术语。1README.txt因此,如果您想将commit 中的 文件内容a123456README.txtcommit 中的文件内容进行比较fedcba9

\n\n
git diff a123456:README.txt fedcba9:README.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想要的提交(例如a123456)是分支的提示提交develop,则分支名称在这里起作用:

\n\n
git diff develop:README.txt fedcba9:README.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,同样,比较是严格成对的:左侧文件与右侧文件。

\n\n

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

\n\n
git diff <commit1> <commit2> -- <path>\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想要比较多个文件或整个子树,这特别有用:

\n\n
git diff $old $new -- dir/sub/\n
Run Code Online (Sandbox Code Playgroud)\n\n

为您提供有关如何处理每个文件的说明,dir/sub/以便将 commit 的内容转换$old为 commit 的内容$new,同时:

\n\n
git diff $old $new -- $file1 $file2\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果两个文件均已更改,则会告诉您这两个文件的更改情况。

\n\n
\n\n

1实际上,“更多”,因为 Git 将符号链接目标存储为 blob 内容。

\n

  • 如果修订版本之间的路径相同(大多数情况下),可以这样做:`git diff revision1..revision2 -- some-path`。使用 @toreks 示例之一:`git diff a123456..fedcba9 -- README.txt` (2认同)