参考: https://stackoverflow.com/questions/34119866/setting-up-and-using-meld-as-your-git-difftool-and-mergetool
difftool和mergetool的2个git命令,可以调起第三方的工具来进行文件比对或者出现合并冲突时解决冲突。 不使用GUI的工具,操作起来是不很方便,工欲善其事,必先利其器,所以今天要介绍的如果配置并使用meld,这个GUI工具,提高工作效率。
安装meld很简单,大家到官网下载自行安装吧。
我们将手动修改.gitconfig文件来进行配置,可以参考这里来找到这个文件。 需要添加的内容如下所示
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = D:/Meld/meld $REMOTE $LOCAL
需要解释一下是 cmd = D:/Meld/meld $REMOTE $LOCAL , $REMOTE代表的是git仓库中的文件, $LOCAL代表的是你工作区中文件。 如何你的meld的安装路径中有空格,记得用引号把路径包起来,例如 cmd = “D:/some path/meld” $REMOTE $LOCAL
当你在工作区中修改了文件,想和暂存区中的文件进行对比时,允许 git difftool 就会打开meld,meld会打开2个窗口,左侧显示的工作区中文件内容,右侧显示的暂存区中文件的内容(你没看错,cmd的值没问题,我也不知道为啥这样~~)。 这里需要注意,meld会找出所有的工作区和暂存区内容不同的文件,每次打开一个文件供你进行对比,直到全部对比完。
如果我想对比的是暂存区和仓库中的文件怎么办呢?
加个参数即可 git difftool --staged meld左侧是暂存区文件,右侧是仓库中的文件
如果我想对比的是工作区和仓库中的文件怎么办呢?
加个参数即可 git difftool HEAD meld左侧是工作区文件,右侧是仓库中的文件
如果我想对比的是2个commit之间文件的差异呢
git difftool commitId1 commitId 2
如果我想对比的是2个branch之间文件的差异呢
git difftool branch1 branch2
为什么merge时会产生冲突,可以参考这里 在这里我们只讨论如何配置,以及配置中要用的参数的含义
请将下面的配置放入你的git的配置文件中
[merge]
tool = meld
[mergetool "meld"]
cmd = D:/Meld/meld $LOCAL $MERGED $REMOTE --output $MERGED
#cmd = D:/Meld/meld $LOCAL $BASE $REMOTE --output $MERGED
我们看到,这与配置difftool的套路是相同,只是参数更多了,下面我们讲讲这些参数。
$LOCAL 代表的是本分支下产生合并冲突的文件
$REMOTE 代表的是将要被合并过来的分支中产生合并冲突的文件
第一个和第三个参数是固定,但是第二个参数,有2中选择:
$MERGED:代表的是没有冲突的部分已经合并,且包含冲突信息
$BASE:代表的是产生冲突的两个文件的parent,他的内容中是不包含相冲突的这2个commit的内容的。
通常我们常用的是 cmd = D:/Meld/meld $LOCAL $MERGED $REMOTE --output $MERGED
因为$MERGED的内容已经把能合并都合并好了,我们要做的仅仅是把git不能决定的部分决定了即可,省力。
meld启动后,会有3个窗口,左侧为本分支中的文件的内容,中间是merge的中间结果, 右侧是被合并过来的分支中的文件。我们要修改的是中间这个窗口中的内容。
--output $MERGED:代表的是最终merge完的文件
配置并不复杂,但是要说明的是mergetool不会替你进行merge,他唯一的作为帮你解决冲突,确定冲突的文件的最终的内容。当你解决完冲突,并进行保存后,你要手动进行commit,把这个merge的结果提交。
如果你在meld中操作的时候,不想继续解决冲突了,不要保存,直接关闭meld,git 会提示 Was the merge successful? [y/n], 输入 n, 你在meld中进行的操作不会保存,也就是说没有解决冲突问题。 但是如果你在meld中进行过保存,那git的这个提示就不会出现了,恢复的方式是找一个叫 filename.orig的文件,这里面是冲突meld启动前备份出来了,用他恢复你的文件成为冲突刚刚出现时的状态。 确认合并完了,手动删除filename.orig