Mercurial中自动合并的安全性如何?

Lór*_*tér 7 merge mercurial

在Mercurial中,可以使用fetch扩展来模拟类似的东西svn update,即与传入的更改合并而不用查看它们.但即使你不使用hg fetch,你的大多数合并都将"奇迹般地"工作而不会导致冲突.这很好,但是相信Java代码的有效合并是多么安全?

是否有任何示例来说明为什么或何时应该(或不应该)信任这些合并?

giz*_*zmo 3

好吧,只要您不开始重新组织代码,它们就非常安全。

考虑以下示例:

class A {

   public void methodA() {
     // do something here 
     // that should be great
   }

   public void methodB() {
     // And now I'll 
     // do something here
     // and it's gonna be good.
   }

   public void methodC() {
     // Finally, let's 
     // do something here
   }

}
Run Code Online (Sandbox Code Playgroud)

现在,您开始工作并决定向 methodC 添加一些指令。
在此期间,一位同事决定,无论出于何种原因,methodC 都应该放在类的顶部。

您最终将得到两个要合并的版本。
你的:

class A {

   public void methodA() {
     // do something here 
     // that should be great
   }

   public void methodB() {
     // And now I'll 
     // do something here
     // and it's gonna be good.
   }

   public void methodC() {
     // Finally, let's 
     // do something here
     // and here your marvelous changes
   }

}
Run Code Online (Sandbox Code Playgroud)

还有你的同事:

class A {

   public void methodC() {
     // Finally, let's 
     // do something here
   }

   public void methodA() {
     // do something here 
     // that should be great
   }

   public void methodB() {
     // And now I'll 
     // do something here
     // and it's gonna be good.
   }

}
Run Code Online (Sandbox Code Playgroud)

当合并发生时,由于默认上下文是三行宽,自动合并可能会认为有效结果是这样的:

class A {

   public void methodC() {
     // Finally, let's 
     // do something here
   }

   public void methodA() {
     // do something here 
     // that should be great
   }

   public void methodB() {
     // And now I'll 
     // do something here
     // and it's gonna be good.
   }

   public void methodC() {
     // Finally, let's 
     // do something here
     // and here your marvelous changes
   }

}
Run Code Online (Sandbox Code Playgroud)

出于这个原因,如果可能的话,我尝试保持方法的组织性,以便访问器被分组,并且不受影响,私有按通用逻辑分组,等等......但这并不总是可能的。

希望这种情况很少见,如果有太多更改,mercurial 会要求您手动合并类。

  • 您唯一可以确定的(或者尽可能确定静默合并是可以的)是代码已合并。您可能仍然没有可编译的代码。例如,我可能会在某个地方添加一个新函数,而您可能会在其他地方添加一个具有相同名称的类似函数,而不与我的添加冲突。这将合并,但不会编译。 (2认同)