用融合观察枝条的差异?

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

目前,我采取以下步骤:

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

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

105383 次浏览

简明扼要:

git config --global diff.tool meld

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

然后,如果希望使用图形差异而不是文本差异,只需调用 git difftool而不是 git diff(它们都使用相同的参数)。就你而言:

git difftool master..devel

更新: 如果您不想使用一次一个文件的 diff,而是想使用 meld 的“子目录”视图来处理两个分支之间的所有更改,请注意 git difftool-d--dir-diff选项。例如,当我在分支 XYZ 上并且想看看 this 和分支 ABC 之间有什么不同时,我运行以下命令:

git difftool -d ABC

尽管从其他答案来看,目前似乎没有一种方法可以直接在 git 存储库中实现这一点,但是编写一个脚本很容易(感谢 另一个问题的答案:) ,该脚本将提取两个提交到临时目录的树,并在它们上面运行 meld,在 meld 退出时删除两个目录:

Http://gist.github.com/498628

当然,你会失去任何改变,通过融合,但它是相当不错的一个快速概述的差异,我认为。

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

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

目的: 比较 Branch _ a 和 Branch _ b 与 meld 之间的差异

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

从 gitv1.7.11开始,可以使用 git difftool --dir-diff执行目录 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

在 gitV1.7.9中,您可以比较两个不使用命令行的提交:

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

启动 Gitk,选择一个提交,右键单击另一个提交 > “ 差异这-> 选择”。 在「修补程式」下面,右击「 外部差异」档案。

Meld 将启动并显示仍然选中的内容,首先在右侧提交。

重要的是要说,使用 git difftool -d仍然可以编辑你的工作文件在融合和 救救他们。为了实现这一目标,你需要将一些分支与当前的工作树进行比较,例如:

git difftool -d branchname

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

然而,更有趣的选择是将当前工作目录与存储目录进行比较:

git difftool -d stash

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

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

对于 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的某些特性,古腾耶的回答对我来说不起作用。