177

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

目前我执行以下步骤:

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

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

4

8 回答 8

360

短而甜:

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
于 2010-01-05T13:21:42.810 回答
108

从 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
于 2012-10-10T09:11:14.093 回答
60

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

于 2010-11-30T09:24:41.527 回答
15

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

git difftool -d branchname

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

更有趣的选择是将当前工作目录与 stash 进行比较。您只需键入:

git difftool -d stash

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

我认为它可以通过 stash 显着提升工作流程。您可以逐步将更改从存储转移到工作副本并逐个提交,如果需要,可以引入一些其他更改。

于 2014-03-20T14:28:28.907 回答
5

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

http://gist.github.com/498628

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

于 2010-07-29T16:53:08.670 回答
5

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

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

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
于 2011-09-09T09:19:20.467 回答
3

对于 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如果您愿意,可以省略配置。

由于自动转义和/或带有zsh.

于 2020-06-04T18:22:16.553 回答
0

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

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

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

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

于 2014-02-03T21:46:54.857 回答