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

Posted

技术标签:

【中文标题】如何比较来自两个不同分支的文件【英文标题】:How to compare files from two different branches 【发布时间】:2011-05-05 05:24:52 【问题描述】:

我有一个脚本在一个分支中运行良好,但在另一个分支中被破坏。我想并排查看这两个版本,看看有什么不同。有没有办法做到这一点?

要明确我不是在寻找比较工具(我使用Beyond Compare)。我正在寻找一个 Git diff 命令,它允许我将主版本与我当前的分支版本进行比较,以查看发生了什么变化。我不在合并或任何事情的中间。我只想说类似

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

【问题讨论】:

【参考方案1】:

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

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

相关问题: How do I view 'git diff' output with my preferred diff tool/ viewer?

【讨论】:

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

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 documentation)感兴趣:

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

换句话说,这将导致master 的变化有所不同,因为它与mybranch 不同(但此后mybranch 没有新的变化)。


在所有情况下,文件名前的-- 分隔符表示命令行标志的结束。这是可选的,除非如果参数指的是提交或文件,Git 会感到困惑,但包含它并不是一个坏习惯。请参阅Dietrich Epp's answer to Meaning of Git checkout double dashes 了解一些示例。


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

【讨论】:

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

更现代的语法:

git diff ..master path/to/file

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

master..,即上面的反面。这与master 相同。 mybranch..master,显式引用当前工作树以外的状态。 v2.0.1..master,即引用一个标签。 [refspec]..[refspec],基本上任何可识别为 Git 的代码状态。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

哪个版本的 git diff 可以做到这一点?我正在运行的版本(2..9.2.windows.1)似乎不支持它。【参考方案5】:

我同意the answer by dahlbyk。如果您希望将 diff 写入 diff 文件以进行代码审查,请使用以下命令。

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

选项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 分支中的文件。

【讨论】:

【参考方案8】:

最好的方法是通过以下方式使用git diff

git diff &lt;source_branch&gt; &lt;target_branch&gt; -- file_path

它将检查这些分支中文件之间的差异。查看这篇文章,了解有关 Git commands 及其工作原理的更多信息。

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

如果你想对当前分支做一个差异,你可以提交它并使用:

git diff $BRANCH -- path/to/file

这样它会从当前分支到引用分支($BRANCH)。

【讨论】:

【参考方案11】:

像这样使用提交哈希:

git diff <hash1> <hash2> <filename>

其中 hash1 可以是来自任何分支的任何提交,对于 hash2 也是如此。

【讨论】:

如何回答这个问题?你能详细说明吗?例如,有哪些方法可以找到两个哈希值? 问***【参考方案12】:

比较文件有两种场景:

场景1:比较远程分支的文件(两个分支都应该存在于远程存储库中)

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

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

例如,检查一个分支:

git checkout branch1
git diff branch2 [filename]

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

git diff branch1 branch2 [filename]

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

git diff ..branch2 [filename]

在这种情况下,它还将比较名为“branch1”与“branch2”的远程分支的文件名。所以,和上面一样。但是,如果您刚刚从另一个分支创建了一个分支,比如说“master”并且您当前的分支在远程存储库中不存在,它将比较远程“ma​​ster”与远程“branch2”。

【讨论】:

【参考方案13】:

关于这些不同的比较方法还有一个有趣的地方:我想将我当前分支中的一个文件与另一个分支中的同一个文件进行比较。如果我使用

git difftool otherbranch.. filespec

我最终比较了实际上在我的临时文件夹中的两个文件。但是,如果我使用

git difftool otherbranch filespec

我最终将我的临时文件夹中的一个文件(otherbranch 上的版本)与我的 Git 文件夹中的实际文件进行比较,这 a) 更容易分辨哪个是哪个,并且 b ) 表示我可以使用 diff 工具(在我的例子中是 Beyond Compare 4)将更改从我的另一个分支复制到我的当前分支。

【讨论】:

【参考方案14】:

对于 Visual Studio Code,我强烈建议扩展:

Git 历史差异 docs

您可以使用它在文件甚至分支之间进行两次比较!

从控制台,你可以简单地使用这个命令:

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

【讨论】:

以上是关于如何比较来自两个不同分支的文件的主要内容,如果未能解决你的问题,请参考以下文章

Git:如何区分不同分支中的两个不同文件?

git 对比两个分支差异

如何比较来自不同数据库的两个表

在 TortoiseSVN 中比较两个分支之间的文件

如何根据列比较 unix 中的两个文件

恢复了来自 github 的拉取请求,但两个分支没有区别