본문으로 건너뛰기
개발 머꼬
개발 노트Git
hohyeon.dev23

브랜치를 바꿀 때마다 node_modules를 다시 설치하기 싫어서 찾은 git worktree

  • #Engineering Note
  • #Git

문제 발생

기능 브랜치에서 한창 작업 중인데 급한 버그 수정이 필요해서 git checkout main으로 전환하려니, 현재 변경사항을 커밋하거나 stash해야 했고, 브랜치를 오갈 때마다 node_modules나 빌드 캐시가 어긋나 다시 설치/빌드해야 하는 번거로움이 반복됐습니다.

원인 분석

일반적인 git checkout/git switch하나의 작업 디렉터리 안에서 브랜치만 바꿔치기합니다 — 파일 내용은 그 브랜치의 상태로 덮어써지고, 이전 브랜치의 미커밋 변경사항은 그대로 두면 충돌하므로 커밋하거나 stash해야만 전환할 수 있습니다. 게다가 의존성 설치 상태나 빌드 산출물은 브랜치를 인식하지 못하므로, 브랜치를 바꿀 때마다 어긋난 상태가 되기 쉽습니다.

해결 방안

**git worktree**는 같은 저장소(같은 .git 히스토리)를 공유하면서, 브랜치마다 완전히 독립된 별도의 디렉터리를 만들어줍니다.

git worktree add ../meokko-hotfix hotfix/urgent-bug

이 명령은 ../meokko-hotfix라는 새 디렉터리를 만들고 그 안에 hotfix/urgent-bug 브랜치를 체크아웃합니다 — 원래 작업 디렉터리는 기존 브랜치, 상태, node_modules, 빌드 캐시를 그대로 유지한 채 전혀 건드리지 않습니다. 두 디렉터리에서 동시에 서로 다른 브랜치 작업을 각자 진행할 수 있습니다.

  1. stash가 전혀 필요 없습니다 — 원래 디렉터리의 미커밋 변경사항은 그대로 있고, 새 worktree에서 별도로 작업하면 됩니다.
  2. 작업이 끝나면 worktree를 정리합니다.
git worktree remove ../meokko-hotfix
  1. 현재 등록된 worktree 목록은 git worktree list로 확인할 수 있습니다.
  2. 같은 브랜치를 두 worktree에서 동시에 체크아웃할 수는 없습니다 — Git이 이를 막습니다(같은 브랜치를 두 곳에서 동시에 수정하면 상태가 꼬이기 때문입니다). 브랜치마다 각자의 worktree를 갖는 구조라고 생각하면 됩니다.
  3. CI 환경이나 여러 버전을 동시에 빌드/테스트해야 하는 자동화 스크립트에서도, 매번 clone하는 대신 worktree로 가볍게 여러 브랜치 상태를 동시에 준비하는 용도로 활용할 수 있습니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.