Синхронизируйте два удаленных репозитория git с разными историями фиксации - PullRequest
0 голосов
/ 08 июля 2020

У меня есть два git удаленных репозитория в двух несвязанных облачных местах. Эти репозитории содержат разные истории фиксации.

  • Repo1 был создан первым, и мы сначала начали работать с ним.
  • Позже был создан Repo2, и все изменения, которые мы сделали в Repo1, были перенесены в Repo2 .

В итоге у нас появился новый код в Repo2 и другой новый код в Repo1. Но теперь мы хотим кодировать pu sh параллельно с обоими репозиториями.

Итак, мой вопрос:

  • Как нам получить истории фиксации обоих репозиториев в syn c, чтобы в дальнейшем мы могли продолжать нажимать на оба пульта одновременно, используя команду git pu sh, без особой боли?

1 Ответ

0 голосов
/ 09 июля 2020

Здесь задействованы три репо:

  1. Первое удаленное репо
  2. Второе удаленное репо
  3. Ваша локальная копия репо

Поскольку у вас может быть сочетание обоих репозиториев на локальном p c, я рекомендую переименовать это имя каталога репо в myrepo.backup или подобное и запустить fre sh, выполнив следующие действия:

  1. Клонировать из Repo1 в новый локальный каталог (клонировать все ветки, а не только мастер)
  2. Добавить Repo2 как новый пульт, чтобы в локальном репо было два пульта
  3. Получить все из Repo2.

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

  1. master - ваша локальная ссылка отслеживания
  2. Repo1/master - ссылка отслеживания удаленной главной ветки на Repo1
  3. Repo2/master - ссылка отслеживания удаленной главной ветки на Repo2

Если главная ветвь разошлась между двумя репозиториями, это может t выглядит примерно так:

o-o-o-o-o-o-o-o-o-o-o
       \   \-master  \- Repo1/master  
        \
         \o-o-o-o
                 \- Repo2/master

Примечание: у вас может быть больше, чем просто ветка master. Это предназначено для демонстрации примера только с одной веткой, но для каждой ветки необходимо будет принять одинаковые решения.

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

Вариант 1. Переименовать или пометить ветку из второго репо

Например, вы можете перемотать локальную master ветка для соответствия Repo1/master, а затем создайте локальную ветвь в том же коммите, что и Repo2/master, с другим именем, например master2, если вы хотите, чтобы обе истории продолжали существовать отдельно.

В качестве альтернативы, если вы хотите, чтобы альтернативная ветвь остановилась и больше не работала, просто добавьте тег вместо того, чтобы делать ее ветвью. Он по-прежнему будет pu sh в репо с правильной командой, но его тегирование может использоваться, чтобы указать, что это не живая ветвь, которую следует добавить (особенно если тег имеет что-то вроде END_OF_DUPLICATE_master)

Вариант 2: Объединить расходящиеся ветви

В качестве альтернативы вы можете объединить Repo2/master в Repo1/master, создав новую фиксацию, которая объединяет все изменения из Repo2 в главную ветку Repo1, но оставляет всю историю неповрежденными, и теперь у вас есть консолидированная главная ветвь.

Вариант 3: перебазировать расходящиеся ветви

Другой способ решить эту проблему - перебазировать главную ветвь Repo2 на главную ветвь Repo1 - с помощью или без раздавливания, в зависимости от того, хотите ли вы сохранить эту конкретную историю.

Промойте и повторите

Затем просто повторите то же решение для всех других существующих веток. Наконец, убедитесь, что у вас есть локальные ветки или теги, перемещенные вперед в последние коммиты и присутствующие для всех существующих веток, а затем pu sh все локальные ветки и теги возвращаются в оба репозитория, и они будут синхронизированы c 'd вверх.

Теперь, после всего сказанного, я действительно настоятельно рекомендую иметь только одно основное репо. Однако, если вам нужно отдельное репо из-за различий в разрешениях в отношении того, кто может получить доступ к каждому репо или чему-то в этом роде, я бы рассмотрел возможность использования механизма разветвления (доступного на Github, Gitlab и, я думаю, также на Bitbucket).

Кроме того, если это описание недостаточно ясно, поищите, как управлять работой в разветвленных репозиториях и как синхронизировать c вверх origin (вилка) с upstream (исходное репо), поскольку это более или менее похоже на то, что вы пытаетесь сделать.

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