git上更智能的冲突解决程序

git上更智能的冲突解决程序,git,version-control,merge,merge-conflict-resolution,Git,Version Control,Merge,Merge Conflict Resolution,有时我对合并的结果有点失望,git似乎无法自动解决简单的冲突,所以我想一定是我遗漏了什么,设置错误,或者可能有一种方法可以将git配置为在冲突解决方面更“积极” 例如,我添加了我的合并工具(P4Merge)的这张图片,其中有一个冲突: 更大的版本 左侧的文件修改了两条原始(中心)线。右边的文件只是在两个原始行之间添加了一行 它们是完全独立的变更,但由于它们以某种方式在一起,git引发了冲突 很容易想象这会是一个真正的冲突,但大多数时候我认为这会生成一个编译错误,我更愿意修复这个错误,而不是合并

有时我对合并的结果有点失望,git似乎无法自动解决简单的冲突,所以我想一定是我遗漏了什么,设置错误,或者可能有一种方法可以将git配置为在冲突解决方面更“积极”

例如,我添加了我的合并工具(P4Merge)的这张图片,其中有一个冲突:

更大的版本

左侧的文件修改了两条原始(中心)线。右边的文件只是在两个原始行之间添加了一行

它们是完全独立的变更,但由于它们以某种方式在一起,git引发了冲突

很容易想象这会是一个真正的冲突,但大多数时候我认为这会生成一个编译错误,我更愿意修复这个错误,而不是合并冲突


我将我的合并工具配置为忽略行尾和所有空格差异,并且我有
autocrlf=true
,但可能git在合并时没有忽略空格差异,并且会出现类似这样的愚蠢冲突。有没有办法调整git处理冲突解决的方式?

我不认为有任何系统基本上会忽略冲突(尽管如果合并时不解决冲突,svn会将冲突文件中的两个更改都保留下来,因此文件中有差异标记)

如果您想在事后解决冲突,是否可以将git配置为执行相同的操作-即忽略冲突


我想说的是,这不是您真正想要做的事情,冲突应该立即得到解决,因为您永远不知道代码会引发编译错误,如果忽略它们,某些更改将不会发生。最好在合并时修复它们,这样可以看到两个方面。

正如我看到的,您可以用两种不同的方式修改同一个文本块。这就是冲突。您可以尝试使用
git mergetool-y-t mymagicmergetool
并使用magic冲突解决工具自动解决所有冲突

很容易想象这会是一场真正的冲突

你说得对。无论您对两个原始行做了什么更改,都可能需要对它们之间添加的行进行更改

<<<<<<<<<<<<<
    if ( g->tag == mark 
      || g->tag == error ) {
||||||||||||||
    if ( tag == mark
      || tag == error ) {
==============
    if ( tag == mark 
      || tag == release
      || tag == error ) {
>>>>>>>>>>>>>>
>>>>
我怀疑一个工具会自动合并这些,即使它99%的时间是正确的


您可以重播合并的长期历史并比较性能,显示自动合并在何处产生与普通自动合并不同的结果。这应该不会太难,一次保存冲突的文件,两次保存后再进行猜测。很抱歉,我不清楚,我不希望它忽略冲突,我希望它自动解决此冲突。看,在这个特殊的例子中,它可以通过什么都不做来解决问题,因为在同一条线上没有冲突发生,而且这种情况经常发生。也许你想试试化石。记住,合并算法是愚蠢的,它们不知道这个冲突是否可以自动合并,因为它取决于您可以看到的上下文信息,但计算机不可能理解。想象一下,如果我给你3行合并的威尔士语,你将无法判断它们是否有效,因此无法在没有帮助的情况下合并它们。对于计算机来说,这也是同样的问题。可能有一种工具可以使用编译器检查其自动哑合并是否生成可编译代码。不过,这并不能解决可编译冲突被错误解决的问题。Fossil有什么不同之处可以提供帮助?@Roberto Fossil的主要优点是自动合并,它可以更容易地与上游同步-因此你没有过时的本地分支,这是合并问题的根源-合并一开始通常很容易,但是你离开一个分支的时间越长,合并就越困难,因为它从主干中分离出来。不管别人怎么说,合并没有什么灵丹妙药。(是的,有-您可以锁定、编辑和提交,但这不是团队的最佳工作流)