与“git mergetool”合并

我发现git mergetool是一个方便的实用工具,可以在视觉上合并差异,但是我对它的方式看起来真的太不可思议了。 从本质上说,当报告冲突时,我的过程如下所示:

  1. 执行一个git mergetool
  2. 在提示符下, 按Enter键启动我的diff工具(Meld或FileMerge,取决于哪台计算机)
  3. 解决冲突
  4. 保存更改
  5. closuresdiff工具

如果我有一个以上的冲突,冲洗,重复。 是的,这是我打开和closures我的差异查看器一次合并的每个冲突。 由于它是从命令行启动的,关​​闭它是我知道告诉git mergetool我已经解决了这个特定冲突并且可以继续下一个的唯一方法。

当然有更好的办法,但我不知道。 请帮忙吗? 这个过程似乎疯狂低效。

乍一看,似乎不可能重用一个外部diff工具会话。

git-mergetool文档明确指出:

如果自定义合并工具使用其退出代码正确指示了合并parsing的成功,则可以将configurationvariablesmergetool.<tool>.trustExitCode设置为true。
否则,在自定义工具退出后, git-mergetool会提示用户指示parsing成功。

所以需要退出代码(或在diff工具退出之后validation用户),这意味着用户首先closures外部diff工具。

这似乎是一个很大的激励措施,以减less每次合并/重组一次尝试的冲突次数;)(无论使用VCScs工具)

注意:
其他两个git外部差异工具设置(“ 在Windows上 设置 Git的差异和合并工具 ”和“ 使用Git设置SourceGear DiffMerge ”)在不closures外部差异工具时不会给出更多希望…

如果你select的mergetool支持在现有的实例中打开文件,你可以在你的git config中指定命令:

 % git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE' % git config merge.tool whatever_you_want 

git mergetool然后将执行您的自定义命令,然后提示您是否成功合并文件(代替查看退出代码)。

我刚刚为vimdiff一起入侵的一个例子:

 % git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><CW>l"' 

这工作得很好,我可以开始使用它自己!

mergetool的问题是故意使用命令行界面来启动合并会话,然后等待被调用的命令返回以确定用户驱动的合并何时完成。

大多数合并工具都不提供用于在已经运行的进程中启动合并会话的命令行机制,其方式用于确定何时完成分辨率以及是否成功。

可以想象的是,一些合并工具可以通过单独的包装器命令和某种types的IPC来提供这种function,但是在通用的mergetool程序中,这将非常具体且难以实现。