如何比较来自两个不同分支的文件?

我有一个脚本,它在一个分支中工作正常,而在另一个分支中坏了。我想并排看两个版本,看看有什么不同。有什么方法可以做到这一点?

需要明确的是,我不是在寻找比较工具(我使用 “超越比较”)。我正在寻找一个 git diff 命令,该命令将允许我将主版本与当前分支版本进行比较,以查看发生了什么变化。我不在合并之列。我只想说些类似的话

git diff mybranch/myfile.cs master/myfile.cs

答案

git diff可以向您展示两次提交之间的区别:

git diff mybranch master -- myfile.cs

或者,等效地:

git diff mybranch..master -- myfile.cs

使用后一种语法,如果任一侧为HEAD ,则可以省略(例如master..比较masterHEAD )。

您可能也对mybranch...master (来自git diff docs )感兴趣:

此表格用于查看包含且直到第二个<commit>的分支上的更改,该更改始于两个<commit>的共同祖先。 git diff A...B等效于git diff $(git-merge-base AB) B

换句话说,这会给中变化的差异master ,因为它从分歧mybranch (但不从那时起新的变化mybranch )。


在所有情况下,文件名前的--分隔符均表示命令行标志的结尾。这是可选的,除非如果自变量引用提交或文件,则 Git 会感到困惑,但是包括进来并不是一个坏习惯。有关一些示例,请参见https://stackoverflow.com/a/13321491/54249


如果配置了一个参数,则可以将相同的参数传递给git difftool

您可以执行以下操作: git diff branch1:path/to/file branch2:path/to/file

如果您配置了 difftool,则还可以: git difftool branch1:path/to/file branch2:path/to/file

相关问题: 如何使用视觉差异程序查看 git diff 输出

更现代的语法:

git diff ..master path/to/file

双点前缀表示 “从当前工作目录到”。您还可以说:

  • master.. ,即上述相反。这和master
  • mybranch..master ,显式引用当前工作树以外的状态。
  • v2.0.1..master ,即引用标签。
  • [refspec]..[refspec] ,基本上可以识别为 git 的代码状态的任何内容。

有两种方法可以比较来自两个不同分支的文件:

  • 选项 1:如果要将文件从 n 个特定分支与另一个特定分支进行比较:

    git diff branch1name branch2name path/to/file

    例:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs

    在此示例中,您将 “mybranch” 分支中的文件与 “mysecondbranch” 分支中的文件进行比较。

  • 选项 2:简单方法:

    git diff branch1:file branch2:file

    例:

    git diff mybranch:myfile.cs mysecondbranch:myfile.cs

    该示例类似于选项 1。

  • 选项 3:如果要将当前工作目录与某个分支进行比较:

    git diff ..someBranch path/to/file

    例:

    git diff ..master myfile.cs

    在此示例中,您将实际分支中的文件与 master 分支中的文件进行比较。

我只是做git diff branch1 branch2 path/to/file

这将检查文件之间的差异。 branch1更改将显示为红色。 branch2更改将显示为绿色。

假设branch1是过去,而branch2是未来。您可以通过反转 diff 中分支的顺序来反转它: git diff branch2 branch1

同意 @dahlbyk 建议的答案。如果您希望将差异写入差异文件以进行代码检查,请使用以下命令。

git diff branch master -- filepath/filename.extension > filename.diff --cached

如果要对当前分支进行比较,可以忽略它并使用:

git diff $BRANCH -- path/to/file

这样,它将从当前分支到引用分支( $BRANCH )进行比较。

就我而言,我使用以下命令:

git diff <branch name> -- <path + file name>

此命令可以帮助您比较两个不同分支中的相同文件

使用提交哈希,如下所示:

git diff <hash1> <hash2> <filename>

其中hash1可以是来自任何分支的任何提交,与hash2相同。

为了比较 git bash 中的两个文件,您需要使用以下命令:

git diff <Branch name>..master -- Filename.extension

此命令将显示 bash 本身中两个文件之间的差异。