브랜치를 바꿀 때마다 node_modules를 다시 설치하기 싫어서 찾은 git worktree
문제 발생
기능 브랜치에서 한창 작업 중인데 급한 버그 수정이 필요해서 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, 빌드 캐시를 그대로 유지한 채 전혀 건드리지 않습니다. 두 디렉터리에서 동시에 서로 다른 브랜치 작업을 각자 진행할 수 있습니다.
- stash가 전혀 필요 없습니다 — 원래 디렉터리의 미커밋 변경사항은 그대로 있고, 새 worktree에서 별도로 작업하면 됩니다.
- 작업이 끝나면 worktree를 정리합니다.
git worktree remove ../meokko-hotfix- 현재 등록된 worktree 목록은
git worktree list로 확인할 수 있습니다. - 같은 브랜치를 두 worktree에서 동시에 체크아웃할 수는 없습니다 — Git이 이를 막습니다(같은 브랜치를 두 곳에서 동시에 수정하면 상태가 꼬이기 때문입니다). 브랜치마다 각자의 worktree를 갖는 구조라고 생각하면 됩니다.
- CI 환경이나 여러 버전을 동시에 빌드/테스트해야 하는 자동화 스크립트에서도, 매번 clone하는 대신 worktree로 가볍게 여러 브랜치 상태를 동시에 준비하는 용도로 활용할 수 있습니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.