Существуют ли какие-либо инструменты слияния для контроля версий, которые понимают код?
-
03-07-2019 - |
Вопрос
Недавно я работал над большой базой кода, проводил рефакторинг и в целом улучшал дизайн для увеличения охвата.Кроме того, во многих файлах я удалил лишние операторы using, переместил методы так, чтобы схожие функциональные возможности были ближе друг к другу, добавил регионы и т. д.но фактически не изменил функциональность кода в файле.
Тем временем в других частях команды другие разработчики исправляют ошибки и меняют строки кода тут и там.Очевидно, что когда дело доходит до слияния, это может стать проблемой, поскольку номера строк больше не совпадают, а методы могут быть перемещены.
Теперь я понимаю общее правило, согласно которому в среде с контролем исходного кода перемещение методов может быть опасным, и мы решили, что польза перевешивает затраты.Однако я не понимаю, почему так должно быть.
Предположим, что мой исходный файл представлял собой простой калькулятор:
public class Calculator
{
public int Subtract(int a, int b)
{
return a + b;
}
public int Add(int a, int b)
{
return a + b;
}
}
И я решил, что хочу, чтобы методы были в алфавитном порядке:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a + b;
}
}
Пока другой разработчик исправил ошибку в методе вычитания
public class Calculator
{
public int Subtract(int a, int b)
{
return a - b;
}
public int Add(int a, int b)
{
return a + b;
}
}
Стандартный инструмент слияния, вероятно, потребует от вас объединить эти два файла вручную, но тот, который понимает функциональность части кода легко сможет согласовать эти два изменения.То же самое относится к удалению или добавлению других методов, комментариев, регионов или операторов использования.
Итак, чтобы (наконец-то!) добраться до вопроса:Существуют ли какие-либо инструменты слияния, которые разумно понимают функциональность кода и могут объединить два вышеуказанных файла без какого-либо вмешательства человека?Если нет, то почему?Есть ли какие-либо сложности, которые делают эту проблему неразрешимой (конечно, я понимаю, что это не так просто, как я предполагаю, но разве это невозможно по какой-то причине, которую я не вижу?)
В своем исходном коде я использую C#, и мне бы хотелось, чтобы с ним работало что-то, но мне интересно, существует ли это где-нибудь в мире программирования...
Меня уже очень беспокоит длина этого вопроса, но я отредактировал его, чтобы добавить, как я ожидаю, что будет работать интеллектуальная исходная система:
Когда исходный файл калькулятора был проверен, система проанализировала файл и создала иерархию классов:
File: Calculator.cs
|
|--Class[0]: Calculator
|
|--Method[0]: Subtract
|
|--Line[0]: return a + b;
|
|--Method[1]: Add
|
|--Line[0]: return a +b;
(С дополнительными линиями для скобок и т. д.)
Когда я проверяю свой код (располагая методы в алфавитном порядке), он обновляет приведенную выше иерархию, так что Subtract становится Method[1], а Add становится Method[0].
Второй разработчик проверяет свой код (который, как известно системе управления версиями, основан на оригинале) и замечает изменение в первой строке в вычитании.Теперь вместо того, чтобы искать этот номер построчно в общем файле, он знает, что может найти его в Calculator.cs/Calculator/Subtract/0, и тот факт, что метод изменил местоположение, не имеет значения, он все равно может сделать объединить работу.
Решение
я думаю что Исходный код в базе данных это один из возможных ответов на ваш вопрос.Общая идея заключается в том, что вы не версионируете файлы, вы версионируете блоки кода.Система управления версиями знает о DOM кода и позволяет вам запрашивать DOM кода, чтобы проверить функции, классы и все, что у вас есть, для редактирования, компиляции и т. д.
Поскольку порядок методов не обязательно имеет значение, они не сохраняются в базе данных без учета порядка.Просматривая класс, вы можете указать тот порядок, который вам больше нравится (в алфавитном порядке, общедоступный/защищенный/частный и т. д.).Единственные изменения, которые имеют значение, — это то, как вы переключаете +
к -
.У вас не будет конфликта из-за изменения порядка методов.
К сожалению, SCID еще ОЧЕНЬ молод, и для него не так много инструментов.Однако это довольно интересная эволюция в способах просмотра и редактирования кода.
Редактировать: Вот еще одна ссылка на SCID
Другие советы
Наш подход к Plastic SCM еще далек от «завершенности», но он уже реализован и может помочь в подобных ситуациях.Взгляни на Объединить.Конечно, отзывы будут более чем желательны и предоставят несколько бесплатных лицензий ;-)