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 목록 확인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

  1. 같은 브랜치는 동시에 여러 worktree에서 사용 불가
  2. 각 worktree는 독립적인 index와 working directory를 가짐
  3. 공유하는 것은 .git 디렉토리뿐
  4. worktree 삭제 시 수동으로 디렉토리 정리 필요
  5. 팀 간 공유 불가능: 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

  1. 객체 저장소 공유: 모든 worktree는 동일한 .git/objects를 공유
  2. 독립적인 인덱스: 각 worktree마다 별도의 staging area 유지
  3. 심볼릭 링크: worktree 디렉토리의 .git은 실제 .git/worktrees/[name]을 가리키는 파일
  4. 브랜치 잠금: 한 번에 하나의 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

  1. 브랜치 작업은 공유: 브랜치 자체의 커밋은 모든 개발자가 공유
  2. worktree 구조는 비공유: 각자의 로컬 환경에서만 존재
  3. 문서화 필요: 팀 내 worktree 사용 규칙 정의 권장

Git Worktree는 복잡한 프로젝트에서 여러 작업을 동시에 진행할 때 매우 유용한 기능이다. 특히 대규모 프로젝트나 긴급 수정이 필요한 상황에서 진가를 발휘하지만, 개인 작업 공간이므로 팀 협업에서는 각자 독립적으로 사용해야 한다.

Tags:

Categories:

Updated:

Comments