git branch
를 사용하여 병렬 작업을 할 수 있지만 worktree
를 사용해서 병렬 작업을 할 수 있따. worktree는 branch와 비슷하며 다만 worktree는 새로운 디렉터리에 복사를 하여 작업을 한다는 점에서 차이점이 있다
현재 작업중인 hello-rust라는 git 레포지터리가 있다
버그 수정 작업을 하고 싶어서 bugfix라는 worktree를 추가하였다. bugfix에는 hello-rust의 git 로그도 그대로 포함되어 있으며 커밋 번호까지 같다. worktree 추가는 git worktree add <path>
명령어로 추가 가능 하다
git worktree list
명령어로 현재 worktree 상태를 확인할 수 있다
bugfix에서 bug를 고치는 커밋을 추가함으로서 작업을 완료 하였다.
완료된 작업을 반영하기 위해 머지 작업을 해야한다. 머지는 git merge <name>
으로 branch 머지하는것과 같다
worktree는 branch 작업과 매우 비슷하다.
주의할 것은 같은 branch를 가리키는 복수의 작업트리를 두는 것은 불가능 하다.
$ git checkout -b branch1
$ git worktree add ../branch2
$ cd ../branch2
$ git checkout branch1
fatal: 'branch1' is already checked out at '...'
제거
git worktree remove <name>
생성될 작업트리 브랜치 이름을 -b 옵션으로 지정
git worktree add <path> -b <branch>
현재 커밋이 아니라 에 해당하는 커밋으로 작업트리를 checkout
git worktree add <path> <commit-ish>
브랜치를 생성하지 않고 현재 브랜치에서 detached HEAD를 만들어 checkout
git worktree add <path> <commit-ish> --detach
존재하는 작업트리의 위치를 로 이동
git worktree move <worktree> <newpath>
생성한 작업트리 디렉토리에 있는 .git 파일에는 메인 작업트리 디렉토리를 가리키는 경로가 적혀있다.
/project/main$ git worktree add ../bugfix
/project/main$ cat ../bugfix/.git
gitdir: [...]/project/main/.git/worktrees/bugfix
메인 작업트리안의 .git/worktrees 폴더에는 작업트리 별로 HEAD 등의 파일이 저장되어 있다.
/project/main$ ls .git/worktrees/bugfix
HEAD ORIG_HEAD commondir gitdir index logs