개요
-
개발하다 보면 현재 작업을 멈추고 다른 브랜치로 급하게 이동해야 할 때가 생긴다.
-
예를 들어
feature브랜치에서 작업 중에 긴급 버그 수정 요청이 들어오는 상황이라면 작업 중인 내용을git stash로 임시 저장하고 브랜치를 바꿔야 했다.my-project/ ← 브랜치 하나만 체크아웃 가능 ├── .git/ ├── src/ └── ... ↑ 지금 feature/login 작업 중... hotfix 하려면? → stash → switch → 작업 → switch back → stash pop -
작업이 복잡할수록
stash와switch를 반복하는 과정이 번거롭고 실수를 유발하기 쉽다. -
Git은 이 문제를 해결하기 위해 워크트리 기능을 도입했다.
-
워크트리는 하나의 Git 저장소에 여러 개의 작업 디렉토리를 동시에 연결하는 기능이다.
-
보통 하나의 저장소는 하나의 작업 폴더를 가지는데, 워크트리는 이 제한을 없애준다.
-
각 워크트리는 서로 다른 브랜치를 독립적으로 체크아웃한 상태로 유지된다.
-
stash없이 두 브랜치를 동시에 열어두고 각자 작업할 수 있다는 뜻이다. -
내부적으로는
.git폴더를 공유하기 때문에 커밋 히스토리와 객체는 하나로 통합되어 있다.
주요 명령어
-
git worktree add <경로> <브랜치>로 새 워크트리를 원하는 위치에 생성한다.git worktree add ../my-project-hotfix hotfix -
이 명령은
../hotfix폴더를 만들고, 그 안에hotfix브랜치를 체크아웃한 상태로 세팅한다.📁 my-project/ ← feature/login 브랜치 (작업 중) ├── .git/ ← ★ 두 폴더가 이 .git을 공유함 ├── src/ └── ... 📁 my-project-hotfix/ ← hotfix 브랜치 (동시에 열려 있음) ├── .git (참조만 있음) ← 실제 .git은 위쪽 것을 가리킴 ├── src/ └── ... -
이후 터미널에서 그 폴더로 이동하면 완전히 독립된 작업 환경이 준비되어 있다.
커밋 히스토리 (공유됨) ──●──●──●──◀ main └──●── feature/login (my-project/ 에서 작업) └──●── hotfix (my-project-hotfix/ 에서 작업) -
git worktree list를 실행하면 현재 연결된 모든 워크트리의 경로와 브랜치를 확인할 수 있다. -
작업이 끝난 워크트리는
git worktree remove <경로>로 제거한다. -
워크트리 폴더를 그냥 삭제했다면
git worktree prune으로 끊어진 참조를 정리한다.
알아둘 점
- 하나의 브랜치는 동시에 두 워크트리에서 체크아웃할 수 없다.
- 같은 브랜치를 두 곳에서 동시에 수정하면 충돌을 피할 수 없기 때문에 Git이 이를 막는다.
- 메인 워크트리(처음 clone한 폴더)는 삭제할 수 없고, 추가로 만든 것만 제거 가능하다.
- 워크트리는 같은
.git을 공유하므로 한쪽에서 커밋하면 다른 쪽에서도 즉시 보인다. - IDE를 여러 창으로 열어 각 워크트리 폴더를 따로 띄워두면 실질적으로 브랜치 두 개를 병렬로 작업하는 환경이 만들어진다.