题 显示两个修订版之间已更改的文件


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

遇到此链接: 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"

想知道是否有我遗漏的东西......


1789
2018-05-05 00:47


起源


有多少人认为这个问题的标题具有误导性?它实际上是关于找到两个分支之间的文件差异。我在这里寻找的是如何在同一分支上查看两个修订版之间的文件差异。或者我是唯一的一个? - Sandeepan Nath
@SandeepanNath:与git没有任何区别。你总是提到个人提交。 - Samuel O'Malley
@ SamuelO'Malley我是git的新手,并考虑了看似常见的分支策略,其中所有分支最终合并到主分支,最终主人推出。现在,考虑到推出的事件,其中生产已经处于主要状态,但是在提示之后(如果最后一次推出发生在最后一次主合并之后,则通过一次修订),我希望看到这两次修订之间的差异,找出将要推出的内容。我不想看看最后合并的分支。如果我错了,请纠正我。 - Sandeepan Nath
@SandeepanNath:您可以采用以下答案,而不是使用分支名称,而只需指定提交ID。如果在推出时创建标记,甚至可以通过标记名称引用提交。 - Samuel O'Malley
@SandeepanNath您无法比较2个分支,您必须指定修订。因此比较2个分支是比较2个修订。 - Bastien Vandamme


答案:


比较当前分支 master

$ git diff --name-status master

比较任何一对分支

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

如果我理解正确的话,那应该做你需要的。


2187
2018-05-05 01:04



+1,有时--name-only也很方便 - Pat Notz
@ user446936 - 您可以在git status手册页中看到字母的含义@ kernel.org/pub/software/scm/git/docs/git-status.html  - 特别是,M ==修改,D ==删除 - James Manning
git diff master..blabla -- 给我 fatal: bad revision 'master..blabla'。 git diff master blabla -- 给我 fatal: bad revision 'master'。知道什么是错的吗?更新:这个repo没有名为master的分支,doh! - akostadinov
git diff --name-status your_branch...master 输出自从my_branch创建以来在master上发生的更改 - Radu
这是使用git diff时更多选项的链接。 git-scm.com/docs/git-diff - akvallejos


尝试

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

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

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

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

354
2018-02-09 19:38



如果你有(强烈推荐,imho)git颜色打开(config --global color.ui true),你可以跳过--color。 (我有lks - 懒惰的键盘综合症。) - Art Swri
我和你在一起的颜色! BTW我想说 git config --global color.ui true  - 完成。 - Art Swri
不起作用,抛出错误: fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree. - Tomáš Zato
@TomášZato抱歉,您需要将“branchName”与您的分支名称交换。 - Gerry


还要记住,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 分支并重新开始。


145
2017-10-11 01:22



真棒。我从未想过以这种方式分支。我认为这应该被视为合并时“最佳实践”的一部分。 - egelev
当您将ba-marge合并回ba时,是否有可能再次修复冲突? - Josef.B
不,你已经解决了。 - Eric Anderson
@EricAnderson对,这是一张图。 SVN在学校课桌下像胶一样粘。谢谢。 - Josef.B


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

git diff master..otherbranch > myDiffFile.diff

45
2018-04-03 14:01



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


请注意,如果您不喜欢结果,git可以轻松地尝试合并并避免任何问题。它可能比提前寻找潜在问题更容易。


30
2018-05-05 00:59



大卫,这是一个很好的观点,虽然很高兴知道事前发生了什么...... - johannix


还有一种基于GUI的方法。

您可以使用 gitk

  1. 跑:

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

  3. 右键单击另一个分支的提交并选择 差异 - >标记提交 要么 Diff标记提交 - >这个

然后,右下方面板中将显示已更改的文件列表,左下方面板中将显示diff详细信息。


29
2018-06-14 06:01



@Orwellophile我上传了一个 视频 展示如何做到这一点。我希望它会对你有所帮助。 - Shawn Xie
哇,只为了我,我觉得很特别。我已经在delicious.com上为它添加了书签以供将来参考和额外的google-foo。 - Orwellophile


还有一个选择,在这种情况下使用meld:

git difftool -d master otherbranch

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


26
2018-04-24 13:23



可能想将meld设置为默认的difftool:git config --global diff.tool meld - bwv549
这是我的最爱,因为它将使用您配置的任何difftool。 - Josiah
OSX不支持。 :-( - Mike S.
@MikeS。请查看此答案 stackoverflow.com/a/12815806/151918 它包含OSX的说明。它至少对我有用,希望它有所帮助。 - rsilva4


协同工作或同时处理多个功能时,通常上游甚至主人包含未包含在分支中的工作,并且会错误地出现在基本差异中。

如果您的上游可能已经移动,您应该这样做:

git fetch
git diff origin/master...

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


14
2018-03-24 03:21





如果您只在某些文件中查找更改,则:

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

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

git diff master -- controller/index.js

10
2018-05-16 13:13