{"meta":{"title":"Sobre mesclagens de subárvore do Git","intro":"Se precisar gerenciar vários projetos em um único repositório, você pode usar um subtree merge para manipular todas as referências.","product":"Introdução","breadcrumbs":[{"href":"/pt/get-started","title":"Introdução"},{"href":"/pt/get-started/using-git","title":"Usar o Git"},{"href":"/pt/get-started/using-git/about-git-subtree-merges","title":"Sobre mesclagens de subárvore do Git"}],"documentType":"article"},"body":"# Sobre mesclagens de subárvore do Git\n\nSe precisar gerenciar vários projetos em um único repositório, você pode usar um subtree merge para manipular todas as referências.\n\n## Sobre mesclagens de subárvore\n\nNormalmente, um merge de subárvore é usado para conter um repositório dentro de outro repositório. O \"sub-repositório\" é armazenado em uma pasta do repositório principal.\n\nA melhor maneira de explicar merges de subárvore é mostrar com exemplo. Nós faremos:\n\n* Criar um repositório vazio chamado `test` que representa o projeto.\n* Mesclar outro repositório nele como uma subárvore chamada `Spoon-Knife`.\n* O projeto `test` usará esse subprojeto como se ele fizesse parte do mesmo repositório.\n* Efetuar fetch das atualizações de `Spoon-Knife` para o projeto `test`.\n\n## Configurar o repositório vazio para um merge de subárvore\n\n1. Abra <span class=\"platform-mac\">Terminal</span><span class=\"platform-linux\">Terminal</span><span class=\"platform-windows\">Git Bash</span>.\n\n2. Crie um novo diretório e navegue até ele.\n\n   ```shell\n   mkdir test\n   cd test\n   ```\n\n3. Inicialize um novo repositório Git.\n\n   ```shell\n   $ git init\n   > Initialized empty Git repository in /Users/octocat/tmp/test/.git/\n   ```\n\n4. Crie e faça commit de um novo arquivo.\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## Adicionar um novo repositório como uma subárvore\n\n1. Adicione uma nova URL remota apontando para o projeto separado em que estávamos interessados.\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. Mesclar o projeto `Spoon-Knife` no projeto local do Git. Isso não muda qualquer um de seus arquivos localmente, mas prepara o Git para a próxima etapa.\n\n   Se você estiver usando o Git 2.9 ou superior:\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   Se estiver usando o Git 2.8 ou abaixo:\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. Crie um diretório chamado **spoon-knife** e copie o histórico do Git do projeto `Spoon-Knife` para ele.\n\n   ```shell\n   $ git read-tree --prefix=spoon-knife/ -u spoon-knife/main\n   > fatal: refusing to merge unrelated histories\n   ```\n\n4. Faça commit das alterações para mantê-las seguras.\n\n   ```shell\n   $ git commit -m \"Subtree merged in spoon-knife\"\n   > [main fe0ca25] Subtree merged in spoon-knife\n   ```\n\nEmbora tenhamos adicionado apenas um subprojeto, qualquer número de subprojetos pode ser incorporado a um repositório Git.\n\n> \\[!TIP]\n> Se você criar um novo clone do repositório no futuro, os repositórios remotos que você adicionou não serão criados automaticamente. Você precisará adicioná-los novamente usando [o comando `git remote add`](/pt/get-started/git-basics/managing-remote-repositories).\n\n## Sincronizar com atualizações e alterações\n\nQuando um subprojeto é adicionado, ele não é mantido automaticamente em sincronia com as alterações de upstream. Você precisará atualizar o subprojeto com o seguinte comando:\n\n```shell\ngit pull -s subtree REMOTE-NAME BRANCH-NAME\n```\n\nPara o exemplo acima, o comando seria:\n\n```shell\ngit pull -s subtree spoon-knife main\n```\n\n## Leitura adicional\n\n* [O capítulo \"Mesclagem avançada\" do livro *Pro Git*](https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging)\n* [Como usar a estratégia de mesclagem de subárvores](https://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html)"}