gpt4 book ai didi

Git merge : get conflicts as separate files for merge with external tool

转载 作者:行者123 更新时间:2023-12-03 08:57:52 25 4
gpt4 key购买 nike

当我 pull 时,我遇到了冲突,但像往常一样,冲突在冲突文件中被标记为内联。

我想将“我的”和“他们的”作为两个/三个单独的文件(.MINE、.THEIRS),以便我可以使用针对此文件类型的特殊工具来执行 merge 。

这可以用 git 实现吗?

最佳答案

是的。当 merge 因冲突而停止时,索引包含所有三个输入文件(不仅仅是 ourstheirs ,还有来自 merge 基础提交的基本版本)。

您一直在查看的工作树文件并不是 Git 真正关心的东西。 Git 会尽最大努力将索引中的三个输入写入工作树(这是 Git 真正关心的事情),而作为监督 merge 的人员,您的工作将随之而来得到正确的 merge 结果并将其填回到索引中。如果你能用 Git 在工作树中留下的困惑来做到这一点,那就太好了。如果没有...:

索引通常只有每个文件的一个副本。该副本位于“零槽”中,最初,它与您 checkout 的提交相匹配。

该文件的工作树副本可供使用,但 Git 并不真正使用它,除非您运行 git add <em>file</em> 。然后 Git 将文件的工作树副本复制到索引副本之上,以便索引副本再次与工作树副本匹配(并且可能不再与当前提交副本匹配)。

在 merge 期间,零槽副本最终出现在槽 2 ( --ours ) 中。来自 merge 基础的同一文件的副本进入插槽 1。来自另一个提交(您要 merge 的那个)的同一文件的副本进入插槽 3 ( --theirs )。 Git 尝试 merge 所有三个副本,如果 Git 自己成功,Git 会将 merge 后的版本放入槽零(并将其复制到工作树)并清空 merge 槽。如果 Git 失败,它会占用 merge 槽,而槽 0 为空。

因此,如果 Git 留下的工作树困惑不够好,您可以提取所有三个索引副本。手动执行此操作的方法是使用 git checkout-index ,但通常更简单(如果相当笨拙)的方法是使用 git mergetool .

The git mergetool command本质上是一个运行 git checkout-index 的大型 shell 脚本在每个尚未 merge 的文件的所有三个副本上,然后在这三个副本上运行您选择的任何命令。该命令应将正确的 merge 文件写入第四个文件:

... the configured command line will be invoked with $BASE set to the name of a temporary file containing the common base for the merge, if available; $LOCAL set to the name of a temporary file containing the contents of the file on the current branch; $REMOTE set to the name of a temporary file containing the contents of the file to be merged, and $MERGED set to the name of the file to which the merge tool should write the result of the merge resolution.

同样,所有这些临时文件都是由 git mergetool 创建的使用git checkout-index从索引中提取它们。当您的工具完成后,脚本将使用 git add关于$MERGED文件删除槽 1-3 条目并写入槽 0 条目。

上面出现短语如果可用是因为在一些极端情况下,由于一个文件丢失而发生了 merge 冲突。例如,当 newfile.ext 没有 merge 基础版本时,就会发生添加/添加冲突。 ,但两者 --ours--theirs 确实newfile.ext并且两个文件不匹配。在这里,基地将会消失; $LOCAL$REMOTE都会存在。当 file.ext 时发生修改/删除冲突存在于基本提交中,您( --ours )或他们( --theirs )更改了该文件,而你们/他们中的另一个删除了该文件。在这里,$BASE将存在,但仅 $LOCAL 之一或$REMOTE将会存在。

git mergetool shell script ,您可以复制并修改它 - 您将需要一些相邻的文件;从这里探索,它们应该是显而易见的 - 如果您想以某种方式更改其操作,而标志和工具配置尚不支持。

关于Git merge : get conflicts as separate files for merge with external tool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53652592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com