{"meta":{"title":"Git 서브트리 병합 정보","intro":"단일 리포지토리 내에서 여러 프로젝트를 관리해야 하는 경우 하위 트리 병합을 사용하여 모든 참조를 처리할 수 있습니다.","product":"시작하기","breadcrumbs":[{"href":"/ko/get-started","title":"시작하기"},{"href":"/ko/get-started/using-git","title":"Git 사용"},{"href":"/ko/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> 나중에 리포지토리의 새 복제본을 만드는 경우 추가한 원격이 자동으로 생성되지 않습니다.\n> [\n> `git remote add` 명령](/ko/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* [\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)"}