与“git mergetool”合并

时间:2009-02-25 12:44:05

标签: git diff mergetool

我发现 git mergetool 是一个方便的实用程序,可以直观地合并差异,但我的方式似乎真的很不稳定。基本上,当报告冲突时,我的过程看起来像这样:

  1. 执行 git mergetool
  2. 在提示符处,点击 Enter 以启动我的差异工具(Meld或FileMerge,具体取决于哪台计算机)
  3. 解决冲突
  4. 保存更改
  5. 关闭差异工具
  6. 如果我有多个冲突,请冲洗,重复。是的,这是我为合并中的每个冲突打开和关闭我的差异查看器一次。因为它是从命令行启动的,关​​闭它是我知道告诉git mergetool的唯一方法,我已经解决了这个特定的冲突,并且它可以继续下一个。

    当然有更好的方法,但我不知道。请帮忙吗?这个过程看起来很低效。

4 个答案:

答案 0 :(得分:34)

乍一看,似乎无法重复使用外部差异工具会话。

git-mergetool documentation明确指出:

  

如果自定义合并工具正确指示合并解析 及其退出代码 的成功,则配置变量mergetool.<tool>.trustExitCode可以设置为true。
  否则,git-mergetool将提示用户在自定义工具退出后指示分辨率是否成功。

因此需要退出代码(或退出diff工具后验证用户),这意味着用户首先关闭外部差异工具。

这似乎是减少每次合并/ rebase尝试的冲突次数的一个很好的动机;)(无论使用什么样的VCScs工具)

注意:
另外两个git外部差异工具设置(“Setting up diff and merge tools for Git on Windows”和“Setting up SourceGear DiffMerge with Git”)在未关闭外部差异工具时没有给予更多希望... < / p>

答案 1 :(得分:22)

如果您选择的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><C-W>l"'

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

答案 2 :(得分:12)

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

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

可以想象,一些合并工具可以通过单独的包装器命令和某种类型的IPC提供此功能,但它将非常具有工具特性,并且难以在通用合并工具程序中实现。

答案 3 :(得分:0)

我一直在寻找非常长时间的答案。现在,我终于得到了这个简单的解决方案(令人惊讶):

融化。

这将在版本控制视图中打开融合。 这样,您可以解决选项卡中的冲突,并在每次单击“标记为已解决”按钮时将其标记为已解决。