Обновление общего раздвоенного репозитория с помощью 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/mybrancha+ 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при одновременном сжатии всех коммитов. В этом случае вы должны четко указать, откуда происходят эти изменения в сообщении фиксации.