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


我有一个脚本在一个分支中工作正常,在另一个分支中被破坏。我想并排看两个版本,看看有什么不同。有没有办法做到这一点?

要清楚 我不是在寻找比较工具(我使用Beyond Compare)。我正在寻找一个git diff命令,它允许我将主版本与我当前的分支版本进行比较,看看有什么变化。我不是在合并或任何事情的中间。我只是想说些什么

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

1091
2017-11-04 18:04


起源




答案:


git diff 可以告诉你两个提交之间的区别:

git diff mybranch master -- myfile.cs

或者,等效地:

git diff mybranch..master -- myfile.cs

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

您也可能对。。。有兴趣 mybranch...master (从 git diff 文档):

此表单用于查看包含和第二个分支的分支上的更改 <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 如果你有一个配置。


1580
2017-11-04 18:13



如果要比较的两个版本都不是工作树,则可以使用 git diff branch1 branch2 myfile.cs。 (该 -- 不再是必要的,因为它最多只需要两个修订参数。) - Cascabel
我已经尝试过这个版本的每一个版本,没有任何反应。我配置了difftool(它适用于合并)。我有一个名为bd.ps1的文件。我输入的每个版本的命令都不做任何事情。甚至不给错误者。 WTH!?!?! - Micah
@Micah:你是否也尝试过普通差异?您是否正确键入相对于当前目录的路径? (如果文件不存在,它将默默显示没有差异,你使用 --。常见且容易犯的错误。) - Cascabel
除非我包含文件的完整路径,否则这对我不起作用,如图所示 git diff --name-status branch1..branch2 (可能很明显,但我想如果其他人遇到同样的问题,我会提到它)。 - hBrent
mybranch和master的顺序也很重要。第一个分支中的文件将显示为“ - ”前缀,第二个分支中的文件将显示为“+”前缀。 - timbo


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

如果您配置了difftool,那么您还可以: git difftool branch1:file branch2:file

相关问题: 如何使用visual diff程序查看git diff输出


309
2017-11-04 18:12



使用冒号并不是一个好方法 - 它意味着您通过树对象引用文件,因此您必须输入完整路径,而不是相对于当前目录。 - Cascabel
@Jefromi,这可能在更新版本中有所改变,但至少现在你可以使用相对路径(例如 branch1:./file)。如果文件位于分支之间的单独位置(例如, git diff branch1:old/path/to/file branch2:new/path/to/file)。 - redbmk
@redbmk是的,那是2010年到现在的某个时间!但是,如果它在两个分支上都是相同的文件,则不需要这样做,只需 git diff branch1 branch2 path/to/file。 - Cascabel
@jefromi很酷,我不确定添加时间的时间表。是的我通常会使用你提到的语法,但蒂姆的回答帮助我弄清楚如何比较不同路径的文件,即使这不是问题的真正问题 - redbmk
虽然我喜欢这个想法,但我无法在git diff docs中使用这种语法或找到它。我错过了什么?谢谢! - yoyo


更现代的语法:

git diff ..master path/to/file

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

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

125
2018-06-25 00:41





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

这将检查文件之间的差异。改变在 branch1 会是红色的。改变在 branch2 将是绿色的。

这是假设的 branch1 是过去和 branch2 是未来。您可以通过反转diff中分支的顺序来反转此操作: git diff branch2 branch1


8
2018-05-22 14:14



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


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

  • 选项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
    

    在此示例中,您将比较实际分支中的文件   主分支中的文件。


8
2018-04-04 13:34





同意@dahlbyk建议的答案。如果要将diff写入diff文件以进行代码审查,请使用以下命令。

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

2
2017-10-06 07:19





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

它将检查这些分支中的文件之间的差异。有关更多信息,请查看此文章 git命令  以及他们如何运作。


0
2018-05-07 12:18





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

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

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


0
2018-01-17 04:26