Существуют ли инструменты слияния для контроля версий, которые понимают код? - PullRequest
11 голосов
/ 29 апреля 2009

Недавно я работал над большой базой кода, проводил рефакторинг и вообще улучшал дизайн для увеличения охвата. Кроме того, во многих файлах я удалил лишние операторы использования, переместил методы, чтобы схожие функции были близки друг к другу, добавил области и т. Д., Но фактически не изменил функциональность кода в файле.

Между тем, в других местах команды другие разработчики исправляют ошибки и изменяют строки кода здесь и там. Очевидно, что когда дело доходит до слияния, это может быть проблемой, так как номера строк больше не совпадают, и методы могут быть перемещены.

Теперь я понимаю общее правило, что в среде, управляемой источником, может быть опасно перемещать методы, и мы решили, что выгода перевесила стоимость. Однако я не понимаю, почему так должно быть.

Скажите, что мой исходный файл был простым калькулятором:

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, и тот факт, что метод изменил местоположение, не имеет значения, он все равно может сделать объединить работу.

Ответы [ 2 ]

4 голосов
/ 01 мая 2009

Наш подход с Plastic SCM еще далек от завершения, но он уже выпущен и может помочь в подобных ситуациях. Взгляните на Xmerge . Конечно, обратная связь будет приветствоваться и предоставит несколько бесплатных лицензий; -)

3 голосов
/ 29 апреля 2009

Я думаю, что Исходный код в базе данных - это один из возможных ответов на ваш вопрос. Основная идея заключается в том, что вы не версии файлов, а версии блоков кода. Система управления версиями знает о коде DOM и позволяет вам запрашивать код DOM для проверки функций, классов, что у вас есть, для редактирования, компиляции и т. Д.

Поскольку порядок методов не обязательно имеет значение, они не сохраняются в базе данных с учетом какого-либо порядка. Когда вы выбираете класс, вы можете указать порядок, который вам больше нравится (алфавитный, публичный / защищенный / приватный и т. Д.). Единственные изменения, которые имеют значение, это те, где вы переключаете + на -. У вас не будет конфликта из-за изменения порядка методов.

К сожалению, SCID все еще ОЧЕНЬ молод, и для него не так много инструментов. Тем не менее, это довольно интересная эволюция в способе просмотра и редактирования кода.

Редактировать: Вот еще одна ссылка для SCID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...