DVCS detecta el movimiento del bloque de código

Estoy buscando un sistema de control de versiones que pueda detectar si una function se mueve dentro de un file. Por ejemplo, existe este file "Foo.java" y contiene la function "a ()", "b ()" y "c ()".

public class Foo { void a() { } void c() { } void b() { } } 

Ahora, si el usuario A cambia el método "c ()" para realmente hacer algo:

  void c() { System.out.println("Function c is called"); } 

Y el usuario B ve que las funciones deben orderarse diferente y mueve "c ()" debajo de "b ()":

 public class Foo { void a() { } void b() { } void c() { } } 

Ahora, si ambos presionan al repository centralizado, quiero que el resultado sea:

 public class Foo { void a() { } void b() { } void c() { System.out.println("Function c is called"); } } 

Ahora lo que sucede es que ocurre un conflicto y el usuario A o el usuario B tiene que hacer una resolución manual. En mi opinión, esto debería ser manejado automáticamente o debería mostrarse de alguna manera. Una resolución manual no es un problema si el file "no es tan grande", pero un file que contiene más de 800 líneas no es tan claro.

Ahora probé git y mercurial y no puedo resolverlo de la manera que quiero. He usado subversión antes y sé que esto no se maneja y tiene algunas deficiencias más para mis usos, así que prefiero un DVCS.

EDITAR: Lo que (principalmente) trato de lograr es preservar el historial de una function. Sé que Git, por ejemplo, puede mostrar el historial de ciertas líneas. Sin embargo, si se mueve una function, se puede confundir fácilmente el movimiento como el origen de la function. El DVCS debe detectar este movimiento ya que debe conocer la historia, como el movimiento de un file. Linus dijo una vez que uno debería (en caso de movimiento) moverse y no modificar un file, para que Git pueda "ver" el movimiento. Pensé en Git tal vez ser capaz de rastrear los movimientos de los trozos de la misma manera.

Como Mark ya dijo, no es un problema de SCM per se, sino que se usa en la herramienta Merge-Compare, que todos están (más o less) orientados al estilo diff (es decir, trabajan con cadenas , no bloques lógicos de código )

No puedo decir nada acerca de lo mencionado en la herramienta de diferencias (Linux) que reconoce el movimiento de bloques BeyondCompare, pero en Windows-world CompareIT! detectar perfectamente (y mostrar) bloques movidos de cadenas (y, hasta cierto punto , movidos y cambiados por dentro ligeramente). Pero:

  • ¡Comparelo! costos (algunos) dinero
  • No se actualiza mucho time (desde noviembre de 2010)
  • No se puede trabajar para la combinación de 3 vías (solo difusor de 2 paneles)

También escuché algunos rumores de que Conflict Solver en SmartSVN Professional también es capaz de detectar bloques de código movidos