2017-02-10 18 views
3

Мне нужно объединить два хранилища Git в новый, третий репозиторий. Я выполнил следующие инструкции, и они работают, но результат не тот, который я ожидал. Merge two Git repositories without breaking file historyОбъединить два хранилища Git и сохранить основную историю

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

Git Merge operation

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

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

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

Это мой слиты результат.

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

Painted solution!!

Как я попал в ток положение дел:

# 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 

Вся помощь приветствуется!

UPDATE: ОТВЕТ

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

Код:

# 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 

Одна проблема остается. Второе репо потеряет родительское представление. Я отправил последующий вопрос для этого: Merge two Git repos and keep the history

enter image description here

+1

Не могли бы вы объяснить более подробно, что вы ожидали и как это изменилось? –

+0

У вас есть все на одном хозяине, я не уверен, что вы подразумеваете под «aligned» - попробуйте удалить репозитории RepoA и RepoB из вашего локального, а затем посмотреть, как выглядит граф. – Adrian

+0

Я добавил «расписанное решение» –

ответ

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 

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

+0

Спасибо за правильный андер. Одна из незначительных проблем: перезагрузка RepoA заставляет меня потерять историю слияния. См. Изображение выше (я добавил текущий статус выше). Можно ли это сохранить? –

+0

@DimitriDewaele попробуйте опцию '--preserve-merges'' rebase' – Dunno

+0

Как отмечено в последующем вопросе @ DimitriDewaele, 'rebase' действительно не то, что вы хотите использовать для этого: http://stackoverflow.com/а/42457384/54249 – dahlbyk