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

时间:2010-11-04 18:04:25

标签: git git-diff

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

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

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

13 个答案:

答案 0 :(得分:1874)

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

git diff mybranch master -- myfile.cs

或等同地:

git diff mybranch..master -- myfile.cs

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

您可能也对mybranch...master(来自git diff docs)感兴趣:

  

此表单用于查看包含和最多第二个<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

答案 1 :(得分:357)

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

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

相关问题: How do I view git diff output with visual diff program

答案 2 :(得分:142)

更现代的语法:

git diff ..master path/to/file

双点前缀表示&#34;从当前工作目录到&#34;。你也可以说:

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

答案 3 :(得分:19)

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

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

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

答案 4 :(得分:9)

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

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

假设branch1是过去而branch2是未来。您可以通过反转diff中git diff branch2 branch1

中分支的顺序来反转此操作

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

对于我来说,我使用以下命令:

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

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

答案 7 :(得分:2)

如果要与当前分支进行差异化,可以省略并使用:

git diff BRANCH -- path/to/file

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

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

最好的方法是通过以下方式使用let items = [ 100, 200, 300, 50, 100, 200, 300, 250 ]; const timeline = document.createElement('ul'); // maybe better do this by adding class and external stylesheet timeline.setAttribute('style', 'padding: 15px; border: 1px solid gray; list-style-type: none; height: 500px; width: 100%; position: absolute; top: 0;overflow-y: scroll;') document.body.appendChild(timeline); let render = function(item) { return new Promise(function (resolve) { // run something (in) expensive with item now. const li = document.createElement('li'); // again, better do this with class. li.setAttribute('style', `display: inline-block; width: 25px; margin: 5px; background-color: #c1c1c1; height: ${item}px;`); timeline.appendChild(li); li.scrollIntoView(); // return when done. resolve(); }); } const player = new TelemetryPlayer(items, render, 1500); // now you can do things like speed up etc. // now you can do things like speed up etc. function speedUp() { // speedup 3 seconds after "playback" starts. return new Promise((resolve) => setTimeout(() => { player.pause(); player.interval = 600; player.unpause(); resolve(); }, 3000)); } function playOnce() { // add item once, but not in the array we loop around in return new Promise((resolve) => setTimeout(() => { player.playOnce(1000); resolve(); }, 3000)); } // or add a few items that will be repeated. function addItems() { // add a super very high item 3 seconds after function call. return new Promise((resolve) => setTimeout(() => { player.pause(); player.addItem(400); player.addItem(430); player.addItem(420); player.unpause(); // now rewind to this block. I am off by one, likely. player.skipTo(player.items.length - 3); resolve(); }, 5000)) } speedUp() .then(playOnce) .then(addItems); git diff

它将检查这些分支中文件之间的区别。请查看本文,了解有关git commands及其工作原理的更多信息。

答案 10 :(得分:0)

按以下方式使用提交哈希:

git diff <hash1> <hash2> <filename>

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

答案 11 :(得分:0)

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

方案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” ”。

希望它有用。

答案 12 :(得分:0)

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

git difftool otherbranch.. filespec

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

git difftool otherbranch filespec

我最终将临时文件夹中的文件(otherbranch 上的版本)与我的 git 文件夹中的实际文件进行比较,这 a) 更容易分辨哪个是哪个,b) 意味着我可以使用差异工具(在我的情况下为 BC4)将更改从我的另一个分支复制到我的当前分支。 只是觉得值得一提。