Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 当在同一位置添加不同的方法(等)时,如何避免合并冲突?_Git_Merge_Conflict_Git Merge Conflict - Fatal编程技术网

Git 当在同一位置添加不同的方法(等)时,如何避免合并冲突?

Git 当在同一位置添加不同的方法(等)时,如何避免合并冲突?,git,merge,conflict,git-merge-conflict,Git,Merge,Conflict,Git Merge Conflict,前言:这不是一个关于合并冲突的一般性问题,而是一个一直困扰我的非常具体的案例。这是相当琐碎的,但它确实是一个(轻微的)麻烦,往往足以脱颖而出。我不关心一般的合并,这只是为了节省几秒钟时间来解决机械的冲突,首先要避免上述冲突。我也绝对知道这不是一个“git问题”或类似的问题 也就是说,假设我们有一个类的源文件: class Xyz ... ... def last_method ... end end 这在master和几个功能分支中都是相同的。现在,在实

前言:这不是一个关于合并冲突的一般性问题,而是一个一直困扰我的非常具体的案例。这是相当琐碎的,但它确实是一个(轻微的)麻烦,往往足以脱颖而出。我不关心一般的合并,这只是为了节省几秒钟时间来解决机械的冲突,首先要避免上述冲突。我也绝对知道这不是一个“git问题”或类似的问题

也就是说,假设我们有一个类的源文件:

class Xyz
    ...
    ...
   def last_method
      ...
   end
end
这在
master
和几个功能分支中都是相同的。现在,在实现我们的功能时,我们将向此类添加更多方法:

分支机构1:

class Xyz
    ...
    ...
    def last_method
        ...
    end

    def new_method1
        ...
    end
end
分支机构2:

class Xyz
    ...
    ...
    def last_method
        ...
    end

    def new_method2
        ...
    end
end
当两个分支合并回
master
时,新方法没有关联,它们将愉快地共存

显然,这将导致合并冲突。原因很清楚——我们在完全相同的位置更改了源文件,显然git不能(也不应该)神奇地为我们判定这不是“真正的”冲突;git必须选择哪些方法应该放在第一位,等等

避免冲突的一种方法是在文件中的不同位置插入新方法(假设顺序无关紧要),但我们真的不想花太多精力(或者根本不想花太多精力)在思想上跟踪在哪里插入内容或在其他特性中发生了什么


那么,问题是:是否有另一种方法,可能是某种编码约定,可以定期应用,以某种方式避免这种合并冲突

这是个好问题。然而,在某些情况下,有一些方法可以缓解这个问题

在理想情况下,在设计一个类时,您可以决定它将由什么组成(变量、方法等),并且已经可以为它们选择合适的名称。在这种情况下,您应该在引入类的提交中编写这些方法的存根

然后,这些存根将充当基于行的版本控制系统(如Git:

class-MyClass
def初始化
#待办事项
结束
def获取\u ID
#待办事项
结束
def set_ID
#待办事项
结束
结束

在这个“第一次”提交之后,不同的贡献者可以自由地更改不同方法的主体:在我的示例中,Alice可以实现
get\u ID
,Bob可以实现
set\u ID
,而不必担心在将来遇到合并冲突,因为每个方法的
def
end
行已经存在于原始提交中。

感谢您的回答,我感谢您提到“在某些条件下”。不幸的是,这些都不适用——在我的例子中,这是敏捷/BDD驱动的开发,而我们所做的恰恰相反;i、 例如,我们没有未使用的占位符代码,甚至没有空方法的“todo”实现(至少在
master
中没有)。作为一个人,很容易看出,由不同贡献者添加的不同方法不应该导致合并冲突,但从diff3算法来看,它不够复杂,无法检测到这一点;就其而言,在同一位置添加的不同行=>冲突。