{"meta":{"title":"Сведения о слияниях поддеревьев Git","intro":"Если вам нужно управлять несколькими проектами в одном репозитории, можно использовать слияние поддеревьев для обработки всех ссылок.","product":"Начало работы","breadcrumbs":[{"href":"/ru/get-started","title":"Начало работы"},{"href":"/ru/get-started/using-git","title":"С помощью Git"},{"href":"/ru/get-started/using-git/about-git-subtree-merges","title":"Сведения о слияниях поддеревьев Git"}],"documentType":"article"},"body":"# Сведения о слияниях поддеревьев Git\n\nЕсли вам нужно управлять несколькими проектами в одном репозитории, можно использовать слияние поддеревьев для обработки всех ссылок.\n\n## Сведения о слияниях поддеревьев\n\nКак правило, слияние поддеревьев используется для хранения репозитория в репозитории. \"Подрепозиторий\" хранится в папке основного репозитория.\n\nЛучший способ объяснить слияние поддеревьев — показать это на примере. Будет выполнено:\n\n* Сделайте пустой репозиторий `test` , который представляет наш проект.\n* Слияние в него другого репозитория в виде поддерева с именем `Spoon-Knife`.\n* Проект `test` будет использовать этот подпроект, как если бы он был частью того же репозитория.\n* Получение обновлений из `Spoon-Knife` в проект `test`.\n\n## Настройка пустого репозитория для слияния поддеревьев\n\n1. Откройте <span class=\"platform-mac\">Терминал</span><span class=\"platform-linux\">Терминал</span><span class=\"platform-windows\">GIT Bash</span>.\n\n2. Создайте новый каталог и перейдите в него.\n\n   ```shell\n   mkdir test\n   cd test\n   ```\n\n3. Инициализируйте новый репозиторий Git.\n\n   ```shell\n   $ git init\n   > Initialized empty Git repository in /Users/octocat/tmp/test/.git/\n   ```\n\n4. Создайте и зафиксируйте новый файл.\n\n   ```shell\n   $ touch .gitignore\n   $ git add .gitignore\n   $ git commit -m \"initial commit\"\n   > [main (root-commit) 3146c2a] initial commit\n   >  0 files changed, 0 insertions(+), 0 deletions(-)\n   >  create mode 100644 .gitignore\n   ```\n\n## Добавление нового репозитория как поддерева\n\n1. Добавьте новый удаленный URL-адрес, указывающий на отдельный интересующий нас проект.\n\n   ```shell\n   $ git remote add -f spoon-knife https://github.com/octocat/Spoon-Knife.git\n   > Updating spoon-knife\n   > warning: no common commits\n   > remote: Counting objects: 1732, done.\n   > remote: Compressing objects: 100% (750/750), done.\n   > remote: Total 1732 (delta 1086), reused 1558 (delta 967)\n   > Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done.\n   > Resolving deltas: 100% (1086/1086), done.\n   > From https://github.com/octocat/Spoon-Knife\n   >  * [new branch]      main     -> Spoon-Knife/main\n   ```\n\n2. Выполните для проекта `Spoon-Knife` слияние в локальный проект Git. Это не изменяет файлы локально, но подготавливает Git к следующему шагу.\n\n   Если вы используете Git 2.9 или более поздней версии:\n\n   ```shell\n   $ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main\n   > Automatic merge went well; stopped before committing as requested\n   ```\n\n   Если вы используете Git 2.8 или более ранней версии:\n\n   ```shell\n   $ git merge -s ours --no-commit spoon-knife/main\n   > Automatic merge went well; stopped before committing as requested\n   ```\n\n3. Создайте каталог с именем **spoon-knife** и скопируйте в него журнал Git проекта `Spoon-Knife`.\n\n   ```shell\n   $ git read-tree --prefix=spoon-knife/ -u spoon-knife/main\n   > fatal: refusing to merge unrelated histories\n   ```\n\n4. Зафиксируйте изменения, чтобы обеспечить их безопасность.\n\n   ```shell\n   $ git commit -m \"Subtree merged in spoon-knife\"\n   > [main fe0ca25] Subtree merged in spoon-knife\n   ```\n\nХотя мы добавили только один подпроект, в репозиторий Git можно включить любое количество подпроектов.\n\n> \\[!TIP]\n> Если вы создадите новый клон репозитория в будущем, добавленные удаленные элементы не будут созданы. Вам придется снова добавить их с помощью [ команды `git remote add`](/ru/get-started/git-basics/managing-remote-repositories).\n\n## Синхронизация с обновлениями и изменениями\n\nПри добавлении подпроекта он не будет автоматически синхронизироваться с вышестоящими изменениями. Необходимо обновить подпроект с помощью следующей команды:\n\n```shell\ngit pull -s subtree REMOTE-NAME BRANCH-NAME\n```\n\nВ примере выше это будет выглядеть примерно так:\n\n```shell\ngit pull -s subtree spoon-knife main\n```\n\n## Дополнительные материалы\n\n* [Глава \"Расширенное слияние\" из книги *Pro Git*](https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging)\n* [Использование стратегии слияния поддерев](https://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html)"}