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

2163

我有一个脚本在一个分支上运行正常,在另一个分支上却出现问题。我想将这两个版本并排比较,看看有什么不同之处。有没有办法可以做到这一点?

明确一下:我不是在寻找比较工具(我使用的是Beyond Compare)。我正在寻找Git diff命令,以便将主版本与当前分支版本进行比较,查看有哪些变化。我也没有处于合并过程中或者其他任何情况。我只是想说类似于:

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

可能有帮助的是阅读git diff:https://dev59.com/questions/i3E85IYBdhLWcg3w9odJ - Charlie Parker
14个回答

2941

git diff 可以显示两个提交之间的差异:

git diff mybranch master -- myfile.cs

或者,等价地:

git diff mybranch..master -- myfile.cs

注意,您必须指定文件的相对路径。因此,如果文件在src目录中,则应说src/myfile.cs而不是myfile.cs

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

您还可能对mybranch...master感兴趣(来自git diff文档):

此形式用于查看包含并高达第二个<commit>的分支上的更改,从两个<commit>的共同祖先开始。 git diff A...B等效于git diff $(git-merge-base A B) B

换句话说,这将给出自mybranch分叉以来master中的更改差异(但不包括此后mybranch中的新更改)。


在所有情况下,文件名前的--分隔符表示命令行标志的结束(注意分隔符和文件名之间的空格)。这是可选的,除非Git会因为参数引用了提交或文件而感到困惑,但包含它并不是一个坏习惯。请参见Dietrich Epp对Git checkout double dashes的解答,其中有一些例子。

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


67
如果你想要比较的两个版本都不是工作树,你可以使用命令 git diff branch1 branch2 myfile.cs 进行比较。(现在不需要加上 -- 符号了,因为它只能接受最多两个修订参数。) - Cascabel
12
我尝试了每个版本,但没有任何反应。我已经配置好我的difftool(用于合并的工具),我有一个名为bd.ps1的文件。无论我输入哪个版本的指令都没有任何反应,甚至没有错误提示。到底怎么回事?!?! - Micah
5
@Micah:你是否也尝试使用普通的diff?你是否正确地输入了相对于当前目录的路径?(如果文件不存在,它将不会显示任何差异,并且你使用--。这是一个常见且容易犯的错误。) - Cascabel
7
除非我包括文件的完整路径,否则这对我没用,可以使用 git diff --name-status branch1..branch2 来展示完整路径(这可能是显而易见的,但我想提一下,以防其他人有同样的问题)。 - hBrent
4
分支和主分支的顺序也很重要。第一个分支中的文件名将以“-”为前缀显示,第二个分支中的文件名将以“+”为前缀显示。 - timbo
显示剩余20条评论

597

4
使用冒号并不是一个很好的方式——这意味着你通过树对象引用文件,因此你必须输入完整路径而不是相对于当前目录的路径。 - Cascabel
24
@Jefromi,这可能在更近期的版本中已经发生了变化,但现在至少可以使用相对路径(例如:branch1:./file)。如果文件在分支之间的不同位置上(例如:git diff branch1:old/path/to/file branch2:new/path/to/file),这也是非常有用的。 - redbmk
8
是的,@redbmk,那是在2010年至今之间的某个时候!不过,如果两个分支上的文件是相同的,就没必要这样做了,只需要使用 git diff branch1 branch2 path/to/file 命令即可。 - Cascabel
3
@jefromi cool,我不确定这个功能是什么时候添加的。通常我会使用你提到的语法,但Tim的回答帮助我弄清楚如何比较具有不同路径的文件,尽管这并不是问题所要求的。 - redbmk
3
文件改变的一种方式就是更改它的名称!这就是为什么这个答案比被接受的答案更好的原因。 - T.V.
显示剩余4条评论

222

更现代化的语法:

git diff ..master path/to/file

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

  • master..,即上面的反向。这与master相同。
  • mybranch..master,明确引用当前工作树之外的状态。
  • v2.0.1..master,即引用标签。
  • [refspec]..[refspec],基本上是任何可识别为Git代码状态的东西。

44

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

  • Option 1: If you want to compare the file from n specific branch to another specific branch:

    git diff branch1name branch2name path/to/file
    

    Example:

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

    In this example you are comparing the file in “mybranch” branch to the file in the “mysecondbranch” branch.

  • Option 2: Simple way:

     git diff branch1:file branch2:file
    

    Example:

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

    This example is similar to the option 1.

  • Option 3: If you want to compare your current working directory to some branch:

    git diff ..someBranch path/to/file
    

    Example:

    git diff ..master myfile.cs
    

    In this example you are comparing the file from your actual branch to the file in the master branch.


23

对于Visual Studio Code,我强烈推荐使用以下扩展:

Git History Diff docs

您可以使用它来比较文件或分支之间的差异!

从控制台,您只需使用此命令:

git diff <Your_Branch> <Branch_To_Compare_With> -- myfile.cs

21
如果你想针对当前分支进行差异比较,你可以提交它并使用以下命令:

如果您希望根据当前分支进行差异比较,可以将更改提交,并使用以下命令:

git diff $BRANCH -- path/to/file

这样做将使它与参考分支($BRANCH)之间的差异不同于当前分支。


18

我只需要执行以下命令:git diff branch1 branch2 path/to/file

这个命令可以检查文件之间的差异。来自branch1的更改将显示为红色,而来自branch2的更改将显示为绿色。

假设branch1代表过去,而branch2代表未来。如果要反转比较顺序,可以交换分支的顺序:git diff branch2 branch1


哪个版本的git diff可以做到这一点?在我运行的版本(2.9.2.windows.1)中似乎不支持这个功能。 - Vince Bowdren

10

有两种比较文件的场景:

场景1:比较远程分支上的文件(远程仓库中必须存在这两个分支)

场景2:比较本地工作区拷贝的文件与远程仓库中的文件

逻辑很简单,如果您给 diff 提供了两个分支名称,它将始终比较远程分支;如果您只提供一个分支名称,则它将始终比较您的本地工作区拷贝和远程仓库(您提供的那一个)。您可以使用范围来提供远程仓库。

例如,检出一个分支:

git checkout branch1

git diff branch2 [filename]

在这种情况下,如果您提供文件名,它将会比较您本地的文件名和名为“branch2”的远程分支。

git diff branch1 branch2 [filename]

在这种情况下,它将比较来自名为 "branch1" 和 "branch2" 的远程分支的 filename
git diff ..branch2 [filename]

在这种情况下,它将比较名为"branch1"与"branch2"的远程分支中的文件名。因此,与上面的情况相同。但是,如果您刚从另一个分支(例如"master")创建了分支,并且当前分支不存在于远程存储库中,它将比较远程"master"与远程"branch2"。

这对我很有效。感谢Dharmender的回答。 - Sunil Kumar Singh

5
在我的情况下,我使用以下命令:
git diff <branch name> -- <file path + file name>

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


应该解释一下路径,并给出一个适用于不在顶级目录中的文件的示例。 - pauljohn32

5

我同意dahlbyk的答案。如果你想将差异写入差异文件以进行代码审查,请使用以下命令。

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

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