Объедините два репозитория Git и сохраните основную историю

Мне нужно объединить два репозитория Git в новый, третий репозиторий. Я выполнил следующие инструкции, и они работают, но результат не такой, как я ожидал. Объединить два репозитория Git без нарушения истории файлов

Посмотрите на это:

Операция слияния Git

Мастер не выровнен.

  • Можно ли объединить все на одном мастере?
  • Хотелось бы иметь чистую историю на мастере.

Вы можете использовать мой репозиторий примеров на GitHub:

Это мой объединенный результат.

Это ситуация, которую я хотел бы иметь: (раскрашенное решение!!!)

Окрашенное решение!!

Как я пришел к текущей ситуации:

# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init

# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
dir > Read.md
git add .
git commit -m "initial commit"

# Add a remote for and fetch the old RepoA
git remote add -f RepoA https://github.com/DimitriDewaele/RepoA

# Merge the files from RepoA/master into new/master
git merge RepoA/master --allow-unrelated-histories

# Do the same thing for RepoB
git remote add -f RepoB https://github.com/DimitriDewaele/RepoB

# Merge the files from RepoB/master into new/master
git merge RepoB/master --allow-unrelated-histories

Любая помощь приветствуется!

ОБНОВЛЕНИЕ: ОТВЕТ

Правильный ответ - перебазировать вместо слияния.

Код:

# Rebase the working branch (master) on top of repoB
git rebase RepoB/master

# Rebase teh working branch (master with RepoB) on top op repoA
git rebase RepoA/master

Остается одна проблема. Второй репо теряет родительский вид. Я разместил дополнительный вопрос для этого: Объединить два репозитория Git и сохранить история

введите здесь описание изображения


person Dimitri Dewaele    schedule 10.02.2017    source источник
comment
Можете ли вы объяснить более подробно, что вы ожидали и чем это отличается?   -  person Josh Lee    schedule 10.02.2017
comment
У вас все на одном мастере, я не уверен, что вы имеете в виду под выравниванием - попробуйте удалить удаленные RepoA и RepoB с вашего локального сервера, а затем посмотрите, как выглядит график.   -  person Adrian    schedule 10.02.2017
comment
Я добавил «окрашенный раствор»   -  person Dimitri Dewaele    schedule 10.02.2017


Ответы (1)


Это просто: вместо слияния используйте rebase. Предполагая, что вы хотите сначала сделать repoA/master (после извлечения и добавления пультов)

# starting on master
git rebase RepoB/master # place master on top of masterB
git rebase RepoA/master # place master (with masterB) on top of masterA

Обратите внимание, что перебазирование потенциально разрушительно и поначалу немного не интуитивно понятно, поэтому я настоятельно рекомендую сначала прочитать о них (документация SO в приведенной выше ссылке — хорошее место для начала).

person Dunno    schedule 10.02.2017
comment
Спасибо за правильный ответ. Одна небольшая проблема: перебазирование RepoA приводит к потере истории слияния. См. изображение выше (я добавил текущий статус выше). Можно ли сохранить это? - person Dimitri Dewaele; 13.02.2017
comment
@DimitriDewaele попробуйте вариант --preserve-merges из rebase - person Dunno; 13.02.2017
comment
Как отмечено в последующем вопросе @DimitriDewaele, rebase на самом деле не то, что вы хотите использовать для этого: stackoverflow.com/a/42457384 /54249 - person dahlbyk; 25.02.2017