查看分支与融合的差异?

时间:2010-01-05 12:44:18

标签: git diff branch meld

我知道我可以使用meld .查看HEAD和当前状态之间的区别。但是,如何查看分支之间的差异,例如masterdevel与meld?

目前我执行以下步骤:

  1. 重命名工作副本文件夹
        例如mv /projectA /projectA_master
  2. 再次克隆项目
        git clone url
  3. 切换到devel分支
        cd projectA && git -b devel origin/devel
  4. 查看与meld的差异     meld /projectA_Master projectA
  5. 是否有更简单的方法可以在融合中获得相同的结果?我只需要它来审查更改,而不是主要用于合并。

8 个答案:

答案 0 :(得分:297)

简短&甜:

git config --global diff.tool meld

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

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

git difftool master..devel

更新:如果您不想要一次一个文件的差异,而是想要使用meld的“子目录”视图以及两个分支之间的所有更改,请注意-d--dir-diff的{​​{1}}选项。例如,当我在分支XYZ上时,我想看看这个和分支ABC之间有什么不同,我运行它:

git difftool

答案 1 :(得分:95)

从git v1.7.11开始,您可以使用git difftool --dir-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 :(得分:51)

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

答案 3 :(得分:12)

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

git difftool -d branchname

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

更有趣的选择是当前工作目录与藏匿的比较。您只需输入以下内容即可完成此操作:

git difftool -d stash

然后,您可以将一些更改从存储(左侧窗口)传输到当前工作副本(右侧窗口),而不使用git stash pop/apply并避免可能由此命令引起的麻烦的冲突解决。

我认为它可以显着提升带有藏匿处的工作流程。您可以逐步将更改从存储转移到工作副本并逐个提交,如果需要,可以引入其他更改。

答案 4 :(得分:5)

虽然从其他答案看来好像目前还没有办法直接在git存储库中执行此操作,但很容易(感谢another question :)的答案)编写一个脚本将两个提交的树提取到临时目录并在它们上运行meld,当meld退出时删除两个目录:

http://gist.github.com/498628

当然,你将失去通过meld做出的任何改变,但我认为快速概述差异是非常好的。

答案 5 :(得分:3)

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

目标:将branch_a和branch_b之间的差异与meld

进行比较
git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

答案 6 :(得分:1)

对于macOS上的Meld,请按照the maintainer of the macOS application, 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's answer由于自动转义和/或zsh的问题而无法解决。

答案 7 :(得分:0)

在git V1.7.9中,您可以在没有命令行的情况下比较两个提交:

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

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

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