121 lines
6.1 KiB
Markdown
121 lines
6.1 KiB
Markdown
---
|
||
title: Сведения о слияниях поддеревьев Git
|
||
redirect_from:
|
||
- /articles/working-with-subtree-merge
|
||
- /subtree-merge
|
||
- /articles/about-git-subtree-merges
|
||
- /github/using-git/about-git-subtree-merges
|
||
- /github/getting-started-with-github/about-git-subtree-merges
|
||
- /github/getting-started-with-github/using-git/about-git-subtree-merges
|
||
intro: 'Если вам нужно управлять несколькими проектами в одном репозитории, можно использовать *слияние поддеревьев* для обработки всех ссылок.'
|
||
versions:
|
||
fpt: '*'
|
||
ghes: '*'
|
||
ghae: '*'
|
||
ghec: '*'
|
||
ms.openlocfilehash: eb50228a4e256b1511ff65d21ce855a2d765ad86
|
||
ms.sourcegitcommit: 5f40f9341dd1e953f4be8d1642f219e628e00cc8
|
||
ms.translationtype: MT
|
||
ms.contentlocale: ru-RU
|
||
ms.lasthandoff: 10/04/2022
|
||
ms.locfileid: '148008840'
|
||
---
|
||
## Сведения о слияниях поддеревьев
|
||
|
||
Как правило, слияние поддеревьев используется для хранения репозитория в репозитории. "Подрепозиторий" хранится в папке основного репозитория.
|
||
|
||
Лучший способ объяснить слияние поддеревьев — показать это на примере. Будет выполнено:
|
||
|
||
- Создание пустого репозитория с именем `test`, который представляет проект
|
||
- Слияние в него другого репозитория в виде поддерева с именем `Spoon-Knife`.
|
||
- Проект `test` будет использовать этот подпроект, как если бы он был частью того же репозитория.
|
||
- Получение обновлений из `Spoon-Knife` в проект `test`.
|
||
|
||
## Настройка пустого репозитория для слияния поддеревьев
|
||
|
||
{% data reusables.command_line.open_the_multi_os_terminal %}
|
||
2. Создайте новый каталог и перейдите в него.
|
||
```shell
|
||
$ mkdir test
|
||
$ cd test
|
||
```
|
||
3. Инициализируйте новый репозиторий Git.
|
||
```shell
|
||
$ git init
|
||
> Initialized empty Git repository in /Users/octocat/tmp/test/.git/
|
||
```
|
||
4. Создайте и зафиксируйте новый файл.
|
||
```shell
|
||
$ touch .gitignore
|
||
$ git add .gitignore
|
||
$ git commit -m "initial commit"
|
||
> [main (root-commit) 3146c2a] initial commit
|
||
> 0 files changed, 0 insertions(+), 0 deletions(-)
|
||
> create mode 100644 .gitignore
|
||
```
|
||
|
||
## Добавление нового репозитория как поддерева
|
||
|
||
1. Добавьте новый удаленный URL-адрес, указывающий на отдельный интересующий нас проект.
|
||
```shell
|
||
$ git remote add -f spoon-knife https://github.com/octocat/Spoon-Knife.git
|
||
> Updating spoon-knife
|
||
> warning: no common commits
|
||
> remote: Counting objects: 1732, done.
|
||
> remote: Compressing objects: 100% (750/750), done.
|
||
> remote: Total 1732 (delta 1086), reused 1558 (delta 967)
|
||
> Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done.
|
||
> Resolving deltas: 100% (1086/1086), done.
|
||
> From https://github.com/octocat/Spoon-Knife
|
||
> * [new branch] main -> Spoon-Knife/main
|
||
```
|
||
2. Выполните для проекта `Spoon-Knife` слияние в локальный проект Git. Это не изменяет файлы локально, но подготавливает Git к следующему шагу.
|
||
|
||
Если вы используете Git 2.9 или более поздней версии:
|
||
```shell
|
||
$ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main
|
||
> Automatic merge went well; stopped before committing as requested
|
||
```
|
||
|
||
Если вы используете Git 2.8 или более ранней версии:
|
||
```shell
|
||
$ git merge -s ours --no-commit spoon-knife/main
|
||
> Automatic merge went well; stopped before committing as requested
|
||
```
|
||
3. Создайте каталог с именем **spoon-knife** и скопируйте в него журнал Git проекта `Spoon-Knife`.
|
||
```shell
|
||
$ git read-tree --prefix=spoon-knife/ -u spoon-knife/main
|
||
```
|
||
4. Зафиксируйте изменения, чтобы обеспечить их безопасность.
|
||
```shell
|
||
$ git commit -m "Subtree merged in spoon-knife"
|
||
> [main fe0ca25] Subtree merged in spoon-knife
|
||
```
|
||
|
||
Хотя мы добавили только один подпроект, в репозиторий Git можно включить любое количество подпроектов.
|
||
|
||
{% tip %}
|
||
|
||
**Совет.** Если вы создадите новый клон репозитория в будущем, добавленные удаленные элементы не будут созданы. Вам придется снова добавить их с помощью [ команды `git remote add`](/github/getting-started-with-github/managing-remote-repositories).
|
||
|
||
{% endtip %}
|
||
|
||
## Синхронизация с обновлениями и изменениями
|
||
|
||
При добавлении подпроекта он не будет автоматически синхронизироваться с вышестоящими изменениями. Необходимо обновить подпроект с помощью следующей команды:
|
||
|
||
```shell
|
||
$ git pull -s subtree REMOTE-NAME BRANCH-NAME
|
||
```
|
||
|
||
В примере выше это будет выглядеть примерно так:
|
||
|
||
```shell
|
||
$ git pull -s subtree spoon-knife main
|
||
```
|
||
|
||
## Дополнительные материалы
|
||
|
||
- [Глава "Расширенное слияние" из книги _Pro Git_](https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging)
|
||
- [Практическое руководство по использованию стратегии слияния поддеревьев](https://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html)
|