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

Mic*_*cah 1430 git git-diff

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

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

git diff mybranch/myfile.cs master/myfile.cs
Run Code Online (Sandbox Code Playgroud)

dah*_*byk 2065

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

git diff mybranch master -- myfile.cs
Run Code Online (Sandbox Code Playgroud)

或者,等效地:

git diff mybranch..master -- myfile.cs
Run Code Online (Sandbox Code Playgroud)

使用后者的语法,如果任何一方是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在参数引用提交或文件时会感到困惑,但包括它不是一个坏习惯.有关示例,请参阅/sf/answers/932504401/.


git difftool如果配置了相同的参数,则可以传递相同的参数.

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

Tim*_*gan 391

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

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

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

  • @Jefromi,这可能在更新版本中有所改变,但至少现在你可以使用相对路径(例如`branch1:./ file`).如果文件位于分支之间的单独位置(例如`git diff branch1:old/path/to/file branch2:new/path/to/file`),这也很有用. (11认同)
  • 使用冒号并不是一个好方法 - 它意味着您通过树对象引用文件,因此您必须键入完整路径,而不是相对于当前目录. (4认同)
  • @redbmk是的,那是2010年到现在的某个时间!但是,如果它在两个分支上都是相同的文件,则不需要这样做,只需要`git diff branch1 branch2 path/to/file`. (4认同)
  • 重命名文件时,此方法适用! (4认同)
  • @jefromi很酷,我不确定添加时间的时间表.是的,我通常会使用你提到的语法,但蒂姆的回答帮助我弄清楚如何比较不同路径的文件,即使这不是问题的真正问题 (2认同)
  • 虽然我喜欢这个想法,但我无法使用这种语法,也无法在 git diff 文档中找到任何提及它的地方。我错过了什么?谢谢! (2认同)
  • 在 Windows 上仍然使用 `/` 路径分隔符,否则 `git diff` 默默地不执行任何操作。 (2认同)
  • 对于文件被重命名的情况,这个答案是最好的,特别是在新分支中重复使用旧名称的情况下。将其放在这里供人们使用“ctrl+f”来表示“重命名”或“不同文件”或“不同文件名” (2认同)
  • 文件更改的方式之一肯定是更改其名称!这就是为什么这是一个比公认的答案更好的答案。 (2认同)

Joe*_*ger 151

更现代的语法:

git diff ..master path/to/file

双点前缀表示"从当前工作目录到".你也可以说:

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


Jav*_* C. 29

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


Mou*_*uki 23

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

Git 历史差异 文档

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

从控制台,您可以简单地使用以下命令:

git diff <Your_Branch> <Branch_To_Compare_With> -- myfile.cs
Run Code Online (Sandbox Code Playgroud)


iGb*_*nam 11

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

这将检查文件之间的差异.变化branch1将为红色.变化branch2将是绿色.

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


小智 10

比较文件有两种情况:

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

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

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

例如,检查一个分支:

git checkout branch1
Run Code Online (Sandbox Code Playgroud)
git diff branch2 [filename]
Run Code Online (Sandbox Code Playgroud)

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

git diff branch1 branch2 [filename]
Run Code Online (Sandbox Code Playgroud)

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

git diff ..branch2 [filename]
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

git diff branch master -- filepath/filename.extension > filename.diff --cached
Run Code Online (Sandbox Code Playgroud)


SKT*_*SKT 5

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

git diff <branch name> -- <file path + file name>
Run Code Online (Sandbox Code Playgroud)

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


Pau*_*lgo 5

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

git diff BRANCH -- path/to/file

这样,它将从当前分支向引用分支(BRANCH)扩散。


归档时间:

查看次数:

685097 次

最近记录:

6 年,2 月 前