我来自水银,有这个东西我不知道如何与git一起使用。
在商业上,在合并过程中,有冲突文件的每个版本(基础版本,其他版本和本地版本)在我最喜欢的合并工具(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:path
。)
如何配置git打开我喜欢的合并工具之前发生冲突?
你不能。好吧,如果您编写了自己的合并strategy(相当于Git: How configure KDiff3 as merge tool and diff tool),则可以,但是多年来,没有人做过这种事情,因为这太难了。幸运的是,您不需要需要:
我想手动合并,而不是手动解决:)
如果发生冲突,Git会尝试将其合并到工作树文件中。1这就是您在编辑器中看到的内容。但是Git将三个输入文件留在了Git调用的地方,分别是index,staging area和(现在很少是)cache。这是同一事物的三个名称:staging area是指您使用它的方式,而cache是指它的各个内部方面,而index是一种毫无意义的术语。在这种情况下,“索引”一词可能是最好的用法,我将在这里使用它。
运行 willgit merge-recursive
时,Git应该在所有三个输入文件上启动所选的合并工具,再加上第四个(带有冲突标记的Git尝试合并)工作树文件。然后,该工具可以向您显示这些各种输入中的一些或全部。然后,您可以使用该工具以其本身起作用的任何方式手动进行解析,如果愿意,可以<>。[请注意,git mergetool
提供给合并工具的三个输入文件(合并--ours
的基本,左或本地,以及右或远程或--theirs
)只是临时文件。它们将不会用作合并结果。当合并工具向Git指示完成合并时,将
git mergetool
选择的合并策略的一部分)。因此,您或为您设置Git发行版的某人必须告诉Git 如何
运行任何特定的外部合并工具。通常,每个Git installation都具有一组预先配置的外部合并工具,这些工具可能包含也可能不包含您想要的一个。如果您需要配置自己的外部合并工具,请参见-s
(尽管标题如此,但在非Windows系统上,它的某些答案很好。请参见Git on Windows: How do you set up a mergetool?。)您的合并工具必须处理的四个名称作为环境变量提供:CB Bailey's answer in particular命名合并基础文件(从索引中的暂存槽#1开始),$BASE
命名$LOCAL
文件(暂存槽#索引中的2),--ours
命名$REMOTE
文件(暂存槽#3),--theirs
是$MERGED
期望合并工具在成功或失败之前进行更新的文件的名称到git mergetool
脚本。2
1
请记住,Git在您的工作树中存储了文件的可用副本,但实际上是根据(间接)存储在索引中的特殊Git格式文件构建提交的。在发生冲突的合并期间,Git使用非零索引槽号将所有三个输入文件保留在索引中。 Git认为自己解决的文件会进入正常的零槽索引条目,从而消除了非零槽,因此此处三个输入文件不容易使用。 (在我看来,这是一个缺陷,但是Git并没有征求我的意见。从技术上讲,Git甚至不将文件的条目写入非零索引槽,只要它可以在处理文件时对其进行简单合并即可。这是可能是为了提高速度和/或懒惰。)2
您的工具应该通过其操作系统级别的退出代码来指示成功或失败。如果这样做,并且在将git mergetool
设置为trustExitCode
的情况下配置了此工具,则true
将知道是否自动git mergetool
git add
文件。如果将$MERGED
配置为trustExitCode
,false
将使用一些试探法来猜测是否认为该工具成功合并了文件。