git可视化diff与merge工具

git支持很多种diff和merge工具,可以使用下面的命令查看。

git difftool --tool-help
# or
git mergetool --tool-help

命令输出如下:

'git difftool --tool=' may be set to one of the following:
        araxis
        vimdiff
        vimdiff2
        vimdiff3

The following tools are valid, but not currently available:
        bc3
        codecompare
        deltawalker
        diffmerge
        diffuse
        ecmerge
        emerge
        gvimdiff
        gvimdiff2
        gvimdiff3
        kdiff3
        kompare
        meld
        opendiff
        p4merge
        tkdiff
        xxdiff

Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

以上输出的含义是araxis, vimdiff, vimdiff2, vimdiff3这几个工具已经安装在我们的系统上,可以直接使用。
下面列出的其他的工具git也可以支持,但是还没有被安装到系统中。

那么这么多的工具哪个最好用呐?根据我自己的体验, p4merge 是最好用的一个。
多提一句,不要被p4merge这个名字误导,以为它只能做merge,它也可以做diff的。

p4merge

p4merge是 perforce 这家公司出品的叫perforce的软件旗下的一个免费(没开源)工具。
这里必须提一下,在商业VCS(Version Control System)领域,perforce是绝对的第一,没有之一。

安装与配置

首先在perforce的官方网站下载到p4merge的包(已经是编译好的二进制文件)。
解压包的内容到一个目录下,我这里解压到我本机的 /usr/local/p4v/ 目录下,p4merge的绝对路径是 /usr/local/p4v/bin/p4merge

想要让git识别p4merge需要进行如下配置:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.path "/usr/local/p4v/bin/p4merge"

这里可能有人会问为什么没看到有关diff的配置,这是因为git的merge配置会默认应用到diff上,所以只需要配置merge即可。

两个场景

使用可视化diff和merge工具的两个主要场景就是查看版本之间的diff信息和在merge冲突后通过可视化的视图来解决冲突。

diff

首先执行下面的命令来查看master分支上最新的提交和倒数第二次提交的diff。

git difftool master^ master

GUI截屏如下:

git可视化diff与merge工具_第1张图片

从图上可以很直观的看到文件在不同版本的diff。

merge

当执行 git merge 产生冲突后,执行下面的命令来查看冲突后的场景。

git mergetool

GUI截屏如下:

git可视化diff与merge工具_第2张图片

解释一下这个图,上半部分分为3块,中间一块是本次合并的代码基,也就是两个分支的共同祖先commit的内容。
左边一块是要合并的分支 的内容。右边一块是当前分支的内容。
下半部分是合并后希望产生的最终内容。可以方便的通过右面的几个图形来动态选择希望的内容。

几个选项

当执行 git difftool 时git会提示:

Viewing (1/1): 'Documentation/RelNotes/2.5.1.txt'
Launch 'p4merge' [Y/n]:

如果希望不要每次都出现这个提示,可以使用 -y | -Y | --no-prompt 参数来告诉git不要提示。
这个选项同样适用于执行 git mergetool 时出现的提示。

当执行 git mergetool 然后从p4merge里退出来以后,git会询问:

Was the merge successful? [y/n]

这是因为git不知道用户有没有在p4merge中解决掉冲突,所以才会询问用户,可以使用 --trust-exit-code 选项来告诉git读取p4merge的返回值来确定成功与否。

当执行 git mergetool 然后从p4merge里退出来以后,发现在冲突的文件(假设叫 README)的同名目录下多出来一个 README.orig 的文件。
保留冲突文件的原始内容是git的默认逻辑,如果希望不要保存,可以使用以下配置来避免:

git config --global mergetool.keepBackup false

这样git就不会再自动产生 .orig 文件了。

官方文档

有关 p4merge 更多的内容请执行 /path/to/p4merge -h 了解。

有关 git difftool 更多的内容请到 git官方文档-git-difftool了解。

有关 git mergetool 更多的内容请到 git官方文档-git-mergetool了解。

转载于:https://my.oschina.net/starfx/blog/524128

你可能感兴趣的:(git可视化diff与merge工具)