Git Worktree
Git Worktree란?Permalink
Git Worktree는 하나의 Git 저장소에서 여러 개의 working directory를 동시에 관리할 수 있게 해주는 기능이다. 각 worktree는 독립적인 작업 공간을 제공하며, 서로 다른 브랜치에서 작업할 수 있다.
왜 사용하는가?Permalink
기존 방식의 문제점Permalink
- 브랜치 전환 시 stash하거나 commit해야 함
- 여러 브랜치 간의 비교가 어려움
- 동시에 여러 작업을 진행하기 어려움
Worktree의 장점Permalink
- 여러 브랜치에서 동시 작업 가능
- 브랜치 전환 없이 독립적인 작업 공간 제공
- 코드 비교 및 테스트가 편리함
기본 사용법Permalink
Worktree 생성Permalink
1. 새로운 브랜치 생성 + worktreePermalink
# 새로운 브랜치를 만들면서 동시에 worktree 생성
git worktree add ../feature-login feature-login
# 특정 브랜치에서 파생된 새 브랜치로 worktree 생성
git worktree add ../hotfix-123 -b hotfix-123 main
2. 기존 브랜치를 worktree로 사용Permalink
# 이미 존재하는 브랜치를 worktree로 체크아웃
git worktree add ../existing-feature existing-feature
# 원격 브랜치를 worktree로 체크아웃
git worktree add ../origin-feature origin/feature-branch
주요 차이점Permalink
- 새 브랜치: 브랜치가 존재하지 않으면 자동으로 현재 브랜치에서 파생되어 생성
- 기존 브랜치: 이미 존재하는 브랜치를 그대로 체크아웃 (커밋 히스토리 유지)
- 원격 브랜치: 원격에만 있는 브랜치를 로컬 worktree로 가져옴
왜 ..
를 사용하는가?
- 메인 프로젝트와 같은 레벨에 worktree를 생성하는 것이 관례
- 예:
/Users/mj/projects/main-project
에서 작업 중이라면- worktree:
/Users/mj/projects/feature-branch
- 이렇게 하면 IDE에서 별도 프로젝트로 인식하여 관리 편리
- worktree:
Worktree 목록 확인Permalink
git worktree list
Worktree 제거Permalink
# worktree 디렉토리 삭제 후
git worktree remove ../feature-branch
# 또는 prune으로 정리
git worktree prune
실제 사용 사례Permalink
1. 기능 개발 중 버그 수정Permalink
# 현재 feature 브랜치에서 작업 중
git worktree add ../hotfix hotfix
# hotfix 디렉토리에서 버그 수정
cd ../hotfix
# 수정 후 commit & push
# 다시 feature 브랜치로 돌아가서 작업 계속
cd ../main-project
2. 코드 리뷰 및 비교Permalink
# 현재 작업 중인 코드와 main 브랜치 비교
git worktree add ../main-review main
# 파일 비교
diff main-project/src/component.js main-review/src/component.js
3. 테스트 환경 분리Permalink
# 개발 서버용 worktree
git worktree add ../dev-server dev
# 프로덕션 테스트용 worktree
git worktree add ../prod-test main
주의사항Permalink
- 같은 브랜치는 동시에 여러 worktree에서 사용 불가
- 각 worktree는 독립적인 index와 working directory를 가짐
- 공유하는 것은 .git 디렉토리뿐
- worktree 삭제 시 수동으로 디렉토리 정리 필요
- 팀 간 공유 불가능: worktree는 로컬 개발자의 개인 작업 공간 (
.git/worktrees/
는 로컬에만 존재)
파일 시스템 구성 및 원리Permalink
내부 구조Permalink
일반적인 디렉토리 구조 (같은 레벨)Permalink
workspace/
├── main-project/ # 메인 프로젝트
│ ├── .git/ # 실제 저장소
│ └── src/
├── feature-branch/ # worktree 1
│ ├── .git # -> main-project/.git/worktrees/feature-branch
│ └── src/
└── hotfix-branch/ # worktree 2
├── .git # -> main-project/.git/worktrees/hotfix-branch
└── src/
서브 디렉토리 구조 (한 곳에 모음)Permalink
project/
├── .git/ # 메인 저장소
├── main-code/ # 메인 worktree
└── worktrees/
├── feature-1/ # 추가 worktree
└── feature-2/ # 추가 worktree
.git 디렉토리 구조Permalink
.git/
├── worktrees/
│ ├── feature-1/
│ │ ├── HEAD # 현재 브랜치 정보
│ │ ├── index # 독립적인 인덱스
│ │ ├── logs/ # 로그 파일
│ │ └── gitdir # worktree 위치 정보
│ └── feature-2/
│ └── ...
├── objects/ # 공유되는 객체 저장소
├── refs/ # 공유되는 참조
└── config # 공유되는 설정
작동 원리Permalink
- 객체 저장소 공유: 모든 worktree는 동일한
.git/objects
를 공유 - 독립적인 인덱스: 각 worktree마다 별도의 staging area 유지
- 심볼릭 링크: worktree 디렉토리의
.git
은 실제.git/worktrees/[name]
을 가리키는 파일 - 브랜치 잠금: 한 번에 하나의 worktree만 특정 브랜치를 체크아웃 가능
실제 예시Permalink
# 메인 프로젝트에서
git worktree add ../feature-branch feature-branch
# 생성된 구조
ls -la ../feature-branch/.git
# 출력: gitdir: /path/to/main/.git/worktrees/feature-branch
cat ../feature-branch/.git
# 출력: gitdir: /Users/mj/project/.git/worktrees/feature-branch
장단점 분석Permalink
장점Permalink
1. 병렬 작업 가능Permalink
- 여러 브랜치에서 동시 작업
- 브랜치 전환 시간 단축
- 컨텍스트 스위칭 비용 감소
2. 효율적인 저장공간 사용Permalink
- 객체 저장소 공유로 디스크 사용량 최소화
- 전체 저장소 복사 대비 빠른 생성
3. 개발 워크플로우 개선Permalink
- 코드 리뷰 시 브랜치 간 비교 용이
- 테스트 환경 분리 가능
- 긴급 수정 시 작업 중단 불필요
4. IDE 친화적Permalink
- 각 worktree별로 독립적인 IDE 세션 가능
- 프로젝트 설정 분리 가능
단점Permalink
1. 복잡성 증가Permalink
- 초보자에게는 개념 이해 어려움
- 파일 시스템 구조 복잡화
- 디렉토리 관리 필요
2. 브랜치 제약Permalink
- 동일 브랜치를 여러 worktree에서 사용 불가
- 브랜치 전환 시 다른 worktree 확인 필요
3. 메모리 및 리소스 사용Permalink
- 여러 worktree 동시 사용 시 메모리 사용량 증가
- IDE나 빌드 도구의 리소스 소비 증가
4. 관리 오버헤드Permalink
- 사용하지 않는 worktree 정리 필요
- 경로 관리 복잡성
5. 팀 협업 제한Permalink
- worktree는 로컬 개발자만 사용 가능
- 다른 개발자와 worktree 구조 공유 불가
- 팀 전체 워크플로우에는 적합하지 않음
사용 권장 상황Permalink
적합한 경우Permalink
- 대규모 프로젝트 개발
- 긴급 수정이 자주 발생하는 환경
- 코드 리뷰가 빈번한 팀
- 여러 기능을 동시 개발하는 경우
부적합한 경우Permalink
- 소규모 개인 프로젝트
- 단순한 선형 개발 워크플로우
- 리소스가 제한된 환경
- Git 초보자
팀 협업에서의 WorktreePermalink
Worktree 공유 불가능Permalink
- 로컬 전용:
.git/worktrees/
디렉토리는 로컬에만 존재 - 개인 작업 공간: 각 개발자가 자신만의 worktree 구조를 가짐
- Git 저장소에 포함되지 않음: worktree 정보는 원격 저장소에 저장되지 않음
팀에서 사용하는 방법Permalink
# 각 개발자가 개별적으로 설정
# 개발자 A
git worktree add ../feature-login feature-login
# 개발자 B (동일한 브랜치, 각자의 worktree)
git worktree add ../feature-login feature-login
팀 협업 시 주의사항Permalink
- 브랜치 작업은 공유: 브랜치 자체의 커밋은 모든 개발자가 공유
- worktree 구조는 비공유: 각자의 로컬 환경에서만 존재
- 문서화 필요: 팀 내 worktree 사용 규칙 정의 권장
Git Worktree는 복잡한 프로젝트에서 여러 작업을 동시에 진행할 때 매우 유용한 기능이다. 특히 대규모 프로젝트나 긴급 수정이 필요한 상황에서 진가를 발휘하지만, 개인 작업 공간이므로 팀 협업에서는 각자 독립적으로 사용해야 한다.
Comments