Git с двумя версиями в качестве веток
У меня есть проект с двумя отдельными версиями. Каждая версия находится в другой ветке, и они никогда не будут объединены. Большая часть кода равна, но каждая ветвь имеет свои уникальные части. Теперь мне нужно получить почти каждый коммит в обе ветви.
В настоящее время я использую вишневый сбор для этого: я переключаюсь на другую ветку и выбираю все коммиты, которые мне нужны.
Мне не нравится, как я это делаю. Требуется некоторое время, чтобы выбрать каждый коммит, и я могу пропустить его.
Как я могу синхронизировать две практически одинаковые ветви, не теряя при этом уникальных изменений?
Я прочитал несколько постов на похожие темы, но ни одна из них не подходит для моей ситуации:
- Как синхронизировать две ветки в одном репозитории Git?
- Как сохранить долго работающие ветки Git
- Как сохранить ветку 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
,