Обновление общего раздвоенного репозитория с помощью git
Рассмотрим репозиторий a репозиторий github, управляемый через Gerrit. Я клонировал репозиторий A и создал новую ветвь, начиная с главной ветви репозитория A. Я поместил эту новую ветвь в новый репозиторий gitlab B. Я администратор репозитория B и поделился ею с другими разработчиками. Разработчики не могут надавить на эту ветку,но я могу объединить их запросы на вытягивание. Я слил несколько запросов pull в главной ветви репозитория B. Итак, репозиторий B имеет начальные коммиты репозитория A и новые коммиты из пулл-реквест: Б совершает на вершине совершает (б).
Затем я хочу обновить репозиторий B новыми коммитами репозитория A. назовем эти коммиты a+.
Я вижу два варианта:
- если я объединю A на B, результат будет: a+ b a.
- Если я перебазирую B на A+, то результат будет: b a+ a.
Вариант 1: коммиты развития смешиваются с внешними. Сложно отлаживать и выделять отличия.
Вариант 2: I придется нажимать силой на изменения на пульте Б. последствия, если я не ошибаюсь, могут быть: 1. если разработчики потянут B и у них есть коммиты на локальном мастере B, они потеряют свои локальные изменения; 2. разработчики могут столкнуться с большими проблемами при перебазировании своих локальных ветвей после принудительного обновления ветви B.
Как я должен действовать, чтобы избежать каких-либо проблем?
1 ответ:
Если я правильно понял, у вас есть один (локальный) репозиторий, который выглядит примерно так:
A/master ↓ * -- * -- * -- a \ * -- * -- b ↑ B/mybranch
Теперь,
A
обновляется, так что это выглядит следующим образом:Обратите внимание, что у вас есть две расходящиеся ветви, которые не находятся на прямой линии. Поэтому говорить, что вы получитеA/master ↓ * -- * -- * -- a -- * -- * -- a+ \ * -- * -- b ↑ B/mybranch
a+ b a
при слиянииA
наB
, не правильно. Вы действительно получаете слияние, но это сохраняет историю такой, какая она есть:A/master ↓ * -- * -- * -- a -- * -- * -- a+ \ \ * -- * -- b --- M ↑ B/mybranch
Как вы можете видеть, у вас все еще есть информация, где коммиты пришли из: те, что между
Преимущество этого перед ребазингом-как вы сами заметили-заключается в том, что коммиты остаются такими, какие они есть. Все пользователи, которые взаимодействовали с любым из этих репозиториев, могут просто внести эти изменения без каких-либо проблем. Если вы перебазировали любой из этих коммитов, им придется вручную исправить это (скорее всего, они даже не осознают этого, поэтому они просто потянут и фактически создадут еще более запутанную историю с повторяющимися коммитами). Таким образом, слияние определенно лучше работать здесь. Да, история не будет выглядеть столь совершенной, как прямая линия, но она правильно передает то, что произошло: существует независимая линия развития, которая затем была обновлена с изменениями из вышестоящего репозиторияa
иa+
, пришли из одной ветви, а другие междуa
иb
пришли из другой. ИM
объединяет эти ветви ТРО. Как правило, это именно правильный способ решить эту проблему.A
. Этот информация может быть полезной, и поэтому имеет смысл держать ее в себе. И особенно если у вас есть пользователи, взаимодействующие с обоими этими пультами, они определенно предпочтут сохранить свой репозиторий совместимым с обоими пультами.Если вы не хотите, чтобы история выглядела так, и не заботитесь о совместимости с
A
, вы также можете раздавить все изменения изA
на вашB
:A/master ↓ * -- * -- * -- a -- * -- * -- a+ \ * -- * -- b -- [A] ↑ B/mybranch
Здесь
[A]
- это сжатый коммит, содержащий все изменения междуa
иa+
в одном коммите. Вы можете получить этот результат, перебазировавA
наB
при одновременном сжатии всех коммитов. В этом случае вы должны четко указать, откуда происходят эти изменения в сообщении фиксации.