Menu

[Git] Stash와 Checkout 지옥에서 탈출하기: Git Worktree 완벽 가이드

Git Worktree 개념도: 하나의 저장소에서 여러 작업 공간으로 뻗어나가는 브랜치들

"복잡한 기능을 한창 개발 중인데, 갑자기 운영 서버에 치명적인 버그가 터졌다며 핫픽스를 요청받았다." 개발자라면 누구나 한 번쯤 겪어본 식은땀 나는 상황입니다. 주섬주섬 git stash를 하고, 브랜치를 옮기고, 꼬인 의존성을 다시 설치하는 과정... 이제 그만할 때가 되었습니다. 오늘은 Git Worktree로 이 지옥에서 탈출하는 방법을 알아봅니다. 🚀

1. Git Worktree란?

일반적인 Git 저장소는 하나의 저장소(Repository) = 하나의 작업 디렉토리(Working Directory)라는 공식을 따릅니다. 하지만 Git Worktree는 하나의 로컬 저장소(.git 데이터베이스)를 공유하면서 여러 개의 작업 디렉토리를 동시에 생성해 줍니다.

Git Clone vs. Git Worktree

구분 Git Clone (복제) Git Worktree (워크트리)
용량 점유 중복 발생 (매우 큼) 공통 데이터 공유 (매우 작음)
브랜치 동기화 폴더마다 각각 pull 필요 한 곳에서 Fetch하면 전부 반영
생성 속도 네트워크 상황에 따라 느림 로컬에서 즉시 생성 (1초 미만)
작업 전환 브랜치 전환 시 stash 필수 폴더만 이동하면 끝 (Context 유지)

워크트리 생성 시 디렉토리 구조 예시

[일반적인 방식]

my-project/ (메인 폴더)
├── .git/ (데이터베이스)
├── src/
├── package.json
└── ...
(한 번에 하나의 브랜치만 작업 가능)

[Worktree 사용 시]

my-project/ (develop 브랜치)
├── .git/
└── ...
                    
../hotfix-area/ (hotfix 브랜치)
├── .git (메인 .git을 가리키는 파일)
├── src/
└── ...
(동시에 여러 브랜치 작업 가능)

핵심은 "뇌(.git)는 하나인데, 몸(Working Directory)이 여러 개"인 상태를 만드는 것입니다. 프로젝트 전체를 새로 받는 clone보다 훨씬 효율적입니다.

"Worktree를 사용하면 '컨텍스트 스위칭' 비용이 0에 수렴합니다. 물리적으로 다른 폴더에 다른 브랜치가 펼쳐져 있으니까요." – Senior DevOps Engineer

2. 기본 사용법 및 실무 시나리오

가장 흔한 상황인 "개발 중 급한 핫픽스 요청" 상황을 Worktree로 해결해 봅시다.

# 1. 현재 개발 중인 폴더(my-project)는 그대로 둡니다.
# 2. 상위 디렉토리에 새로운 hotfix 전용 워크트리를 생성합니다.
$ git worktree add ../emergency-fix main

# 3. 새로 만든 폴더로 이동합니다.
$ cd ../emergency-fix

# 4. 이곳은 main 브랜치 기반의 깨끗한 상태입니다. 
# 여기서 브랜치를 따고 버그를 수정합니다.
$ git checkout -b fix/urgent-bug
# ... 버그 수정 후 커밋 & 푸시 ...

# 5. 작업이 끝났다면 다시 원래 개발 폴더로 돌아옵니다.
$ cd ../my-project

# 6. 다 쓴 워크트리는 삭제합니다.
$ git worktree remove ../emergency-fix

이 과정 동안 원래 작업하던 my-project 폴더의 파일들은 단 하나도 변하지 않았고, stash를 할 필요도 없었습니다.

워크트리 목록 확인

# 현재 연결된 모든 워크트리 경로와 브랜치 확인
$ git worktree list

3. 고급 전략: Bare Repository (시니어의 폴더 구조)

Git Worktree를 가장 깔끔하게 사용하는 방법은 Bare Repository를 활용하는 것입니다. 이 방식은 프로젝트의 루트 폴더를 "작업을 하지 않는 관리용 폴더"로 만들고, 실제 작업은 모두 하위의 워크트리 폴더에서 수행합니다.

Bare Repository 폴더 구조 다이어그램
Bare Repository를 활용한 깔끔한 폴더 구조 예시
# 1. 최상위 폴더 생성
$ mkdir clean-architecture-repo && cd clean-architecture-repo

# 2. Bare Clone (.bare 폴더에 git 데이터만 받기)
$ git clone --bare https://github.com/your/repo.git .bare

# 3. .git 파일 생성 (연결 고리)
$ echo "gitdir: ./.bare" > .git

# 4. 실제 작업용 워크트리 생성
$ git worktree add main main

왜 Bare Repository인가요?

.git 폴더(두뇌)와 실제 코드(몸)가 완벽하게 분리되어, 실수로 메인 저장소를 삭제하거나 오염시킬 위험이 줄어듭니다. 또한 모든 브랜치를 동등한 레벨의 폴더로 관리할 수 있어 시각적으로 매우 직관적입니다.

4. 꿀팁 및 주의사항 (Pro Tips)

  • 의존성 관리와 pnpm: Worktree의 유일한 단점은 폴더마다 node_modules가 생긴다는 점입니다. pnpm을 사용하면 글로벌 저장소를 공유하므로 디스크 용량을 획기적으로 아낄 수 있습니다.
  • VS Code 워크스페이스: File > Add Folder to Workspace... 기능을 사용해 여러 워크트리 폴더를 하나의 창에서 동시에 관리하세요.
  • Config 공유: 모든 워크트리는 .bare/config를 공유합니다. 하지만 .env 파일은 폴더별로 따로 관리해야 하므로, 환경별 테스트에 유리합니다.

마치며

Git Worktree는 한 번 익숙해지면 다시는 이전 방식으로 돌아갈 수 없을 만큼 강력한 도구입니다. 특히 코드 리뷰를 자주 하거나, 여러 버전을 동시에 유지보수해야 하는 환경이라면 생산성이 비약적으로 상승할 것입니다. 이번 주말, 여러분의 사이드 프로젝트에 Bare Repository 전략을 한번 적용해 보는 건 어떨까요?🛠️

공유하기:
Home Search Share Link