显示在两个版本之间哪些文件已更改


2103

我想合并已经分离了一段时间的两个分支,并且想知道哪些文件已被修改。

浏览了以下链接:http : //linux.yyz.us/git-howto.html,它非常有用。

比较我遇到的分支的工具是:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

想知道是否有类似“ git status master..branch”之类的东西,以仅查看两个分支之间不同的文件。

如果不创建新工具,我认为这是您现在可以执行的最接近的工作(如果文件被多次修改,当然会显示重复):

  • git diff master..branch | grep "^diff"

想知道我是否错过了什么...


12
还有多少人发现这个问题的标题具有误导性?实际上,这是关于查找两个分支之间的文件差异。我来这里寻找的是如何查看同一分支上两个修订版之间的文件差异。还是我是唯一的一个?
Sandeepan Nath

4
@SandeepanNath:与git没有区别。您总是引用单个提交。
塞缪尔·奥马利

@ SamuelO'Malley我是git的新手,正在考虑看似通用的分支策略,其中所有分支最终都合并到master分支,并最终推出master。现在,考虑推出的情况,即生产已经在主服务器上,但是在技巧的后面(如果上次主服务器合并之后发生了最后的发布,则通过一个修订),我想看看这两个修订之间的差异,找出将要推出的产品。我不想看最后合并的分支。如果我错了,请纠正我。
Sandeepan Nath

2
@SandeepanNath:您可以使用下面的答案,而不是使用分支名称,而只需指定提交ID。如果在发布时创建标签,甚至可以通过其标签名称引用提交。
塞缪尔·奥马利,2016年

1
@SandeepanNath您不能比较2个分支,必须指定修订。因此,比较2个分支就是比较2个修订版本。
巴斯蒂安·范丹姆

Answers:


2572

要将当前分支与master分支进行比较:

$ git diff --name-status master

比较任何两个分支:

$ git diff --name-status firstbranch..yourBranchName

阅读上git diff的的正式文件


2
左侧的每个索引是什么意思(我看到很多M和D)?
gogogadgetinternet

15
@ user446936-您可以在git status手册页@ kernel.org/pub/software/scm/git/docs/git-status.html中看到字母的含义-特别是M ==修改,D ==删除
James Manning

12
git diff --name-status your_branch...master输出自从创建your_branch以来在主数据库上发生的更改
Radu

1
在这里,双点运算符是多余的,因为diff是成对的。
jub0bs 2015年

2
我得到的未知修订或路径不在工作树中。
SuperUberDuper

408

尝试

$ git diff --stat --color master..branchName

这将为您提供有关每次更改的更多信息,同时仍使用相同数量的行。

如果要以其他方式合并,也可以翻转分支以更清楚地了解差异:

$ git diff --stat --color branchName..master

77
如果您已启用(强烈建议,恕我直言)git color(config --global color.ui true),则可以跳过--color。(我有很多-懒惰键盘综合症。)
Art Swri 2012年

25
我和你在一起!顺便说一句,我想说git config --global color.ui true-完整。
Art Swri'3

2
不工作,引发错误:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
托马什Zato -恢复莫妮卡

7
@TomášZato抱歉,您需要将“ branchName”与分支的名称交换。
格里

161

还请记住,git具有便宜且易于分支的功能。如果我认为合并可能会出现问题,请为合并创建一个分支。因此,如果master有要合并的更改,并且ba是我的分支需要master的代码,则可以执行以下操作:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

最终结果是,在拧入分支之前,我必须尝试在一次性分支上进行合并。如果我纠缠不清,可以删除ba-merge分支并重新开始。


4
太棒了 我从未想过要那样分支。我认为,合并时应将其视为“最佳做法”的一部分。
egelev

当您将ba-marge合并回ba中时,是否有可能不得不再次解决冲突?
Josef.B

2
@EricAnderson对,这是一张图。SVN像胶一样粘在课桌下面。谢谢。
Josef.B

1
为什么你需要做的最后一步“的git合并大师”如果BA-合并已经有主
qwebek

您可以将其保留。有用的唯一原因是,如果master您在检查代码和修复冲突时有新内容出现。
埃里克·安德森

58

如果有人试图从两个分支生成差异文件:

git diff master..otherbranch > myDiffFile.diff

2
这已经派上用场,特别是对于包含很多差异的大型分支。
vandsh 2015年

当差异确实很大时,这很有用。默认情况下,它不会在控制台中显示所有差异(我想知道为什么),在这种情况下,将差异传递到文件是可行的。
rotimi-best,

42

还有一种基于GUI的方法。

您可以使用gitk

  1. 跑:

    $ gitk --all
    
  2. 右键单击分支的提交,然后在弹出菜单中选择“ 标记此提交 ”。

  3. 右键单击另一个分支的提交,然后选择Diff this->标为commitDiff标为commit-> this

然后,右下部面板中将有一个已更改的文件列表,而左下部面板中将有diff详细信息。


3
@Orwellophile我上传了一个视频来演示如何做。希望对您有帮助。
谢艳涛

哇,对我来说,我感到很特别。我已经在Delicious.com中添加了书签,以供将来参考和其他google-foo。
Orwellophile

严重低估了答案。谢谢!
Koshinae

36

另一种选择,在这种情况下使用融合:

git difftool -d master otherbranch

这样不仅可以查看文件之间的差异,还可以提供一种指向并单击特定文件的简便方法。


6
可能希望将Meld设置为默认的difftool:git config --global diff.tool meld
bwv549 2014年

1
这是我的最爱,因为它将使用您配置的任何difftool。
约西亚

OSX不支持。:-(
Mike S.

@MikeS。请签出此答案 stackoverflow.com/a/12815806/151918,其中包含OSX的说明。至少对我有用,希望对您有所帮助。
rsilva4

真好 但是有什么-d选择呢?
Scotty.NET

29

请注意,如果您不喜欢git的结果,可以轻松尝试合并并避免出现任何问题。这可能比预先查找潜在问题要容易。


10
大卫,这是一个很好的观点,尽管很高兴能事先知道发生了什么……
johannix

18

并且,如果您仅在某些文件中寻找更改,则:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1是可选的,如果未提供branch1,则默认情况下将考虑当前分支(您所在的分支)。例如:

git diff master -- controller/index.js

15

进行协作或同时使用多个功能时,上游甚至母版包含的工作通常不包含在分支中,并且会错误地出现在基本差异中。

如果您的上游可能已移动,则应执行以下操作:

git fetch
git diff origin/master...

仅使用git diff master可以包含或不包含相关更改。



8

有两个分支可以说

  • A(您正在工作的分支)
  • B(要与之比较的另一个分支)

您可以在A分支中输入

git diff --color B

那么这将给您输出

在此处输入图片说明

重要的一点是

  1. 支行A中以绿色显示

  2. B分支中以红色显示


8

这里有很多答案,但是我想添加一些常用的东西。如果您处于要比较的分支之一,则通常执行以下操作之一。为了这个答案,我们将说我们在第二分支中。根据您当时所需的视图,将取决于您选择的视图,但是大多数时候,我会使用两者的第二个选项。如果您尝试还原到原始副本,则第一个选项可能会很方便-两种方式都可以完成工作!

这会将master与我们所在的分支(第二分支)进行比较,原始代码将成为添加的行,新代码将被视为删除的行

git diff ..master

要么

这还将把master与我们所在的分支(是次要的)进行比较,原始代码将是旧行,新代码将是新行

git diff master..


0

对于正在寻找GUI解决方案的人们,Git Cola有一个非常不错的“分支Diff Viewer(Diff- > Branches ..)。




-2

如果您喜欢GUI并使用Windows,这是一种简单的方法。

  1. 下载WinMerge
  2. 将两个分支签出到不同的文件夹中
  3. 使用WinMerge逐个文件夹进行比较。如果其中一个分支是您正在处理的分支,则也可以轻松进行修改。

这不是最简单的方法,实际上不需要下载存储库以在分支之间进行比较。
stefgosselin

这的确不是最简单的方法,但它是GUI方式,这往往是一个容易得多尤其是对于看到diff文件中的所有文件
马吕斯Matioc

-3

您还可以使用例如TortoiseGit轻松比较已更改文件的分支。只需单击“ 浏览引用”,然后选择要比较的分支即可。

例如,如果您将分支master进行比较,那么您将获得一个结果列表,如果您决定将分支合并到master中,这些文件将在master中更改。

请记住,如果将master您的branch以及您的branchmaster进行比较,您将得到不同的结果。


1
问题似乎与本地git实用程序有关
Vladimir Hraban
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.