Я ищу систему контроля версий, которая способна определить, перемещена ли функция внутри файла. Например, есть этот файл "Foo.java", и он содержит функции "a ()", "b ()" и "c ()".
public class Foo
{
void a()
{
}
void c()
{
}
void b()
{
}
}
Теперь, если пользователь A изменит метод "c ()", чтобы он действительно что-то сделал:
void c()
{
System.out.println("Function c is called");
}
И пользователь B видит, что функции должны быть упорядочены по-разному, и перемещает «c ()» в «b ()»:
public class Foo
{
void a()
{
}
void b()
{
}
void c()
{
}
}
Теперь, если они оба перейдут в централизованное хранилище, я хочу, чтобы результат был:
public class Foo
{
void a()
{
}
void b()
{
}
void c()
{
System.out.println("Function c is called");
}
}
Теперь происходит конфликт, и либо пользователь A, либо пользователь B должны решить проблему вручную. По моему мнению, это должно быть обработано автоматически или должно отображаться каким-либо образом. Ручное разрешение не является проблемой, если файл «не такой большой», но файл, содержащий более 800 строк, не так ясен.
Теперь я протестировал git и mercurial, и оба не могут решить это так, как я хочу. Я использовал Subversion раньше и знаю, что это не обрабатывается и у меня есть некоторые недостатки для моего использования, поэтому я предпочитаю DVCS.
EDIT:
Чего я (в основном) пытаюсь добиться, так это сохранить историю функции. Я знаю, что Git, например, может показать историю определенных строк. Однако, если функция перемещается, можно легко спутать движение как источник функции. DVCS должно обнаружить это движение, так как оно должно знать историю, например, движение файла. Однажды Линус сказал, что нужно (в случае движения) только перемещать, а не изменять файл, чтобы Git мог «видеть» это движение. Я подумал, что Git может точно так же отслеживать движения кусков.