如何在不启动 mergetool GUI 的情况下获取 BASE / REMOTE / LOCAL 文件?

How do I get BASE / REMOTE / LOCAL files without launching a mergetool GUI?

我什至不太确定如何问这个问题......但也许:

我处于冲突状态。我想使用 null-op/bin/bash 作为我的合并工具。

也就是说,我希望 git 创建(REMOTE、LOCAL、BASE 等)文件,然后让我返回到手动差异/合并的提示。接着 我想在完成后告诉 git。

我想要的 mergetool 是什么,我该如何指定它?

注意:这是一个 related question,但是 1) 它混淆了变基(我不是变基),以及 2) 没有令人满意的答案,例如"choose any mergetool and force-quit it.":P

git mergetool 是一个 shell 脚本(/bin/sh;/bin/bash 可以 运行 它,如果你只有 bash 而不是普通的老 sh)。它:

  1. 从索引中提取三个文件(.BASE = 阶段 1 条目,.LOCAL = 阶段 2 条目,.REMOTE = 阶段 3 条目)。第四个文件用作对合并工具的检查——如果您要手动进行合并,则不需要此文件。
  2. 使用第二个 shell 脚本运行您选择的合并工具。
  3. 根据工具及其退出状态,询问您合并是否成功,或使用退出状态来决定合并是否成功。如果你说是,它 运行s git add 在合并文件上。
  4. 删除它在步骤 1 中创建的文件。

它在循环中为所有未合并的文件执行此操作。

您的工作是修改 shell 脚本,以便它提取三个文件并保留它们,即执行(大部分)步骤 1,然后根本不执行其余步骤。只需找到脚本 — 它在 $(git --exec-path)/git-mergetool 中 — 并以另一个名称将其复制到其他地方,例如 git-extract-unmerged,修改它以按照您想要的方式运行,然后 运行 git extract-unmerged,您将获得所需的 .BASE.LOCAL.REMOTE 文件。

(或者您可以将 merge.conflictStyle 设置为 diff3 而不必为以上所有操作而烦恼,现在工作树文件具有您需要的所有信息。这就是我所做的。 )