查看带有Meld的分支的差异?


159

我知道我可以使用来查看HEAD和当前状态之间的差异meld .。但是,如何查看分支之间的差异(例如master,如何devel与分支融合)?

目前,我执行以下步骤:

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

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


Answers:


55

我也发现这个问题很烦人,所以我制作了git meld,它提供了一种更舒适的方式来将任意提交与工作树或暂存区进行比较。您可以在https://github.com/wmanley/git-meld上找到它。它有点像Mark的脚本,但是可以将任意提交,暂存区或工作目录与其他任何提交进行比较。如果您要比较的事物之一是工作树,那么它也是可读写的,因此您不会丢失所做的更改。


1
优秀的工具,威尔。谢谢!强烈建议...如果现在也可以进行合并的话。
机油尺

TYVM是一个很棒的工具-(提醒自己将!添加到别名)
kfmfe04 2012年

26
引用来自热门github仓库中的Will:“注意:git-meld已过时,因为git difftool学习了git 1.7.11中的--dir-diff选项。”
oluc,

318

简短而甜美:

git config --global diff.tool meld

这会将Git配置为meld用作差异工具。(您无需指定命令行参数,对meldGit的内置支持。)

然后,如果您想要图形差异而不是文本差异,则只需调用git difftool而不是git diff(它们都采用相同的参数)。在您的情况下:

git difftool master..devel

更新:如果您不想一次比较一个文件,而是想使用结合两个分支之间所有更改的Meld的“子目录”视图,请注意的-d--dir-diff选项git difftool。例如,当我在XYZ分支上,并且想查看此分支与ABC分支之间的区别时,请运行以下命令:

git difftool -d ABC

3
那不是我想要的。它按文件显示差异。我之前用脚本diff.py和'git diff master..devel'将其存档。我想查看所有差异和目录树,就像“融合folderA / folderB /”一样。
Marten Bauer 2010年

Marten,这就是git工作的方式。它仅跟踪文件,因此您只能逐文件查看差异文件。在git中,您不能仅提交空目录。您要在dir之间显示差异吗?
Donny Kurnia 2010年

@DonnyKurnia:我花了一点时间来弄清楚OP试图做什么:Meld有一个单独的UI,用于查看目录中的所有更改。您可以根据查看文件是否相同,更改或新来过滤它们。OP希望使用该UI来显示更改。(这使您可以查看所有更改的列表,并选择要比较的更改。)因此,这不是目录之间的比较,而是提交之间的比较,而是作为一个整体进行的比较。
idbrii 2012年

17
@MartenBauer我想这是你想要什么:混帐difftool --dir-DIFF主devel的
斯特凡

3
可以这样做,以使当前分支不在tmp文件夹中,从而允许编辑吗?
zkent 2014年

100

从git v1.7.11开始,您可以git difftool --dir-diff用来执行目录diff。可以很好地与https://github.com/wmanley/git-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

2
我认为这确实是OP想要的。注意,-g选项使用guidiff工具,-d选项使用--dir-diff。这对进行代码审查很有用。Nit:至少对于Git 1.8,在指定-d时不需要difftool.prompt选项。
Michael Percy

1
这真太了不起了。正是我所需要的。谢谢!
尼古拉斯

5
可以这样做,以使当前分支不在tmp文件夹中,从而允许编辑吗?
zkent 2014年

2
我也希望能回答@zkent问题... :(
tavlima 2014年

3
@zkent @tavlima:此命令已经允许您在当前版本上进行编辑。即使您看到一个tmp floder进入融合,如果您保存-- Ctrl+s正确的部分,您的文件也会被修改。
本杰明·

13

它说,使用是很重要的git difftool -d,你仍然可以编辑在MELD和你的工作文件保存它们。为了实现这一点,您需要将一些分支与当前的工作树进行比较,例如:

git difftool -d branchname

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

还有一个更有趣的选择是将当前工作目录与隐藏目录进行比较。您只需输入以下内容即可:

git difftool -d stash

然后,您可以将某些更改从存储区(左窗口)转移到当前的工作副本(右窗口),而无需使用git stash pop/apply和避免由该命令引起的麻烦的冲突解决方法。

我认为它可以显着提高工作流程的存储效率。您可以逐步将更改从存储转移到工作副本,然后将它们一个接一个地提交,并根据需要引入其他更改。


皮特,这正是我一直在尝试做的事情,但是就我而言(在CentOS上),没有创建符号链接。是否有任何必需的配置设置,或支持此功能的最低版本的Meld?
wrjohns,2015年

我认为Git负责符号链接的创建,而不是Meld。查看Git手册中的difftool命令。也许您应该将其更新为较新的版本?
Piotr Jurkiewicz

2
从分支复制新文件到工作目录不起作用:(
pykiss '16

5

尽管从其他答案来看,似乎目前尚无法直接在git存储库中执行此操作,但编写脚本提取两个提交树的脚本很容易(由于回答了另一个问题 :))到临时目录并在其上运行meld,并在meld退出时删除两个目录:

http://gist.github.com/498628

当然,您将丢失通过融合进行的所有更改,但是我认为,快速概览这些差异非常好。


3

我认为一个简单的方法是使用git reset --soft

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

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

0

在git V1.7.9中,您可以不通过命令行比较两个提交:

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

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

融合将开始并在右侧显示仍选择的第一次提交。


0

对于macOS上的Meld,请~/.gitconfig根据macOS应用程序的维护者yousseb的建议将其添加到您的:

[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

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.