Здесь задействованы три репо:
- Первое удаленное репо
- Второе удаленное репо
- Ваша локальная копия репо
Поскольку у вас может быть сочетание обоих репозиториев на локальном p c, я рекомендую переименовать это имя каталога репо в myrepo.backup
или подобное и запустить fre sh, выполнив следующие действия:
- Клонировать из
Repo1
в новый локальный каталог (клонировать все ветки, а не только мастер) - Добавить
Repo2
как новый пульт, чтобы в локальном репо было два пульта - Получить все из
Repo2
.
Когда вы получаете все, убедитесь, что вы создали ветки отслеживания для всех удаленных репозиториев, которые должны выглядеть примерно так:
master
- ваша локальная ссылка отслеживания Repo1/master
- ссылка отслеживания удаленной главной ветки на Repo1 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
(исходное репо), поскольку это более или менее похоже на то, что вы пытаетесь сделать.