Из вашего нового репозитория добавьте удаленную ссылку на ваш старый репозиторий:
git remote add temp file:///path/to/old/repo/on/your/machine
Выборка из старого репозитория:
git fetch temp
Извлечение вашей основной ветки из старого репозитория:
git checkout temp/master -b wip
(wip обозначает незавершенное производство)
Перебазировать изменения поверх содержимого в вашем текущем хранилище:
git rebase master
Обновление мастерауказать на ваш новый HEAD:
git checkout master
git merge wip
Удалите удаленную ссылку на ваше старое репо и ветку wip, которую вы использовали:
git branch -d wip
git remote rm temp
Что вы на самом деле делаете:
Во-первых, добавляя удаленную ссылку и выбирая, вы извлекаете коммиты из вашего предыдущего репозитория, которых у вас еще нет в вашем текущем репозитории.Git знает, как это сделать, потому что, независимо от того, где и как это было сделано, один и тот же коммит везде выглядит одинаково.Это хэш SHA1 нескольких хорошо известных фрагментов информации, включая дерево каталогов, коммиттер, метку времени, ...
Поэтому, когда вы создаете новый репозиторий Git, основанный на том же репозитории SVN, всекоммиты имели одинаковые суммы SHA1.В результате новые коммиты, которые вы загрузили в ваш текущий репозиторий , продолжали указывать на нужные вещи .Это очень круто, и важно помнить.
Затем вы переключились на верхушку ветки master и сказали, чтобы она перебазировалась на ваш текущий master.Перебазировка, возможно, была ненужной, поскольку мастер из SVN, возможно, не отошел от мастера в вашем старом репо, но лучше было быть в безопасности.
Перебазировка находит ближайшую точку соприкосновения между двумя коммитамиработая в обратном направлении через свои истории, пока они оба не укажут на один родительский коммитЗатем он переключается на название ветви, которое вы ему дали (в данном случае master
), и вишня выбирает каждый из коммитов, отсутствующих в его истории, из вашей исходной ветви.После завершения он указывает ветвь, в которой вы находились, когда вы начали последний примененный коммит.
Наконец, слияние мастера с wip было просто для быстрой перемотки мастера до конца.Поскольку это была прямая линия, это было просто ускоренное движение вперед.Вы могли бы так же легко сделать ребаз или сброс --hard;любой из них изменил бы основную ветвь так, чтобы она указывала на правильное местоположение.Слияние было только самым безопасным из них, потому что, если бы случилось что-то странное, это дало бы вам понять, что это не просто перемотка вперед.