Как я могу управлять файлами в двух измерениях, используя Git? - PullRequest
0 голосов
/ 23 октября 2018

Проблема

Вот что я подразумеваю под "двумя измерениями": обычно Git отслеживает изменения в коллекции файлов с течением времени (время = одно измерение).

Что бы я хотелчтобы сделать, это иметь поток «шагов», которые представлены дискретно, и эти шаги также отслеживаются с течением времени.

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

Я хочу отследить учебник по кодированию как Git-репозиторий, отслеживающий несколько «версий» одного и того же кода.Учебное пособие является накопительным, каждый шаг основывается на коде из предыдущего шага.

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

Шаг 1

  • создает файл Foo

Шаг 2

  • обновляет файл Foo
  • создает файл Bar

Шаг 3

  • Обновление файла Bar

В любой момент я хотел бы иметь возможность оформить заказ на произвольный«шаг» в учебнике.

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

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

Текущее решение

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

В настоящее время я использую ветвь для каждого «шага», поэтому у меня есть такие ветки, как это:

  • master
  • step-1
  • step-2
  • step-3
  • etc

У меня естьскрипт, который я запускаю всякий раз, когда обновляю ветку, которая выглядит следующим образом:

git checkout step-1 && git rebase master && git checkout step-2 && git rebase step-1 ...

Вы поняли идею.Я использую Git для отслеживания ветвей с течением времени (первое измерение) и использую сценарий для управления моим вторым измерением (каскадные изменения между ветвями в определенном порядке).

В настоящее время проблема заключается в том, что я сталкиваюсь с конфликтами слияния довольночасто, и я волнуюсь, что из-за перебазировки репо будет трудно обнародовать.

Есть ли лучший / более элегантный подход к решению этого варианта использования?

1 Ответ

0 голосов
/ 24 октября 2018

Интересный вопрос!

В настоящее время проблема в том, что я часто сталкиваюсь с конфликтами слияния

Обойти это невозможно.У инструмента недостаточно информации, чтобы разобраться, как это сделать автоматически.Если вы идете по этому пути, старайтесь держать дельты очень маленькими, даже если это означает больше коммитов.

Кроме того, вместо использования веток для этого вы можете создать программу, которая знает, как создавать каждый шаг / документиз минимального набора информации.Например, т.е. скрипт, который применяет дельты / различия или аналогичные.Тем не менее, я не думаю, что вы сможете дать много дополнительной эвристики / знаний, чтобы избежать того же порядка конфликтов, что и с вашим решением;учитывая тип текста, о котором мы говорим (код, т. е. много перемешивается в учебнике по кодированию), но это может быть хорошим решением для других видов текстов / проектов.

Теперь я думаю, что лучше(и самое простое) - хранить шаги независимо в разных папках, но сохраняет разность шагов, записанных в вашем репозитории Git.Теперь, когда вы собираетесь внести изменения, вы можете легко проверить, правильно ли вы обновили все шаги, проверив diff различий .Сделайте пару небольших скриптов для автоматизации этих сравнений / обновлений, и все готово.Взгляните на range-diff из последних версий Git, чтобы увидеть, как выглядит diff of diff и как его раскрасить.

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