在Git中无法对两个独立分支中的文件进行差异比较

58

我在branchA中有FileA,在branchB中有FileB。

问题是我一次只能访问一个文件。我想要通过FileMerge或meld比较这两个文件,因为它们是我在Mac上找到的唯一的diff工具。

你如何使用meld/FileMerge来进行文件比较


[已解决]: 第1个问题: FileMerge不允许标准输入

Masi: 你可以使用opendiff来允许FileMerge从标准输入获得文件。所以下一个问题是如何让Git的diff工具使用opendiff。


第2个问题: 如何让Git的diff工具在Mac上使用opendiff


1
问题不在于git没有使用opendiff,而是在master分支上README不存在。 - Hank Gay
4个回答

67
你可以使用 "git mergetool" 来合并,而在现代的 git(也就是版本 1.6.3 及更高版本),你可以使用 "git difftool" 来比较差异并使用图形工具。当然,你需要先配置它们,但它们会进行一些自动检测(当然,有一些硬编码的偏好设置),如果我没记错的话,opendiff 支持已经内置了。
然后,当然你可以像普通的 "git diff" 一样使用你的图形工具(opendiff / FileMerge)。例如:
prompt> git difftool somebranch:UNREADME otherbranch:README

正如我所写的,git-difftool仅在git版本1.6.3及更高版本中可用(检查“git --version”的输出)。 - Jakub Narębski
问题解决了:MacPorts上的Git版本太旧,我需要更新它。-- 谢谢你的回答! - Léo Léopold Hertz 준영

61

Git支持将分支名称作为仓库路径的一部分。例如,如果您的仓库中有以下文件:README只存在于master分支上,而UNREADME只存在于branch分支上:

master:README

branch:UNREADME

您可以通过以下git命令来对它们进行比较:
git diff branch:UNREADME master:README

你可以使用 git show 命令将版本库的构件输出到标准输出:

git show branch1:UNREADME

所以,如果您的外部差异工具可以在 bash 提示符上接收 2 个文件,则可以使用以下方式进行差异比较:
diff-command <(git show branch1:UNREADME) <(git show master:README)

<(...) 的 bash 语法会将封闭命令的输出作为管道输入,并在命令行上放置管道文件路径。


你如何使用外部文件差异合并工具来完成相同的操作?-- 我在Mac上运行 % open -a filemerge Heee/master:.profile master:.profile,但未成功。 - Léo Léopold Hertz 준영
1
FileMerge.app不接受来自stdin的输入。您可以尝试使用Google生成的此脚本:http://kerneltrap.org/mailarchive/git/2007/11/21/435536 - Jarret Hardie
1
你也可以尝试使用Changes.app,它有一个命令行实用程序,并且可以接受来自stdin的输入... http://changesapp.com/ - Jarret Hardie

37

例如,如果您当前正在checkout到branchA分支,您可以使用以下命令:

git diff branchB path/to/common/file/between/branches.txt

如果您只想使用更改的子集,可以编辑差异,否则将其保留不变,并将差异应用为补丁git apply。至于GUI工具,希望其他人能够提供建议。


1

文档中可以看到,你需要在.git/config文件中添加类似以下的内容:

# Our diff algorithm
[diff]
    external = opendiff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接