Существуют ли какие-либо инструменты слияния для контроля версий, которые понимают код?

StackOverflow https://stackoverflow.com/questions/802504

  •  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 еще далек от «завершенности», но он уже реализован и может помочь в подобных ситуациях.Взгляни на Объединить.Конечно, отзывы будут более чем желательны и предоставят несколько бесплатных лицензий ;-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top