Git с двумя версиями в качестве веток

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

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

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

Как я могу синхронизировать две практически одинаковые ветви, не теряя при этом уникальных изменений?

Я прочитал несколько постов на похожие темы, но ни одна из них не подходит для моей ситуации:

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

1 ответ

Решение

Обычной практикой является создание ветки темы для ваших добавочных изменений на основе ветки, которая наиболее подходит для разработки конкретной темы / функции / исправления. Затем ветка темы объединяется с вашими ветками и удаляется. Слияние не перезапишет вашу историю, напротив, все будет там, полностью сохранено.

                    /-- * -- * -- * -- A
*-- old history -- * 
                    \-- * -- * -- * -- * -- B

Как вы описали, предполагается, что A а также B никогда не сольется в будущем. Когда вам нужно добавить функцию, вы выбираете либо A, либо B, в зависимости от того, что более естественно для данного конкретного случая, и развиваетесь там:

                                   /-- * -- * -- * -- C
                    /-- * -- * -- * -- A
*-- old history -- * 
                    \-- * -- * -- * -- * -- B

Затем объедините C с A и B и отбросьте его:

                                   /-- * -- * -- * -- C --\
                    /-- * -- * -- * ----------------------*[merge] -- A
*-- old history -- * 
                    \-- * -- * -- * -- ..               --*[merge] -- B

(Я упустил свой шанс взять уроки ASCII по искусству у Анри Матисса.)

Вот что-то очень простое:

$ git checkout A
$ git branch C
$ git checkout C
$ develop.sh 24h commit commit commit
$ git checkout A
$ git merge C
$ git checkout B
$ git merge C
$ git branch --delete C

Теперь вы сможете увидеть намного более приятное искусство ASCII, выполнив: $ git log --oneline --graph. Вы увидите, что слияние не разрушило вашу историю. Конечно, вам не нужно - граф для этого, он также виден просто git log,

Другие вопросы по тегам