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

joh*_*nix 2041 git branch git-diff git-branch

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

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

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

Jas*_*ith 2493

要比较当前分支与master分支:

$ git diff --name-status master
Run Code Online (Sandbox Code Playgroud)

要比较任何两个分支:

$ git diff --name-status firstbranch..yourBranchName
Run Code Online (Sandbox Code Playgroud)

阅读上git diff的的正式文件.

  • @ user446936 - 您可以在git status手册页中找到这些字母的含义@ https://www.kernel.org/pub/software/scm/git/docs/git-status.html - 特别是M == modified ,D ==删除 (15认同)
  • `git diff --name-status your_branch ... master`输出自从your_branch创建以来在master上发生的更改 (8认同)
  • 值得一提的是“--name-only”选项。它仅提供有关已更改文件的名称的信息,而不提供状态代码。如果在某些脚本中可能更有帮助。 (5认同)
  • 左侧的每个索引是什么意思(我看到很多 M 和 D)? (3认同)
  • 我在工作树中得到未知的修订或路径. (2认同)

Ger*_*rry 396

尝试

$ git diff --stat --color master..branchName
Run Code Online (Sandbox Code Playgroud)

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

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

$ git diff --stat --color branchName..master
Run Code Online (Sandbox Code Playgroud)

  • 如果您(强烈推荐,imho)git颜色打开(`config --global color.ui true`),您可以跳过--color.(我有lks - 懒惰的键盘综合症.) (75认同)
  • 我和你在一起的颜色!BTW我的意思是说`git config --global color.ui true` - 是完整的. (24认同)
  • @TomášZato抱歉,您需要将"branchName"与您的分支名称交换. (7认同)
  • 不起作用,抛出错误:`致命:模棱两可的参数'master..branchName':未知修订版或路径不在工作树中。` (2认同)

Eri*_*son 156

还要记住,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
Run Code Online (Sandbox Code Playgroud)

最终的结果是我必须在一个扔掉的分支上尝试合并,然后再拧紧我的分支.如果我自己纠缠不清,我可以删除ba-merge分支并重新开始.

  • 真棒.我从未想过以这种方式分支.我认为这应该被视为合并时"最佳实践"的一部分. (4认同)
  • @EricAnderson 如果合并过程中出现问题,为什么你需要一个废弃的分支?仅仅取消合并更改还不够吗?类似于“git reset --hard;”之类的东西。git clean -fd`? (3认同)
  • @EricAnderson对,这是一张图.SVN在学校课桌下像胶一样粘.谢谢. (2认同)

Pau*_*III 57

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

git diff master..otherbranch > myDiffFile.diff
Run Code Online (Sandbox Code Playgroud)

  • 这已经派上用场了,特别是对于包含很多差异的大型分支. (2认同)

Yan*_*Xie 39

还有一种基于GUI的方法.

你可以使用gitk.

  1. 跑:

    $ gitk --all
    
    Run Code Online (Sandbox Code Playgroud)
  2. 右键单击分支的提交,然后在弹出菜单中选择" 标记此提交 ".

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

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

  • @Orwellophile我上传了一个[视频](https://www.youtube.com/watch?v=PrgdepMiMLU)来展示如何做到这一点.我希望它会对你有所帮助. (3认同)

rsi*_*va4 34

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

git difftool -d master otherbranch
Run Code Online (Sandbox Code Playgroud)

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

  • 可能想将meld设置为默认的difftool:git config --global diff.tool meld (6认同)

Dav*_*ton 29

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

  • 大卫,这是一个很好的观点,虽然很高兴知道事前发生了什么...... (10认同)

Man*_*nnu 16

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

git diff branch1 branch2 -- myfile1.js myfile2.js
Run Code Online (Sandbox Code Playgroud)

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

git diff master -- controller/index.js
Run Code Online (Sandbox Code Playgroud)


Ale*_*own 15

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

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

git fetch
git diff origin/master...
Run Code Online (Sandbox Code Playgroud)

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


Wim*_*uwe 9

如果您使用的是IntelliJ IDEA,还可以将任何分支与当前工作分支进行比较.有关详细信息,请参阅http://www.jetbrains.com/idea/webhelp/merging-deleting-and-comparing-branches.html#d288093e3827.这也可以在免费版中找到.


sel*_*t91 7

有两个分支可以说

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

您可以在A分支中输入

git diff --color B
Run Code Online (Sandbox Code Playgroud)

那么这将给您输出

在此处输入图片说明

重要的一点是

  1. 支行A中以绿色显示

  2. B分支中以红色显示


Jas*_*ase 7

这里有很多答案,但我想添加一些我常用的东西.如果您位于要比较的分支之一,我通常会执行以下操作之一.为了这个答案,我们会说我们在二级分支机构.取决于您当时所需的视图取决于您选择的视图,但大部分时间我使用的是第二个选项.如果您尝试恢复原始副本,第一个选项可能很方便 - 无论哪种方式,都可以完成工作!

这将比较master和我们所在的分支(这是次要的),原始代码将是添加的行,新代码将被视为已删除的行

git diff ..master
Run Code Online (Sandbox Code Playgroud)

要么

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

git diff master..
Run Code Online (Sandbox Code Playgroud)