git,用工具合并,而不是用工具解析
git, merge with a tool, instead of resolve with a tool
我来自 mercurial,我不知道如何使用 git。
在 mercurial 下,在合并过程中,冲突文件(基础、其他和本地)的每个版本都在我最喜欢的合并工具(kdiff3 或 meld)上并排显示。我合并它们,保存结果,大家都很高兴。
使用 git,我 git merge
如果发生冲突,我 git mergetool
...我得到的文件充满了像这样混乱的混乱:
first line
<<<<<<< HEAD
local line
=======
other line
>>>>>>> other-branch
last line
如何配置 git 在冲突发生之前 打开我最喜欢的合并工具 ?我想手动合并而不是手动解析:)
(初步说明:我不使用任何这些工具。相反,我将 merge.conflictStyle
设置为 diff3
,它在工作树文件中使用了稍微不同的标记格式。大多数有的时候直接在vim
就可以轻松解决,如果太乱,我有时会用git show
直接把三个输入提取出来,比如git show :1:<em>path</em>
。不过每个人不一样,所以看。)
How can I configure git to open my favorite merge tool before the conflict happens?
你不能。好吧,如果您编写自己的合并 策略 (相当于 git merge-recursive
),您可以做到这一点,但多年来没有人做过这种事情,因为它太难了。幸运的是,您 不需要:
I would like to merge manually instead of resolving manually :)
如果存在冲突,Git 将自己尝试合并到工作树文件中。1 这就是您在编辑器中看到的内容.但是 Git 在 Git 调用的地方留下了三个输入文件,分别是 index、staging area、和(现在很少)缓存。这是同一事物的三个名称:staging area 指的是您使用它的方式,而 cache 指的是它的各个内部方面和 index 是一种无意义的术语。在这种情况下,单词 "index" 可能是最好的,我将在这里使用它。
当您 运行 git mergetool
、Git 应该在 所有三个输入文件 加上第四个 ( Git's-attempt-at-merge with conflict markers) 工作树文件。然后,该工具可以向您显示这些不同输入中的部分或全部。然后,您可以使用该工具(无论该工具本身如何工作)手动进行解析,完全忽略 Git 的合并尝试,如果您愿意。
请注意,git mergetool
提供给您的合并工具的三个输入文件——合并基础、左侧或本地我们的 --ours
,以及右侧或远程或 --theirs
——只是临时文件文件。它们不会用作合并结果。 将 用作合并结果的文件,当您的合并工具返回 Git 表示合并已完成时,是主要的工作树文件:里面的混乱。所以你的工具必须用你的合并结果覆盖这个文件。
与 Mercurial 不同,核心 Git 没有内置合并工具(好吧,除了它自己的默认设置——它总是 运行 无论如何,作为您选择的合并策略的一部分-s
)。因此,您或为您设置 Git 发行版的人必须告诉 Git 如何 到 运行 任何特定的外部合并工具。每个 Git 安装 通常都会有一些预配置的外部合并工具,其中可能包含也可能不包含您想要的工具。如果您需要配置自己的外部合并工具,请参阅 Git on Windows: How do you set up a mergetool? (Despite the title, some of its answers are good on non-Windows systems. See CB Bailey's answer in particular。)
合并工具必须处理的四个名称作为环境变量提供:$BASE
命名合并基础文件(来自索引中的暂存槽 #1),$LOCAL
命名 --ours
文件(索引中的暂存槽 #2),$REMOTE
命名 --theirs
文件(暂存槽 #3),$MERGED
是 git mergetool
期望您的合并工具在您的合并工具向 git mergetool
脚本发出成功或失败信号之前更新。2
1请记住,Git 将文件的可用副本存储在工作树中,但实际上是从特殊的 Git 化格式构建提交存储(间接)在索引中的文件。在冲突合并期间,Git 只是将所有三个输入文件留在索引中,使用非零索引槽号。 Git 认为它自己解决的文件进入正常的槽零索引条目,清除非零槽,因此三个输入文件在这里不容易获得。 (在我看来,这是一个缺陷,但 Git 并没有问我的意见。技术上 Git 如果可以合并它们,甚至不会将文件的条目写入非零索引槽它处理文件时很简单。这可能是为了速度 and/or 懒惰。)
2您的工具应通过其 OS 级退出代码指示成功或失败。如果它这样做,并且您将此工具配置为 trustExitCode
设置为 true
,git mergetool
将知道是否自动 git add
$MERGED
文件。如果您将 trustExitCode
配置为 false
,git mergetool
将使用一些试探法来猜测是否相信该工具已成功合并文件。
我来自 mercurial,我不知道如何使用 git。
在 mercurial 下,在合并过程中,冲突文件(基础、其他和本地)的每个版本都在我最喜欢的合并工具(kdiff3 或 meld)上并排显示。我合并它们,保存结果,大家都很高兴。
使用 git,我 git merge
如果发生冲突,我 git mergetool
...我得到的文件充满了像这样混乱的混乱:
first line
<<<<<<< HEAD
local line
=======
other line
>>>>>>> other-branch
last line
如何配置 git 在冲突发生之前 打开我最喜欢的合并工具 ?我想手动合并而不是手动解析:)
(初步说明:我不使用任何这些工具。相反,我将 merge.conflictStyle
设置为 diff3
,它在工作树文件中使用了稍微不同的标记格式。大多数有的时候直接在vim
就可以轻松解决,如果太乱,我有时会用git show
直接把三个输入提取出来,比如git show :1:<em>path</em>
。不过每个人不一样,所以看
How can I configure git to open my favorite merge tool before the conflict happens?
你不能。好吧,如果您编写自己的合并 策略 (相当于 git merge-recursive
),您可以做到这一点,但多年来没有人做过这种事情,因为它太难了。幸运的是,您 不需要:
I would like to merge manually instead of resolving manually :)
如果存在冲突,Git 将自己尝试合并到工作树文件中。1 这就是您在编辑器中看到的内容.但是 Git 在 Git 调用的地方留下了三个输入文件,分别是 index、staging area、和(现在很少)缓存。这是同一事物的三个名称:staging area 指的是您使用它的方式,而 cache 指的是它的各个内部方面和 index 是一种无意义的术语。在这种情况下,单词 "index" 可能是最好的,我将在这里使用它。
当您 运行 git mergetool
、Git 应该在 所有三个输入文件 加上第四个 ( Git's-attempt-at-merge with conflict markers) 工作树文件。然后,该工具可以向您显示这些不同输入中的部分或全部。然后,您可以使用该工具(无论该工具本身如何工作)手动进行解析,完全忽略 Git 的合并尝试,如果您愿意。
请注意,git mergetool
提供给您的合并工具的三个输入文件——合并基础、左侧或本地我们的 --ours
,以及右侧或远程或 --theirs
——只是临时文件文件。它们不会用作合并结果。 将 用作合并结果的文件,当您的合并工具返回 Git 表示合并已完成时,是主要的工作树文件:里面的混乱。所以你的工具必须用你的合并结果覆盖这个文件。
与 Mercurial 不同,核心 Git 没有内置合并工具(好吧,除了它自己的默认设置——它总是 运行 无论如何,作为您选择的合并策略的一部分-s
)。因此,您或为您设置 Git 发行版的人必须告诉 Git 如何 到 运行 任何特定的外部合并工具。每个 Git 安装 通常都会有一些预配置的外部合并工具,其中可能包含也可能不包含您想要的工具。如果您需要配置自己的外部合并工具,请参阅 Git on Windows: How do you set up a mergetool? (Despite the title, some of its answers are good on non-Windows systems. See CB Bailey's answer in particular。)
合并工具必须处理的四个名称作为环境变量提供:$BASE
命名合并基础文件(来自索引中的暂存槽 #1),$LOCAL
命名 --ours
文件(索引中的暂存槽 #2),$REMOTE
命名 --theirs
文件(暂存槽 #3),$MERGED
是 git mergetool
期望您的合并工具在您的合并工具向 git mergetool
脚本发出成功或失败信号之前更新。2
1请记住,Git 将文件的可用副本存储在工作树中,但实际上是从特殊的 Git 化格式构建提交存储(间接)在索引中的文件。在冲突合并期间,Git 只是将所有三个输入文件留在索引中,使用非零索引槽号。 Git 认为它自己解决的文件进入正常的槽零索引条目,清除非零槽,因此三个输入文件在这里不容易获得。 (在我看来,这是一个缺陷,但 Git 并没有问我的意见。技术上 Git 如果可以合并它们,甚至不会将文件的条目写入非零索引槽它处理文件时很简单。这可能是为了速度 and/or 懒惰。)
2您的工具应通过其 OS 级退出代码指示成功或失败。如果它这样做,并且您将此工具配置为 trustExitCode
设置为 true
,git mergetool
将知道是否自动 git add
$MERGED
文件。如果您将 trustExitCode
配置为 false
,git mergetool
将使用一些试探法来猜测是否相信该工具已成功合并文件。