git和 perforce4Merge

Git、P4merge OS X

Diff 是程序员*重要的工具之一。不过,除了在 mail 里发送 patch,我很难忍受传统 diff 的字符输出。在任何系统上开发软件,*件重要的准备工作就是寻找趁手的 GUI diff 工具。GUI diff 工具的优势在于 side-by-side 的比较方式即能显示变化的部分,又不影响对每个版本的连续阅读。Linux 上比较好的是 KDE 的 kompare,也是我见到的*种 GUI diff 工具。因为先入为主的看到 kompare 使用曲线来联系变化的对应关系,所以任何使用空行填充或者直线来显示对应关系的 GUI diff 工具对我来说也是比较勉强的 —— 可以暂时使用,但是仍然会不断寻找替代品。

平时工作用 Perforce 管理代码,它有个自带的 GUI diff 工具 P4merge。功能很强大(而且免费,虽然 Perforce 是商业软件,但是它的 client,包括 P4v 和 P4merge 都是免费的,而且 P4merge 可以完全脱离 Perforce server 独立使用),除了普通的比较两个文件(版本)之外还可以 3-way 比较(一般用来做人工的 branch merge,分别比较 branch fork 之前的原始版本,main branch 上的修改版本,和其它 branch 上的修改版本)。和 editor 不同的是,diff 工具操作的不仅仅是 check-out 的 version,而是 version repository 里的任意版本。所以 diff 工具要想和 version control 系统配合,简单的文件操作是不够的,一个成熟的 version control 系统必须在设计中考虑如何与外部的 diff 工具协作。

从上周开始用 Git 管理 Dict Mac 的 code base。用到昨天终于感到缺省的『 git diff 』不好用(类似『 diff -u 』的输出)。简单的 Google 一下就找到了答案:

git difftool …

原本以为只有在 Linux 上才会有缺省配置好的 GUI diff 工具和 Git 协作。在 Mac 上试过发现 OS X 上已经配置好了 opendiff 可以让 Git 直接使用。OS X 的 out-of-box 用户体验确实不是只用来蒙初学者的。连 developer 的工具也能准备齐全。但我还是*习惯 P4merge。于是试着配置:

git config –global diff.tool p4merge
git config –global \
difftool.p4merge.cmd /Applications/p4merge.app/Contents/MacOS/p4merge

然后运行『 git difftool 』,P4merge 是调用起来了,但是没有内容。原来 Git 缺省不会向 diff 工具传递参数,必须写到命令行配置里:

git config –global \
“difftool.p4merge.cmd \
/Applications/p4merge.app/Contents/MacOS/p4merge \”\$LOCAL\” \”\$REMOTE\””

这里还有一个陷阱,在某些 shell 里,『 $ 』是不用加转义的。不过在 OS X 的 bash 里必须加。