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


1537

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

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

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

Answers:


2207

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

git diff mybranch master -- myfile.cs

或者,等效地:

git diff mybranch..master -- myfile.cs

使用后者的语法,如果任何一方是HEAD可以省略(例如master..比较masterHEAD)。

您可能也有兴趣mybranch...master(来自git diffdocs):

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

换句话说,这会带来一些差异,master因为它与背道而驰mybranch(但从那时起就没有新的变化mybranch)。


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


git difftool如果已配置,则可以将相同的参数传递给。


44
如果您要比较的两个版本都不是工作树,则可以使用git diff branch1 branch2 myfile.cs。(--不再需要,因为它最多可以包含两个修订参数。)
Cascabel,2010年

8
我已经尝试了每个版本,但没有任何反应。我已经配置了difftool(可以用于合并)。我有一个名为bd.ps1的文件。我键入的命令的每个版本都不起作用。甚至都不会犯错。WTH!?!?!
米卡

3
@Micah:您是否也尝试使用普通差异?您是否正确键入相对于当前目录的路径?(如果文件不存在,它将无提示显示差异,并且您使用--。常见且容易犯的错误。)
Cascabel 2010年

5
除非我包括文件的完整路径,否则这对我不起作用,如图所示git diff --name-status branch1..branch2(可能很明显,但我想我会提到它,以防其他人遇到与我相同的麻烦)。
hBrent

4
mybranch和master的顺序也很重要。第一个分支中的文件将以“-”前缀显示,第二个分支中的文件将以“ +”前缀显示。
timbo 2015年

413

你可以这样做: git diff branch1:path/to/file branch2:path/to/file

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

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


4
使用冒号并不是一个好方法,它意味着您正在通过树对象引用文件,因此必须键入完整路径,而不是相对于当前目录的路径。
卡斯卡贝尔

13
@Jefromi,这可能在较新的版本中已更改,但是至少现在您可以使用相对路径(例如branch1:./file)。如果文件位于分支之间的单独位置(例如git diff branch1:old/path/to/file branch2:new/path/to/file),这也很有用。
redbmk 2014年

4
@redbmk是的,那是从2010年到现在的某个时间!不过,如果两个分支上的文件都相同,则无需这样做git diff branch1 branch2 path/to/file
卡斯卡贝尔2014年

3
@jefromi很酷,我不确定添加时间的时间表。是的,我通常会使用您提到的语法,但是Tim的回答帮助我弄清楚了如何比较具有不同路径的文件,即使这并不是问题所在
redbmk 2014年

1
虽然我喜欢这个主意,但无法在git diff文档中使用此语法或找到任何提及。我想念什么?谢谢!
yoyo 2014年

160

更现代的语法:

git diff ..master path/to/file

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

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

33

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

  • 选项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分支中的文件进行比较。


12

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

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

假定branch1过去和branch2将来。您可以通过反转diff中分支的顺序来反转它:git diff branch2 branch1


哪个版本的git diff可以做到这一点?我正在运行的版本(2..9.2.windows.1)似乎不支持它。
文斯·鲍德伦

9

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

git diff $BRANCH -- path/to/file

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


5

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

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

2

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

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

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


1

最好的方法是通过git diff以下方式使用: git diff <source_branch> <target_branch> -- file_path

它将检查这些分支中文件之间的差异。请参阅本文,以获取有关git命令 及其工作方式的更多信息。


1

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

git diff <hash1> <hash2> <filename>

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


1

有两种方案可以比较文件:

方案1:比较远程分支上的文件(两个分支都应存在于远程存储库中)

方案2:将本地文件(在本地工作区副本中)与远程存储库中的文件进行比较。

逻辑很简单。如果为diff提供两个分支名称,它将始终比较远程分支,如果仅提供一个分支名称,它将始终将本地工作副本与远程仓库(您提供的一个)进行比较。您可以使用range提供远程存储库。

例如结帐一个分支

git checkout branch1
git diff branch2 [filename]

在这种情况下,如果提供文件名,它将把文件名的本地副本与名为“ branch2 ”的远程分支进行比较。

git diff branch1 branch2 [filename]

在这种情况下,它将比较名为“ branch1 ”与“ branch2 ”的远程分支的文件名

git diff ..branch2 [filename]

在这种情况下,它还将比较来自名为“ branch1 ”与“ branch2 ”的远程分支的文件名。因此,与上面相同。但是,如果刚从另一个分支创建了一个分支,则说“ master”,而当前的分支在远程存储库中不存在,它将比较远程“ master ”与远程“ branch2 ”。

希望它有用。


0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.