【问题标题】:git visual diff between branches分支之间的 git 视觉差异
【发布时间】:2012-10-06 10:50:31
【问题描述】:

这个答案非常适合查看签入 git 的两个文件之间的视觉差异: How do I view 'git diff' output with a visual diff program?

但是,我希望看到两个分支之间的视觉差异。到目前为止,我最好的选择似乎是:

git diff --name-status master dev

这不是很丰富,也不是很直观。

还有什么更好的吗?

【问题讨论】:

  • 我在下面添加了一个答案,包括以前未在此处解决的视觉效果:如何查看分支包含的提交(无论是共同的还是唯一的)。您可以使用核心 git 功能做很多事情。最好指定您希望在视觉差异中包含的内容。大多数答案都关注提交的逐行差异,您的示例关注给定提交中受影响的文件的名称。

标签: git diff


【解决方案1】:

使用git diffrange

git diff branch1..branch2

这将比较每个分支的提示。

如果你真的想要一些 GUI 软件,你可以试试SourceTree 之类的支持 Mac OS X 和 Windows 的软件。

【讨论】:

  • 这不是视觉的母鹿。 ;)
  • 在 Linux 系统中,我建议安装 Meld,然后将其设置为默认的 difftoolgit config --global diff.tool meld,最后启动它而不是普通的 diffgit difftool branch1..branch2。结果更好看。
  • 在没有 git config 的情况下使用 Meld 视觉差异工具:git difftool -t meld branch1..branch2
  • 致读者:在我的帖子中,除了这个答案之外,这里的每个答案都提供了一种方法来满足人们的要求(GUI 中的差异)。
  • @GHuxley OP 在哪里要求 GUI 解决方案?
【解决方案2】:

要查看两个分支之间所有差异的视觉差异,我喜欢合并两个分支 - 不提交合并 - 然后使用 git gui 或 git Extensions 来了解差异的概述。

无需提交即可合并的 Git 命令行:

git checkout 分支A git merge --no-commit --no-ff branchB

完成后,您可以撤消合并

git 合并 --abort

(h/t 到 @jcugat 的评论)

【讨论】:

  • 如果您喜欢使用您的 IDE(或其他并非总是容易与 Git GUI difftool 集成),请不要低估这种方法的相关性!这个选项对我来说太棒了,因为我使用 Intellij 并且非常喜欢能够在 IDE 中旋转修改过的文件,在其所有语法高亮、错误高亮、死代码高亮、可就地编辑的荣耀中。我在所有代码审查中都使用这种方法,并且我已经将 GitHub 中糟糕的拉取请求比较工具远远抛在了后面。我什至可以随时进行编辑,完成后我只需创建一个附加“-code-review”的新分支并提交!
  • 只要没有合并冲突就可以工作,有合并冲突就失败。
  • 我非常喜欢这种方法!此外,至少在git gui 中对我来说,它显示冲突是未上演的,非冲突是上演的,所以你甚至可以得到很好的区分。比评分最高的答案对我有更多帮助:D
【解决方案3】:

如果您使用的是 Intellij Idea IDE,您可以只使用分支中的比较选项。

【讨论】:

  • 是否有任何配置/选项/设置来修改此比较? (比如 git diff 的 --ignore-space-at-eol)
【解决方案4】:

你也可以使用 gitk 轻松做到这一点。

> gitk branch1 branch2

首先点击branch1的尖端。现在右键单击 branch2 的尖端并选择 Diff this->selected。

【讨论】:

  • 使用gitk branch1..branch2 只显示两个修订之间的提交。
  • 如果您想查看您在分支中所做的所有更改,请使用 gitk(没有 branch1 分支 2)。
【解决方案5】:

对于那些在 Windows 上使用 TortoiseGit 的人,您可以通过这个相当晦涩的功能获得一些直观的比较:

  1. 导航到要比较的文件夹
  2. 按住shift 并右键单击它
  3. 转到 TortoiseGit -> 浏览参考
  4. 使用ctrl选择两个分支进行比较
  5. 右键单击您的选择,然后单击“比较所选参考”

来源:http://wikgren.fi/compare-diff-branches-in-tortoise-git-or-how-to-preview-changes-before-doing-a-merge/

【讨论】:

  • 为什么要按住 shift 键?
  • 在右键单击时按住 shift 总是会调出完整的 TortoiseGit 菜单,以防您将 TortoiseGit 配置为不显示某些项目。
  • 这太棒了。希望它是一个更突出的功能。
【解决方案6】:

如果您使用的是 OSX 或 Windows 7+,Atlassian SourceTree 非常适合此操作。这是免费的。

您可以在并行差异设置中看到阶段性更改,并且您可以轻松地将本地与远程和任何其他两个分支进行比较。选择多个文件时,Dift显示如下:

假设您已签出一个功能分支并且您想查看与“master”的差异,请右键单击“master”分支并选择“Diff against current”

不幸的是,它似乎不会在 *nix 发行版anytime soon 上可用。

【讨论】:

  • 它可能是“免费的”,但肯定需要一些时间来阅读他们的注册使用条款:atlassian.com/legal/customer-agreement到目前为止我很喜欢这个工具,但这可能会让我失望。
  • @akauppi 哪些部分让你失望了?我认为所有这些协议都差不多
  • 那是一年多以前的事了。是的,协议可能相似,但这是 SourceTree 推动我完成的过程。这很奇怪。过去了,虽然。我不会为你提供详细信息。对不起
  • 这是一个 SourceTree 差异问题:stackoverflow.com/q/30177189/470749
【解决方案7】:

尝试“difftool”(假设您设置了 diff 工具) - 请参阅 https://www.kernel.org/pub/software/scm/git/docs/git-difftool.html

我发现 name status 对摘要很有用,但 difftool 将迭代更改(-d 选项为您提供目录视图),例如

$ git difftool their-branch my-branch

Viewing: 'file1.txt'
Launch 'bc3' [Y/n]:
...

或者正如@rsilva4 提到的-d 并默认为您当前的分支,它只是 - 例如与大师比较:

$  git difftool -d master..

...是的 - 有很多变化 - https://www.kernel.org/pub/software/scm/git/docs/git-reset.html

【讨论】:

  • 谢谢,这很有用。添加 -d 选项会让事情变得更好:git difftool -d their-abc my-abc
  • 由于目前是 explainshell.com doesn't seem to be able to parse the -d option,手册页上是这样写的:-d --dir-diff: Copy the modified files to a temporary location and perform a directory diff on them. This mode never prompts before launching the diff tool.
【解决方案8】:

如果您使用的是 github,则可以使用该网站:

github.com/url/to/your/repo/compare/SHA_of_tip_of_one_branch...SHA_of_tip_of_another_branch

这将向您展示两者的比较。

【讨论】:

  • 这行得通(我一直这样做),但它需要您将代码推送到 github 存储库。不过,在我看来,这并不是一个可以接受的警告。
  • 或者只是github.com/url/to/your/repo/compare/然后你可以选择分支
  • 我如何获得该 SHA?我的意思是,分支尖端的 SHA 是什么意思?
【解决方案9】:

GitExtensions 中,您可以按下 Ctrl 来选择修订网格中的两个分支。然后您可以看到这些分支之间不同的文件。当你选择一个文件时,你会看到它的差异。

取自here

【讨论】:

  • 我在修订网格中选择了 2 个分支,但在顶部的菜单中或右键单击时没有看到任何比较命令。
  • 我在底部窗格的标题中找到了它。有 Commit、File tree 和 Diff。
【解决方案10】:

更新

Mac:我现在使用 SourceTree。彻底推荐。我特别喜欢你可以上演/取消上演帅哥的方式。

Linux:我在以下方面取得了成功:

  • smartgit
  • GitKraken
  • meld

例如在 Ubuntu 上安装 smartgit


这样就可以了:

git-diffall 带有一个 GUI diff 工具,比如 meld。请参阅此处的第 5 点:

http://rubyglazed.com/post/15772234418/git-ify-your-command-line

这里有一篇关于 git 和 meld 的好帖子:http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy

【讨论】:

    【解决方案11】:

    如果您使用 Eclipse,您可以直观地将工作区中的当前分支与另一个标记/分支进行比较:

    【讨论】:

    • 就我个人而言,我发现 Eclipse 支持 diffing sub-par,但如果这就是你所拥有的,那就没问题了。
    【解决方案12】:

    您也可以使用 Perforce 的免费 P4Merge 来执行此操作:

    http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools

    可以在herehere找到它与Git集成的详细信息

    但以上链接的快速总结是:

    • 将以下位放入 ~/.gitconfig 中,然后您可以通过 $ git mergetool$ git difftool 使用 p4merge
    • 请注意,$ git diff 仍将使用默认的内联差异查看器 :)(使用 git 版本 1.8.2 测试)

    .gitconfig 的变化

    [merge]
      keepBackup = false
        tool = p4merge
    [mergetool "p4merge"]
        cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$PWD/$BASE\"" "\"$PWD/$REMOTE\"" "\"$PWD/$LOCAL\"" "\"$PWD/$MERGED\""
        keepTemporaries = false
        trustExitCode = false
        keepBackup = false
    [diff]
        tool = p4merge
    [difftool "p4merge"]
        cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$REMOTE\"" "\"$LOCAL\""
    

    【讨论】:

      【解决方案13】:

      看看git show-branch

      您可以使用核心 git 功能做很多事情。指定您希望在视觉差异中包含的内容可能会很好。大多数答案都关注提交的逐行差异,您的示例关注给定提交中受影响的文件的名称。

      似乎没有解决的一个视觉问题是如何查看分支包含的提交(无论是共同的还是唯一的)。

      对于这个视觉效果,我是git show-branch 的忠实粉丝;它打破了一个组织良好的提交表,每个分支返回到共同的祖先。 - 要在具有多个分歧的分支上尝试它,只需键入 git show-branch 并检查输出 - 有关示例的文章,请参阅Compare Commits Between Git Branches

      【讨论】:

        【解决方案14】:

        如果您使用优秀的 WebStorm 编辑器,您可以与任何您喜欢的分支进行比较:

        【讨论】:

        • 其实我只是注意到 IntelliJ IDEA(大概也是 WebStorm)具有“突出显示未选择的提交”的能力,这使得分支中存在哪些提交而不是另一个提交非常清楚。
        • 是的,我只是使用 intellij 通过“保存时自动格式化”有选择地滚掉在存储库中所做的大量更改。很容易......不过必须找到“与本地比较”选项才能做到这一点
        【解决方案15】:

        这里是如何在 Visual Studio 中查看整个提交之间的视觉差异,而不是单个文件(在 VS 2017 中测试)。不幸的是,它只适用于一个分支中的提交:在“团队资源管理器”中,选择“分支”视图,右键单击存储库,然后选择“查看历史记录”,如下图所示。

        然后当前分支的历史出现在主区域。 (在当前分支上以较早提交结束的分支由标签标记。)现在使用 Ctrl-Left 选择几个提交,然后右键单击并从弹出菜单中选择“比较提交...”。

        有关比较 Microsoft 世界中的分支的更多信息,请参阅这个 stackoverflow 问题:Differences between git branches using Visual Studio

        【讨论】:

        • 仅显示单个分支的历史记录,因此无法在分支之间进行比较。
        【解决方案16】:

        您还可以使用 vscode 使用扩展 CodeLense 比较分支,这已经在这个 SO 中得到回答:How to compare different branches on Visual studio code

        【讨论】:

          猜你喜欢
          • 2021-07-05
          • 2012-01-18
          • 1970-01-01
          • 2016-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 2012-08-20
          相关资源
          最近更新 更多