通过融合查看分支差异?

问题描述 投票:0回答:9

我知道我可以用

meld .
查看HEAD和当前状态之间的差异。但是我如何查看分支之间的差异,例如
master
devel
与 meld ?

目前我执行以下步骤:

  1. 重命名工作副本的文件夹
    例如
    mv /projectA /projectA_master
  2. 再次克隆项目
    git clone url
  3. 切换到
    devel
    分支
    cd projectA && git -b devel origin/devel
  4. 查看与融合的差异
    meld /projectA_Master projectA

是否有更简单的方法可以在融合中获得相同的结果?我只需要它来查看更改,而不是主要用于合并。

git diff branch meld
9个回答
381
投票

简短而甜蜜:

git config --global diff.tool meld

这将 Git 配置为使用

meld
作为 diff 工具。 (您不需要指定命令行参数,Git 内置了对
meld
的支持。)

然后,如果您想要图形差异而不是文本差异,只需调用

git difftool
而不是
git diff
(它们都采用相同的参数)。对于你的情况:

git difftool master..devel

更新:如果您不想要一次一个文件的差异,而是想使用 meld 的“子目录”视图来显示两个分支之间的所有更改,请注意

-d
--dir-diff
选项对于
git difftool
。例如,当我在分支 XYZ 上并且我想看看它与分支 ABC 之间有什么不同时,我运行以下命令:

git difftool -d ABC

115
投票

从 git v1.7.11 开始,您可以使用

git difftool --dir-diff
执行目录差异。在没有 https://github.com/wmanley/git-meld 脚本的情况下,它可以很好地与 meld 配合使用。

配置git

git config --global diff.tool meld

使用它

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

对于 macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

60
投票

我还发现这个问题很烦人,所以我制作了 git meld,它允许以更舒适的方式根据工作树或暂存区域区分任意提交。您可以在 https://github.com/wmanley/git-meld 找到它。它有点像 Mark 的脚本,但适用于将任意提交、暂存区域或工作目录与其他任何目录进行比较。如果您要比较的对象之一是工作树,那么它也是读写的,这样您就不会丢失更改。


21
投票

重要的是,使用

git difftool -d
,您仍然可以在 Meld 中编辑您的工作文件并保存它们。为了实现这一点,您需要将某个分支与当前的工作树进行比较,例如:

git difftool -d branchname

Meld 将显示左右目录都位于 /tmp 中。但是,正确目录中的文件实际上是指向当前工作目录中文件的符号链接(不适用于 Windows)。因此,您可以直接在 Meld 中编辑它们,当您保存它们时,您的更改将保存在您的工作目录中。

更有趣的选择是将当前工作目录与存储目录进行比较。您只需输入即可做到这一点:

git difftool -d stash

然后您可以将一些更改从存储(左窗口)转移到当前工作副本(右窗口),而无需使用

git stash pop/apply
并避免此命令可能引起的麻烦的冲突解决。

我认为它可以显着提高存储的工作流程。您可以逐渐将更改从存储转移到工作副本,并一一提交它们,如果需要,还可以引入其他一些更改。


6
投票

虽然从其他答案看来,目前似乎没有办法直接在 git 存储库中执行此操作,但编写一个提取树的脚本很容易(感谢另一个问题的答案:))两次提交到临时目录并对其运行 meld,当 meld 退出时删除这两个目录:

http://gist.github.com/498628

当然,您将丢失通过合并所做的任何更改,但我认为这对于快速概述差异非常好。


5
投票

我认为一个简单的方法是使用

git reset --soft
:

目标:用meld比较branch_a和branch_b之间的差异

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

4
投票

对于 macOS 上的 Meld,请按照 macOS 应用程序维护者 yousseb

 的建议将其添加到您的 
~/.gitconfig

[diff] tool = meld [difftool] prompt = false [difftool "meld"] trustExitCode = true cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\" [merge] tool = meld [mergetool] prompt = false [mergetool "meld"] trustExitCode = true cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

如果您愿意,可以省略

merge

 配置。

@GutenYe 的回答由于自动转义和/或带有 zsh

 的内容而对我不起作用。


0
投票
在 git V1.7.9 中,您可以在不使用命令行的情况下比较两个提交:

您必须在“git gui”编辑选项中配置全局:“使用合并工具:meld”。

启动

gitk,选择一个提交,右键单击另一个提交>“diff this --> selected”。 在“补丁”下右键单击一个文件>“外部差异”。

meld 将启动并在右侧显示仍然选定的第一个提交。


0
投票
我更喜欢避免

git config

 设置并直接使用 
获取差异信息

git difftool --tool=meld -d some_branch_name..other_branch_name
如果当前签出了 some_branch,则只能指定其他分支名称。

git difftool --tool-help

 清晰地概述了支持的选项/工具。

© www.soinside.com 2019 - 2024. All rights reserved.