
하위 Git 저장소를 다른 GIt 저장소 내부에 포힘시키는 기능. A프로젝트 안에 B라는 외부 저장소를 독립된 버전 상태로 포함시킬 수 있음.
clone, pull, push 모두 별도 관리 필요)Subtree는 외부 저장소의 코드를 내부 디렉토리처럼 포함시켜, 단일 Git 저장소로 통합하여 버전 관리할 수 있게 하는 기능.
외부 저장소의 코드가 메인 저장소에 병합됨.
독립적인 저장소처럼 병합과 분리도 가능. (git subtree add, git subtree pull 등)
pull, push 해야 함)❗가정[1]: 당신은 웹 서비스를 개발 중입니다.
❗가정[2]:common-utils은 사내에서 사용하는 라이브러리입니다.
🔸상황: common-utils는 다른 팀에서 별도로 관리하는 오픈소스 같은 라이브러리예요. 이건 계속 독립적으로 버전업이 되며, 여러분 팀은 최신 버전을 참조만 하길 원합니다.
✅ 이렇게 사용:
common-utils의 특정 커밋을 포인터로만 저장.git submodule update로 가져옴.common-utils 수정은 하지 않음. (읽기 전용처럼 사용)-> 🧩 이 방식은 마치 외부 라이브러리를 npm처럼 관리하는 느낌.
"이걸 합쳐보면 npm이라는 것은 Node.js로 만들어진 pakage(module)을 관리해주는 툴이라는 것이 됩니다." 링크 내용 중 中
🔸상황
common-utils는 당신 팀 내부에서 프론트/백엔드 공통으로 사용하는 코드예요. 상황에 따라 직접 수정도 해야 합니다. 그런데 별도 저장소로 관리하고 싶긴 해요.
✅ 이렇게 사용:
common-utils는 별도 Git 저장소로 관리됨.
메인 프로젝트에 통합된 형태로 가져오고(push/pull이 가능) 커밋도 자연스럽게 함께 관리됨.
-> 🧩 이 방식은 “내부 라이브러리 통합 관리 + 외부 백업”에 딱이에요.
| 상황 | Submodule 적합 | Subtree 적합 |
|---|---|---|
| 외부 팀 코드 | ✅ | ❌ |
| 직접 수정 필요 없는 라이브러리 | ✅ | ❌ |
| 내부 팀이 함께 사용하는 코드 | ❌ | ✅ |
| 커밋/버전 관리를 함께 하고 싶을 때 | ❌ | ✅ |
| git 관리에 익숙한 팀 | ✅ | ✅ |
팀 규모에서 작업할 때 유용할 것 같다.
특히 사내에서 사용하는 라이브러리나 tool이 있을 때 유용할 것 같다.
필자에게 적용해 보자면, 매 프로젝트마다 비슷한 패턴을 사용할 때가 많은데, 이를 이런 식으로 관리한다면 초기 세팅을 빠르게 할 수 있을 것 같다.