github

Git worktree란 무엇이며, 왜 사용해야 할까요? (새 탭에서 열림)

Git worktree는 하나의 저장소에서 여러 작업 디렉터리를 동시에 운영하게 해 주는 기능으로, 브랜치 전환과 git stash 없이 여러 작업을 병렬로 진행할 수 있게 한다. 특히 AI 에이전트와 개발 세션을 동시에 실행하는 환경에서 각 작업의 맥락을 보존하고 전환 비용을 줄여 주기 때문에 최근 주목받고 있다. 다만 의존성 저장 공간, 디렉터리 정리, 동일 브랜치 중복 체크아웃 등의 관리 부담은 남아 있다.

브랜치 전환과 git stash의 부담

  • 기존 방식에서는 긴급한 버그를 처리하기 위해 현재 작업을 먼저 임시 저장해야 한다.
    git stash "wip feature login"
    
  • 이후 main 브랜치로 이동하고 최신 변경 사항을 받은 뒤, 별도의 핫픽스 브랜치를 생성한다.
    git checkout main
    git pull origin main
    git checkout -b hotfix-bug
    
  • 수정·커밋·푸시·병합이 끝나면 다시 원래 브랜치로 돌아가 stash pop을 실행한다.
  • 이 과정에서 다음과 같은 비용이 발생한다.
    • 작업 파일과 에디터 상태를 반복해서 다시 로드해야 함
    • 변경된 의존성에 따라 node_modules 등을 재설치할 수 있음
    • 복잡한 stash 충돌이 발생할 수 있음
    • 현재 작업의 맥락을 잃기 쉬움
  • 일부 개발자는 이를 피하기 위해 같은 저장소를 여러 번 clone하기도 하지만, 저장 공간과 관리 부담이 커진다.

Worktree를 이용한 병렬 작업

  • git worktree add를 사용하면 기존 작업 디렉터리를 그대로 둔 채 별도의 디렉터리에서 다른 브랜치를 체크아웃할 수 있다.
    git worktree add ../hotfix-workspace -b hotfix-bug main
    
  • 이 명령은 다음 작업을 한 번에 수행한다.
    • 기존 프로젝트 옆에 hotfix-workspace 디렉터리 생성
    • main을 기반으로 hotfix-bug 브랜치 생성
    • 새 디렉터리에서 해당 브랜치 체크아웃
  • 원래 에디터 창과 feature 브랜치의 파일 상태는 그대로 유지된다.
  • 새 디렉터리에서 독립적으로 수정하고 커밋·푸시할 수 있다.
    cd ../hotfix-workspace
    git add .
    git commit -m "fix broken submit button"
    git push origin hotfix-bug
    
  • 작업이 끝나면 임시 worktree를 제거한다.
    cd ../main-project
    git worktree remove ../hotfix-workspace
    
  • 따라서 stash 충돌 없이 여러 작업을 동시에 진행하고, 각 작업의 에디터와 파일 맥락을 보존할 수 있다.
  • VS Code 등 일부 개발 도구는 worktree를 직접 지원한다.

Worktree가 최근 주목받는 이유

  • Git worktree 자체는 2015년부터 존재했지만, 오랫동안 일반 개발자에게 널리 알려지지는 않았다.
  • 과거에는 대부분 다음과 같은 단순한 흐름을 사용했다.
    • feature 브랜치 생성
    • 작업
    • Pull Request 생성
    • 병합
    • 다음 작업 시작
  • Git GUI가 worktree를 제대로 지원하지 않거나 부가 기능처럼 취급한 점도 확산을 막았다.
  • 최근에는 AI 도구와 에이전트가 여러 개발 세션을 동시에 실행하면서 병렬 작업이 크게 증가했다.
  • 코드 작성뿐 아니라 코드 리뷰와 자동화 작업도 병렬로 진행되면서, 세션마다 독립적인 작업 공간을 제공하는 worktree가 적합해졌다.
  • GitHub Copilot 앱을 비롯한 최신 개발 도구에서는 worktree가 기본 실행 방식으로 사용되기도 한다.

Worktree 사용 시 주의점

  • 의존성 저장 공간 증가
    • 각 worktree가 프로젝트 의존성을 별도로 설치하면 node_modules나 Python 패키지가 반복 저장된다.
    • 여러 worktree를 동시에 사용하면 디스크 공간이 빠르게 줄어들 수 있다.
  • 디렉터리 정리 필요
    • 작업이 끝난 worktree를 직접 삭제하지 않으면 부모 디렉터리에 임시 폴더가 계속 쌓인다.
    • 일부 앱은 이를 자동으로 처리하지만, 터미널 사용 시 직접 관리해야 한다.
  • .gitignore 설정
    • 저장소 내부에 worktree를 만들 경우 해당 폴더가 실수로 추적되지 않도록 .gitignore에 추가해야 한다.
    • 저장소 외부에 worktree를 생성하면 이 문제를 줄일 수 있다.
  • 동일 브랜치 중복 체크아웃 제한
    • Git은 데이터 손상을 막기 위해 같은 브랜치를 여러 worktree에서 동시에 체크아웃하지 못하게 한다.

GitHub Copilot 앱에서의 사용

  • 새 세션을 만들 때 실행 위치를 선택할 수 있으며, 기본값으로 새 worktree를 사용할 수 있다.
  • 세션을 시작하면 앱에서 다음 정보를 확인할 수 있다.
    • 생성된 worktree 이름
    • worktree의 경로
    • 연결된 프로젝트
    • 해당 worktree에서 발생한 변경 사항
  • 사용자가 직접 Git 명령을 관리하지 않아도 병렬 세션을 쉽게 만들고 정리할 수 있다는 점이 장점이다.

상황에 따른 선택

  • 작업을 자주 병렬로 진행하거나 AI 에이전트를 여러 개 실행한다면 worktree가 특히 유용하다.
  • 단일 작업을 순차적으로 처리하고 기존 브랜치·stash 방식이 익숙하다면 반드시 전환할 필요는 없다.
  • 두 방식을 함께 사용하면서 작업 유형에 따라 선택하는 것도 가능하다.
  • 병렬 작업이 많은 팀이나 개발자는 worktree를 도입하되, 의존성 공유와 임시 디렉터리 정리 전략을 함께 마련하는 것이 좋다.