Git Subtree

Git Subtree 는 Git 에서 제공하는 저장소 관리 도구로, 하나의 저장소 안에 다른 저장소를 포함시켜 관리할 수 있게 해주는 기능이다. 서브모듈 (Submodule) 의 대안으로 개발되었으며, 주요 저장소 (상위 저장소) 에 하위 저장소의 파일들을 직접 포함시키는 방식으로 작동한다. Git Subtree 는 복잡한 프로젝트 구조에서 코드 재사용, 공유 라이브러리 관리, 여러 저장소의 통합 관리에 유용하며, 특히 상위 저장소에서 하위 저장소의 코드를 직접 수정하고 원래 하위 저장소에 변경사항을 반영할 수 있다는 점이 큰 특징이다. 이러한 기능은 팀 협업, 라이브러리 관리, 마이크로서비스 구조의 개발 등에서 활용된다.

핵심 개념

  • Git Subtree는 외부 저장소를 하나의 디렉토리처럼 포함하되, 그 내용을 상위 저장소로 직접 병합하는 방식.
  • 하위 저장소는 더 이상 참조만 되는 것이 아니라 실제 코드와 히스토리가 포함됨.
개념설명
서브트리외부 저장소 코드를 메인 프로젝트에 복제·통합
단일 히스토리모든 변경 이력을 메인 저장소에서 관리
양방향 동기화메인 ↔ 서브트리 저장소 간 변경사항 상호 반영

목적 & 필요성

목적

Git Subtree 의 주요 목적은 다음과 같다:

  • 여러 프로젝트에서 공통 코드 또는 라이브러리를 공유하고 재사용하기 위함
  • 하나의 저장소에서 여러 저장소를 통합 관리가 가능하게 하기 위함
  • 저장소가 분리된 파일들을 하나의 저장소에 포함시켜 개발을 진행하기 위함
  • 코드 공유와 동기화를 단순화하기 위함
  • 여러 개의 프로젝트를 하나로 합치기 위함

필요성

Git Subtree 는 다음과 같은 상황에서 필요성이 대두된다:

  • 여러 프로젝트에 걸쳐 공통 코드나 라이브러리를 유지보수해야 할 때
  • 백엔드를 마이크로서비스 구조로 개발하면서 API 응답, 데이터 모델에 같은 타입을 사용해 일관성을 유지해야 할 때
  • 여러 프로젝트를 통합 관리하고자 할 때
  • 핵심 디자인 파일을 여러 저장소에 포함시키고 싶을 때
  • 프로젝트 히스토리를 관리하며 통합할 필요가 있을 때

주요 기능

Git Subtree 의 주요 기능은 다음과 같다:

  • 하위 저장소 추가: git subtree add 명령을 통해 외부 저장소를 현재 저장소에 추가
  • 하위 저장소 업데이트: git subtree pull 명령으로 외부 저장소의 변경사항을 가져옴
  • 변경사항 푸시: git subtree push 명령으로 로컬에서 수정한 하위 저장소 내용을 원격 저장소에 반영
  • 병합 전략: 서브트리 병합 (subtree merge) 기능을 통해 양쪽 저장소의 변경사항을 모두 반영

역할

Git Subtree 는 다음과 같은 역할을 수행한다:

  • 상위 저장소에 파일을 직접 추가하고 트래킹함
  • 서브트리의 원격에 있는 소스와 서브트리를 추가한 저장소의 소스가 서로 달라도 subtree merge 기능을 사용해 양쪽의 변경사항을 모두 반영할 수 있도록 함
  • 상위 저장소에서 서브트리를 직접 수정하고 원격에 푸시할 수 있게 함
  • 여러 저장소의 히스토리를 관리하며 재사용할 수 있도록 함

특징

Git Subtree 의 주요 특징은 다음과 같다:

  • 상위 저장소에 파일을 직접 추가하고 트래킹하기 때문에 서브트리의 변경사항도 상위 저장소에 기록됨
  • 서브모듈과 달리 메타데이터 파일 (예:.gitmodule) 을 생성하지 않음
  • 하위 저장소 (Child) 의 내용을 상위 저장소 (Parent) 에서 일반적인 git 명령어로 관리할 수 있음
  • 하위 저장소의 내용을 수정하기 위해 별도의 저장소 복사본을 유지할 필요가 없음
  • 사용자가 새로운 것을 배울 필요 없이 저장소를 사용할 수 있게 함

핵심 원칙

Git Subtree 는 다음과 같은 핵심 원칙에 기반한다:

  • 통합성: 여러 저장소를 하나의 저장소로 통합하여 관리
  • 투명성: 사용자에게 서브트리의 존재를 숨기고 일반적인 Git 워크플로우 유지
  • 양방향 동기화: 상위 저장소와 하위 저장소 간의 변경사항을 양방향으로 전파
  • 히스토리 보존: 하위 저장소의 커밋 히스토리를 유지하면서 통합
  • 유연성: 다양한 상황과 워크플로우에 적응할 수 있는 유연한 구조 제공

주요 원리 & 작동 원리

다이어그램

1
2
3
MainRepo/
├── project/
│   └── external-lib/ (실제 코드 포함됨)

주요 원리

Git Subtree 의 주요 원리는 다음과 같다:

  • 복사 원리: Subtree 는 복사 개념으로, 하위 저장소의 코드를 상위 저장소에 복사하여 포함시킴
  • 병합 원리: 서브트리 Merge 전략을 사용하여 Git 이 서브트리를 찾아 메인 프로젝트로 서브프로젝트의 내용을 병합함
  • 트래킹 원리: 상위 저장소가 하위 저장소의 파일을 직접 추적하며 변경사항을 기록
  • 분할 원리: git subtree split 명령으로 서브트리의 변경사항만 추출하여 별도의 커밋으로 분리 가능
  • 동기화 원리: 상위 저장소와 하위 저장소 간에 push 와 pull 을 통한 양방향 동기화 가능

작동 원리

Git Subtree 는 다음과 같은 방식으로 작동한다:

  1. 추가 (Add):
    • 먼저 원격 저장소를 추가한 후, subtree add 명령으로 하위 저장소를 특정 폴더에 추가함
    • 하위 저장소의 전체 커밋 히스토리가 상위 저장소로 병합됨
  2. 가져오기 (Pull):
    • 원격의 하위 저장소에 변경사항이 있을 경우, subtree pull 명령으로 상위 저장소에 반영함
    • 상위 저장소에 하위 저장소의 최신 변경사항을 병합함
  3. 내보내기 (Push):
    • 상위 저장소에서 하위 저장소의 내용을 수정한 후, subtree push 명령으로 원격 하위 저장소에 반영함
    • 원래 별개의 프로젝트였던 원격 저장소에 변경사항을 동기화할 수 있음
  4. 분할 (Split):
    • subtree split 명령을 통해 마지막 분할 이후 변경된 내용만 찾아 별도의 커밋으로 분리함
    • 이렇게 분리된 커밋들은 하위 저장소의 원격 저장소로 푸시할 수 있음

명령어 흐름

1
2
3
4
5
6
7
8
# 1. 서브트리 추가
git subtree add --prefix=external-lib https://github.com/example/lib.git main --squash

# 2. 외부 변경 사항 병합
git subtree pull --prefix=external-lib https://github.com/example/lib.git main --squash

# 3. 외부에 변경사항 push (있을 경우)
git subtree push --prefix=external-lib https://github.com/example/lib.git main

구성 요소 및 아키텍처

Git Subtree 는 다음과 같은 구성 요소로 이루어져 있다:

  1. 상위 저장소 (Parent Repository):
    • 하위 저장소를 포함하는 주 저장소
    • 모든 서브트리 조작의 기준점이 됨
    • 일반적인 git add, commit, push, pull 로 관리함
  2. 하위 저장소 (Child Repository):
    • 상위 저장소에 포함될 외부 저장소
    • 원격에 독립적으로 존재하는 별도의 프로젝트
    • 상위 저장소에서는 하나의 디렉토리로 취급됨
  3. 서브트리 참조 (Subtree Reference):
    • git log 에 기록되는 서브트리 관련 정보 (git-subtree-dir, git-subtree-mainline, git-subtree-split 등)
    • 서브트리의 위치와 마지막 동기화 상태를 추적하는 데 사용됨
  4. 원격 참조 (Remote Reference):
    • 원격 저장소를 가리키는 참조 (remote add 로 추가됨)
    • 서브트리 명령어에서 원격 저장소 이름으로 사용됨
  5. 서브트리 명령 (Subtree Commands):
    • add, pull, push, split 등의 서브트리 전용 명령어
    • 상위 저장소와 하위 저장소 간의 동기화를 관리함

Git Subtree 명령어

서브트리 추가 (add)

외부 저장소의 특정 브랜치를 현재 저장소의 하위 디렉토리로 가져온다.

1
git subtree add --prefix=   [--squash]

예시

1
git subtree add --prefix=lib https://github.com/user/library.git main --squash
  • lib 폴더에 library.gitmain 브랜치 코드를 추가하고, 커밋 내역을 하나로 합친다 (--squash 옵션).

서브트리 업데이트 (pull)

외부 저장소의 변경사항을 메인 저장소의 하위 디렉토리에 병합한다.

1
git subtree pull --prefix=   [--squash]

예시

1
git subtree pull --prefix=lib https://github.com/user/library.git main --squash
  • lib 폴더의 서브트리를 최신 상태로 업데이트하며, 변경 내역을 하나의 커밋으로 합친다.

서브트리 변경사항 푸시 (push)

메인 저장소에서 하위 디렉토리 (서브트리) 에서 작업한 변경 사항을 외부 저장소로 푸시한다.

1
git subtree push --prefix=  

예시

1
git subtree push --prefix=lib https://github.com/user/library.git main
  • lib 디렉토리의 변경사항을 외부 저장소의 main 브랜치에 반영한다.

서브트리 분리 (split)

하위 디렉토리의 변경 내역만 별도의 브랜치로 분리한다.

1
git subtree split --prefix= -b 

예시

1
git subtree split --prefix=lib -b lib-branch
  • lib 폴더의 변경 이력만을 담은 lib-branch 브랜치를 생성한다.

원격 저장소 추가 (remote add)

외부 저장소를 원격 저장소로 등록해두면 명령어가 더 간결해진다.

1
git remote add  

예시

1
git remote add library https://github.com/user/library.git

실무에서 자주 쓰는 옵션

  • --squash: 여러 커밋을 하나로 합쳐 메인 저장소의 커밋 히스토리를 깔끔하게 유지합니다.
  • --prefix: 외부 저장소가 병합될 하위 디렉토리 경로를 지정합니다.

요약표

명령어 유형명령어 예시설명
추가 (add)git subtree add --prefix=lib https://github.com/user/library.git main --squash외부 저장소를 하위 폴더로 추가
업데이트 (pull)git subtree pull --prefix=lib https://github.com/user/library.git main --squash외부 저장소의 변경분 반영
푸시 (push)git subtree push --prefix=lib https://github.com/user/library.git main하위 폴더 변경분 외부 저장소로 푸시
분리 (split)git subtree split --prefix=lib -b lib-branch하위 폴더만 분리해 새 브랜치 생성

장점과 단점

구분항목설명
✅ 장점단일 저장소 관리여러 개의 프로젝트를 하나의 저장소로 관리할 수 있음
간편한 사용성사용자들이 서브트리로 의존성을 관리한다는 사실을 잊어도 될 정도로 투명하게 작동함
메타데이터 파일 없음Git 서브모듈과 달리 새로운 메타데이터 파일 (예:.gitmodule) 을 생성하지 않음
직접 수정 가능상위 저장소에서 서브트리를 직접 수정하고 원격에 푸시할 수 있음
일관된 워크플로저장소 사용자들이 새로운 것을 배울 필요가 없음
자동 클론상위 프로젝트 클론 시 서브트리의 코드도 자동으로 사용 가능함
병합 용이성서브트리 merge 기능을 통해 양쪽 저장소의 변경사항을 모두 반영할 수 있음
오래된 Git 버전 지원Git 1.5.2 보다 오래된 버전에서도 지원됨
⚠ 단점명령어 복잡성새로운 병합 전략 (git subtree) 에 대해 학습해야 함
서브트리 위치 기억어느 디렉토리를 –prefix 로 지정해야 하는지 기억해야 함
상위 저장소 크기 증가하위 저장소를 복사하므로 상위 저장소의 크기가 커짐
제한된 접근 제어모든 사용자가 서브트리의 내용을 자유롭게 변경해 원격에 푸시할 수 있음
업스트림 기여 복잡성서브프로젝트에 코드를 기여하는 과정이 더 복잡함
책임의 분산슈퍼 프로젝트와 서브 프로젝트 코드를 커밋에서 혼합하지 않을 책임이 개발자에게 있음

분류에 따른 종류 및 유형

종류설명사용 시나리오
기본 서브트리–prefix 옵션으로 서브트리를 클론할 폴더 지정하고 원격 저장소와 브랜치를 지정하여 추가간단한 외부 저장소 통합 시
원격 별칭 서브트리서브트리를 원격으로 추가하여 더 짧은 형태로 참조하는 방식반복적인 서브트리 작업 시
스쿼시 서브트리–squash 옵션을 사용하여 외부 저장소의 커밋 기록을 하나의 커밋으로 압축외부 저장소의 히스토리가 필요 없을 때
분할 서브트리git subtree split 명령을 사용하여 서브디렉토리를 변경 이력과 함께 분리하위 프로젝트를 독립 저장소로 분리할 때
병합 서브트리-s recursive -Xsubtree=경로 옵션을 사용한 병합 전략다른 브랜치의 서브디렉토리를 병합할 때

실무 적용 예시

적용 분야예시이점
코드 공유백엔드 마이크로서비스 구조에서 API 응답, 데이터 모델의 타입을 일관되게 유지여러 서비스 간 타입 일관성 보장
테마 관리블로그 플랫폼의 테마를 별도 저장소로 관리하면서 메인 블로그 저장소에 통합테마 수정과 업스트림 반영 용이
디자인 시스템핵심 디자인 엘리먼트와 제품 개발 파일을 분리하여 핵심 디자인 파일을 여러 저장소에 포함디자인 시스템의 일관성 유지
라이브러리 관리무거운 의존성 (외부 도구나 라이브러리) 을 관리할 때 의존성의 전체 히스토리를 상위 저장소에 통합라이브러리 사용 및 수정 용이
모노레포여러 SPM(Swift Package Manager) 패키지를 개발 저장소에서 쉽게 작업하며 개별 저장소로 배포단일 저장소 개발과 분리 배포 장점 결합
플러그인 관리Vim 플러그인을 트래킹하여 통합하고 업데이트플러그인 관리 및 업데이트 용이
오픈소스 통합외부 저장소 코드를 한 번만 또는 가끔 가져와서 사용할 때외부 코드 통합과 관리 단순화

실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점

고려사항설명주의할 점
저장소 구조 설계밀접하게 연관된 프로젝트의 경우 모노레포 방식을 고려해야 함관계가 느슨한 프로젝트에는 부적합할 수 있음
작업 디렉토리 관리git subtree 관련 조작은 저장소 최상위 폴더에서 이루어져야 함하위 디렉토리에서 명령 실행 시 오류 발생
변경사항 동기화 전략원래 저장소에서 수정된 코드를 반영하려면 subtree pull 명령어 사용fetch/merge 로는 동기화되지 않음
충돌 관리변경 내역을 push 하기 전에 pull 해야 충돌 방지양방향 동기화 시 충돌 발생 가능성 높음
자동화 고려많은 서브트리를 관리할 경우 스크립트와 자동화를 통해 관리해야 함수동 관리는 오류 가능성 증가
팀 교육어느 디렉토리가 subtree 인지 별도로 기록하고 팀원들과 공유해야 함문서화 없이는 팀원들이 혼란 겪을 수 있음
명령어 단순화원격 별칭을 사용하여 명령어를 짧게 만드는 것이 좋음긴 명령어는 기억하기 어렵고 오류 가능성 높음
스쿼시 옵션 사용–squash 옵션으로 히스토리를 압축하여 관리 가능모든 커밋 히스토리가 필요한 경우에는 부적합

최적화하기 위한 고려사항 및 주의할 점

고려사항설명주의할 점
저장소 크기 관리서브트리는 상위 저장소에 파일을 직접 추가하므로 저장소 크기가 커짐대형 저장소에서는 성능 저하 가능성
히스토리 압축스쿼시 옵션을 사용하여 모든 커밋을 하나로 압축하면 저장소 크기와 성능 개선상세 히스토리가 손실될 수 있음
분할 성능리조인 옵션을 사용하여 전체 히스토리를 매번 검색하는 대신 체크포인트 활용리조인 없이는 대형 저장소에서 속도 저하
저장소 규모100 개 이상의 서브모듈/서브트리를 관리하는 경우 어떤 방식을 사용하든 관리가 어려움과도한 서브트리 사용 지양
캐싱 최적화모노레포 대비 서브트리는 더 작은 단위로 캐싱 최적화 가능통합 빌드/CI 설정 필요
업데이트 빈도자주 업데이트가 필요 없는 외부 코드에 적합빈번한 업데이트가 필요한 경우 오버헤드 발생
병합 복잡성외부 저장소의 변경사항을 메인 저장소에 병합하는 과정에서 복잡성 증가 가능복잡한 병합 상황에 대비 필요

최신 동향

주제항목설명
모노레포 통합Git Subtree 와 모노레포Apollo 는 Git Subtree 를 사용하여 모노레포에서 Swift 패키지를 관리하는 방식을 도입함. 여러 개별 패키지를 하나의 개발 저장소에서 작업하고 자동화된 GitHub Actions 워크플로우를 통해 변경사항을 자동으로 분리하여 각 패키지 저장소로 푸시하는 방식이 인기를 얻고 있음
자동화CI/CD 파이프라인 통합2025 년에는 Git subtree 작업이 CI/CD 파이프라인에 통합되어 자동화된 워크플로우가 증가함. 코드 변경 시 자동으로 의존성을 관리하고 업데이트하는 방식이 표준화되고 있음
대안 솔루션새로운 대안들git-subrepo 와 같은 새로운 대안들이 등장하여 Git Subtree 와 Git Submodule 의 제한사항을 해결하려는 시도가 증가함. 이러한 도구들은 더 간단한 워크플로우와 향상된 협업 기능을 제공함
패키지 관리 통합언어별 패키지 관리자와 통합Rust 의 Cargo.toml 과 같은 텍스트 파일에 의존성 해시를 커밋하는 방식이 인기를 얻으면서, Git Subtree 는 패키지 관리자가 지원하지 않는 상황에서 주로 사용됨
하이브리드 접근법모노레포와 멀티레포 혼합액세스 권한에 따라 코드를 별도의 모노레포로 분할하고, git-subrepo 를 사용하여 모든 모노레포를 단일 모노레포에서 관리하는 하이브리드 접근법이 증가함
클라우드 개발 환경원격 개발 환경에서의 최적화클라우드 기반 개발 환경에서 Git Subtree 를 사용할 때 네트워크 지연과 저장소 크기 관리를 최적화하는 방법에 대한 관심이 증가함

주목해야 할 기술들

주제항목설명
자동화 도구Git Subtree 자동화GitHub Actions 와 같은 CI/CD 도구를 활용하여 Git Subtree 의 분할 및 병합 작업을 자동화하는 워크플로우. 이를 통해 개발자는 복잡한 Git Subtree 명령어를 직접 사용하지 않아도 됨
Git SubrepoGit Subtree 대안https://github.com/ingydotnet/git-subrepo는 Git Subtree 와 Git Submodule 의 장점을 결합한 대안으로 주목받고 있음. 더 간단한 명령어와 향상된 기능을 제공함
모노레포 도구기업용 모노레포 솔루션nx 모노레포와 같은 도구들이 Angular 와 NestJS 를 함께 사용하는 프로젝트에서 활용되고 있음. 이러한 도구들은 캐싱 및 영향받는 패키지만 빌드하는 기능을 제공함
MDLR선언적 Git 의존성 도구MDLR(“Modular”) 은 Git Submodule 과 유사한 기능을 제공하면서도 복잡한 워크플로우를 개선한 선언적 버전 관리 Git 의존성 도구
하드 링크 활용파일 시스템 최적화“.boiler” 폴더에 서브모듈을 두고 하드 링크를 사용하여 애플리케이션의 “src” 디렉토리와 연결하는 방식. 이를 통해 링크된 파일 편집 시 원본 파일도 업데이트됨
의존성 관리 자동화스마트 의존성 업데이트서드파티 의존성을 자동으로 추적하고 관리하는 도구들이 Git Subtree 와 통합되고 있음. 이를 통해 보안 취약점이 있는 의존성을 자동으로 업데이트할 수 있음

앞으로의 전망

주제항목설명
단순화된 인터페이스사용 편의성 향상Git Subtree 의 복잡한 명령어를 단순화하고 직관적인 인터페이스를 제공하는 도구들이 더욱 발전할 것으로 예상됨. 이를 통해 더 많은 개발자가 Git Subtree 를 채택할 것으로 전망됨
AI 통합지능형 병합 충돌 해결AI 를 활용하여 Git Subtree 병합 충돌을 지능적으로 해결하는 도구들이 등장할 것으로 예상됨. 이는 복잡한 멀티레포 환경에서의 작업을 크게 단순화할 수 있음
하이브리드 접근법모노레포와 멀티레포 결합Apollo 의 Swift 패키지 관리 사례처럼 개발은 모노레포에서, 배포는 개별 저장소로 하는 하이브리드 접근법이 더욱 인기를 얻을 것으로 전망됨
Git 네이티브 기능 확장내장 기능 확대Git 의 기본 기능으로 현재 Git Subtree 가 제공하는 기능을 더 직관적이고 사용하기 쉽게 통합하는 방향으로 발전할 것으로 예상됨
패키지 매니저 통합의존성 관리 통합언어별 패키지 매니저와 Git Subtree 의 기능을 통합하여 코드와 의존성을 함께 관리하는 통합 솔루션이 발전할 것으로 전망됨
분산 개발 최적화원격 작업 환경 지원전 세계적으로 분산된 개발 팀을 위해 네트워크 지연과 저장소 크기 문제를 해결하는 최적화된 Git Subtree 솔루션이 발전할 것으로 예상됨

추가 학습 주제

카테고리주제설명
Git 워크플로우Git Subtree 명령어 심화Git Subtree 의 고급 옵션과 명령어들 (split, merge 등) 에 대한 심층적인 이해
Git 워크플로우Git Subtree vs Git Submodule두 기능의 상세한 비교 분석과 각각 적합한 사용 사례
Git 워크플로우Subtree 병합 전략서브트리 병합 전략의 내부 작동 방식과 최적화 방법
시스템 설계모노레포 아키텍처대규모 프로젝트에서 모노레포와 Git Subtree 를 활용한 최적의 저장소 구조 설계
시스템 설계마이크로서비스와 Git Subtree마이크로서비스 아키텍처에서 공통 코드를 관리하기 위한 Git Subtree 활용법
자동화Git Subtree CI/CD 통합GitHub Actions 등을 활용한 Git Subtree 작업 자동화 방법
성능 최적화대규모 저장소 최적화100 개 이상의 하위 저장소를 관리할 때의 성능 최적화 방법
대안 기술Git SubrepoGit Subtree 와 Submodule 의 대안으로서 Git Subrepo 의 활용법
대안 기술MDLR선언적 버전 관리 Git 의존성 도구인 MDLR 의 특징과 활용법

관련 분야 추가 학습 주제

카테고리주제설명
버전 관리Git 내부 구조Git 의 내부 구조와 저수준 명령어에 대한 이해
버전 관리Git 병합 전략다양한 Git 병합 전략의 비교와 각 상황에 적합한 전략 선택 방법
소프트웨어 아키텍처모노레포 vs 멀티레포프로젝트 규모와 성격에 따른 모노레포와 멀티레포 선택 기준
소프트웨어 아키텍처마이크로서비스 설계코드 공유가 필요한 마이크로서비스 아키텍처 설계 방법
의존성 관리패키지 관리자 통합언어별 패키지 관리자와 Git 워크플로우의 통합 방법
DevOpsCI/CD 파이프라인 설계Git Subtree 를 활용한 효율적인 CI/CD 파이프라인 구축 방법
CI/CDSubtree 빌드 자동화.gitlab-ci.yml 또는 GitHub Actions 스크립트 구성
코드 품질코드 공유 전략여러 프로젝트 간 코드 공유를 위한 효과적인 전략
팀 협업효율적인 개발 워크플로우Git Subtree 를 활용한 분산 팀의 효율적인 협업 방법
보안의존성 취약점 관리Git Subtree 로 통합된 외부 코드의 보안 취약점 관리 방법

용어 정리

용어설명
상위 저장소 (Parent Repository)Git Subtree 에서 하위 저장소를 포함하는 주 저장소
하위 저장소 (Child Repository)상위 저장소에 포함되는 외부 저장소
서브트리 병합 (Subtree Merge)한 프로젝트를 다른 프로젝트의 하위 디렉토리로 매핑하여 병합하는 전략
Squash Merge여러 커밋을 단일 이력으로 병합
Detached HEAD특정 커밋에 고정된 작업 상태
–prefix 옵션서브트리를 클론할 폴더를 지정하는 Git Subtree 명령어 옵션
–squash 옵션외부 저장소의 커밋 기록을 하나의 커밋으로 압축하는 옵션
subtree split디렉토리만 분리해 독립 저장소처럼 추출하는 명령어
모노레포 (Monorepo)여러 프로젝트를 하나의 저장소에서 관리하는 방식
멀티레포 (Multi-repo)여러 프로젝트를 각각 별도의 저장소로 관리하는 방식
git-subrepoGit Subtree 와 Submodule 의 장점을 결합한 대안 도구

참고 자료