ABOUT

성능과 운영 안정성을 함께 끌어올리는 개발자입니다.

92% Positional Error Reduction
79% p95 Latency Improvement
90%+ Long Tasks Reduction

2022.02 · 한국장학재단

우수 멘티

한국장학재단 사회 리더 대학생 멘토링 IT

2022.10 · 동작구청

우수 인재상

동작구청 우수 SW 인재

2025.05 · (주) 그랩

프로그래밍 우수상

(주) 그랩 우수 프로그램 개발

2025.05 · AWSKRUG

AWS한국사용자모임 발표

AI agent 스크립트 튜닝 관련 발표

ComputerScience

Development

Engineering

Trouble Shooting

GUESTBOOK

첫 마음부터
함께 나누는 온기

방명록 작성하러 가기

SUBSCRIBE

최신소식을
편하게 만나보세요.

worktree

정의

git worktree는 “하나의 저장소로 여러 작업 디렉터리”를 동시에 다루는 기능

git worktree는 하나의 Git 저장소(.git 디렉터리)를 공유하면서도, 서로 다른 폴더(working tree)에서 각각 다른 브랜치를 동시에 체크아웃할 수 있게 해주는 기능입니다. 즉 “브랜치 전환(switch/checkout) 때문에 작업을 끊지 않고”, 병렬로 작업 흐름을 유지하는 데 최적화되어 있습니다.
핵심: “같은 .git(오브젝트/히스토리) + 다른 작업 디렉터리(파일/인덱스/HEAD)”
main worktree(기본 작업 폴더) + linked worktree(추가 작업 폴더)를 만들 수 있습니다.
핵심 메시지
“브랜치 전환 비용(빌드/테스트/의존성/IDE 인덱싱)을 줄이고, 컨텍스트 스위칭을 없애는 것”이 worktree의 진짜 가치입니다.

 

동작 원리

왜 “브랜치가 동시에 열리는데” 저장소는 하나로 유지되는가

1) .git(오브젝트 DB)은 공유, 작업 폴더는 분리

worktree는 “Git 히스토리/오브젝트(pack, objects)는 공유”하되, 각 작업 폴더는 자기만의 체크아웃 파일, 인덱스(index), HEAD를 가집니다. 그래서 동일 저장소로도 서로 다른 브랜치를 각각의 폴더에서 동시에 편집할 수 있습니다.

2) “같은 브랜치”는 원칙적으로 worktree 2개에 동시에 체크아웃 불가

Git은 보통 하나의 브랜치가 동시에 여러 worktree에서 체크아웃되는 것을 막습니다. (같은 브랜치에 대해 서로 다른 폴더에서 동시에 커밋/리셋 등이 발생하면 혼선이 생기기 때문) 대신 실험/검증 목적이면 detached HEAD worktree를 만들어 “브랜치 없는 임시 작업”이 가능합니다.
TIP
“임시 실험(work-in-progress)을 하고 싶지만 브랜치를 더럽히고 싶지 않다”면 detached worktree를 만들면 됩니다. (공식 문서에도 이 패턴이 등장합니다.)

 

언제 쓰나

worktree가 “진짜 효율”을 만드는 대표 시나리오

1) 기능 개발 중 긴급 핫픽스

feature 브랜치 작업을 멈추지 않고, 별도 폴더에서 hotfix 브랜치로 즉시 대응

2) 서로 다른 버전 동시 빌드/테스트

release/maint 브랜치와 main 브랜치를 동시에 열어 비교, 회귀 테스트, 디버깅

3) PR 리뷰/재현용 환경 분리

현재 작업 폴더는 그대로 두고, PR 브랜치를 별도 폴더에 체크아웃해 재현/검증
GOOD
브랜치 전환 대신 폴더를 전환
IDE/빌드 캐시가 유지되어 컨텍스트 스위칭 비용이 크게 줄어듭니다.
BAD
한 폴더에서 계속 checkout/switch
빌드/의존성/IDE 인덱스가 흔들리며 생산성이 떨어질 수 있습니다.

 

기본 사용법

add / list / remove / prune — 이것만 알아도 실전 가능

1) worktree 생성: 기존 브랜치 / 새 브랜치

# (권장) 저장소 폴더의 “형제 디렉터리”에 worktree를 두는 패턴
# 예: repo/  (main worktree)
#     repo-wt/feature-login  (linked worktree)

# 이미 존재하는 브랜치를 새 폴더에 체크아웃
git worktree add ../repo-wt/feature-login feature/login

# 새 브랜치를 만들면서 worktree 생성
git worktree add -b feature/hotfix-1 ../repo-wt/hotfix-1 main

2) detached(임시) worktree: 실험/검증용

# 브랜치 없이(Detached HEAD) 현재 HEAD 기준으로 임시 worktree 생성
git worktree add --detach ../repo-wt/tmp-try

# 특정 커밋/태그 기준으로 임시 worktree 생성
git worktree add --detach ../repo-wt/tmp-tag v1.2.0

3) 목록 확인

git worktree list

4) 삭제 / 정리

# worktree를 “정상 절차”로 제거
git worktree remove ../repo-wt/feature-login

# 폴더를 실수로 지워버린 경우(.git/worktrees 메타가 남음) 정리
git worktree prune
TIP
worktree를 파일 탐색기로 지워도 “겉보기엔” 사라지지만, Git 내부 메타데이터가 남을 수 있습니다. 그럴 땐 git worktree prune으로 정리합니다.

 

실전 워크플로우

“feature 진행 중 hotfix”를 worktree로 끊김 없이 처리하기

시나리오

main worktree에서는 feature/login을 개발 중인데, 운영 버그로 hotfix가 급하게 필요하다고 가정합니다. 일반적인 switch 전략은 “작업 중인 변경사항을 stash/커밋/정리”해야 하므로 흐름이 끊깁니다. worktree는 이 비용을 제거합니다.
# (1) hotfix용 worktree 생성
git worktree add -b hotfix/urgent-1 ../repo-wt/hotfix-urgent main

# (2) hotfix 폴더로 이동해서 수정/테스트/커밋
cd ../repo-wt/hotfix-urgent
# ... fix ...
git commit -am "fix: urgent issue"

# (3) PR 생성 / main에 머지 후, worktree 정리
cd -  # 원래 worktree로 복귀
git worktree remove ../repo-wt/hotfix-urgent

 

주의사항

worktree가 편해지는 만큼, 실수 포인트도 있다

1
브랜치 중복 체크아웃
같은 브랜치를 다른 worktree에 또 체크아웃하려 하면 실패할 수 있습니다. 임시 목적이면 detached로 분리하세요.
2
디스크 사용량
worktree마다 체크아웃 파일/빌드 산출물이 생깁니다. (예: node_modules) “캐시/스토어” 전략을 같이 쓰면 체감이 좋아집니다.
3
폴더를 강제 삭제했을 때 메타 잔존
rm -rf로 폴더만 지우면 목록에는 남을 수 있습니다. prune으로 정리하세요.

 

요약

체크리스트로 마무리

CHECK
✅ 목적: 한 저장소에서 여러 브랜치를 동시에 열린 상태로 작업
✅ 핵심 명령: add / list / remove / prune
✅ 실전 패턴: feature 유지 + hotfix worktree 분리
✅ 주의: 같은 브랜치 중복 체크아웃 제한, 강제 삭제 후 prune 필요
728x90