Слияние двух репозиториев GitHub без потери истории коммитов

Копирование файлов переносит содержимое, но не делает коммиты исходного проекта предками новой ветки. Чтобы сохранить историю, нужно объединить два графа коммитов через обычное слияние.

Подготовка

Работайте в отдельных резервных клонах с чистым рабочим деревом. В исходном репозитории создайте подготовительную ветку и перенесите нужные отслеживаемые файлы в отдельный подкаталог с помощью git mv. Перед переносом проверьте перечень отслеживаемых файлов командой git ls-files, включая скрытые. Каталог .git переносить нельзя. Приведённые далее пути — примеры, подставьте свои значения.

git switch -c prepare-import
mkdir -p imports/source
git mv path/to/tracked-file imports/source/
git commit -m "Prepare source paths"

Импорт в целевой репозиторий и слияние истории

В целевом репозитории создайте ветку для импорта, добавьте исходный репозиторий как удалённый (в качестве локального пути или URL), получите ветку подготовки и выполните слияние, позволяющее объединить несвязанные истории.

git switch -c import-source
git remote add import-src /ABS/PATH/TO/PREPARED-CLONE
git fetch import-src
git merge --no-ff --allow-unrelated-histories import-src/prepare-import

Если возникнут конфликты, слияние приостановится. Проверьте состояние с помощью git status, вручную разрешите конфликты в файлах, затем добавьте изменения и выполните завершение merge-коммита.

# после разрешения конфликтов
git add <файлы>
git commit

Проверка результата

Убедитесь, что ветка импортированной подготовки стала предком текущей ветки и что история объединена. Для проверки используйте команды ниже; дополнительно просмотрите граф истории и содержимое файлов вручную.

git merge-base --is-ancestor import-src/prepare-import HEAD
git log --all --graph --oneline

Обратите внимание: при дальнейшем приёме изменений через pull request сохраняйте merge-историю. Операция squash сведёт набор коммитов в один и приведёт к потере детальной истории. Не удаляйте исходный репозиторий, пока не убедитесь в корректности результата.

Этот метод сохраняет исходные коммиты, перемещая их в подпапку и объединяя графы, что делает историю обоих репозиториев доступной в целевом репозитории.