git worktree로 clone 없이 브랜치마다 작업 폴더 만들기
요약
- 여러 브랜치를 동시에 다룰 때, 저장소를 여러 번 clone하는 대신 git worktree로 작업 폴더만 추가할 수 있음
- clone 3개는 별개 저장소 3개라 fetch를 3번 해야 하지만, worktree 3개는 저장소 1개를 공유해서 fetch 한 번이면 됨
- 작업 공간을 늘릴 때는 저장소를 통째로 복사하기 전에, 함께 써도 되는 것(커밋과 remote)과 따로 둬야 하는 것(작업 폴더)을 먼저 나눠 보면 됨
상황: 여러 브랜치를 동시에 다뤄야 할 때
- 기능 브랜치 작업 중에 다른 브랜치의 이슈를 확인하거나, PR 리뷰와 개발을 같이 하거나, base 브랜치의 최신 변경을 반영해야 할 때가 있음
- 폴더 하나만 쓰면 다른 브랜치로 넘어갈 때마다 현재 작업을
stash로 치웠다가 돌아와서 다시 꺼내야 함
git stash
git switch feature/other
# 확인
git switch feature/current
git stash pop
- 그래서 많은 개발자가 저장소를 여러 번 clone해서
some-api,some-api2,some-api3처럼 폴더를 나눠 씀
불편: 여러 clone을 쓰면 생기는 일
- 여러 clone을 쓰면 브랜치 전환 문제는 줄지만, clone끼리는 서로 별개 저장소라 관리할 것이 늘어남
- clone마다
git fetch를 따로 해야 하고, 한쪽에서 만든 브랜치도 다른 clone에는 자동으로 보이지 않음 - 저장소를 통째로 복사하므로 clone을 하나 늘릴 때마다 디스크를 그만큼 더 씀
소개: worktree는 작업 폴더만 늘림
- git worktree는 저장소를 하나 더 복사하는 clone과 달리, 저장소 하나에 브랜치마다 작업 폴더만 따로 추가하는 기능임
- clone처럼 브랜치마다 폴더가 따로 있으니, 브랜치를 바꿀 때
stash없이 폴더만 옮기면 됨 - 저장소 객체와 히스토리를 공유해서 clone보다 빨리 만들어지고 디스크도 적게 씀
- 한 worktree에서
git fetch origin을 실행하면 다른 worktree에서도 그 remote 정보를 바로 쓸 수 있음 - 같은 저장소를 여러 창으로 열어 둔 것에 가까워서, 여러 PR을 동시에 다루기 좋음
사용법: 만들고, 쓰고, 지우기
- worktree 경로는 저장소 바깥에 두는 것을 권장하고, 안에 두면
.gitignore에 추가해야 함
# 새 브랜치를 만들면서 worktree 생성
git worktree add -b feature/auth ../_worktrees/some-api/feature-auth
# 이미 있는 브랜치에 worktree 연결
git worktree add ../_worktrees/some-api/feature-auth feature/auth
# 경로의 마지막 이름(hotfix)과 같은 브랜치를 연결 (없으면 새로 만듦)
git worktree add ../_worktrees/some-api/hotfix
# worktree 목록 보기
git worktree list
git branch목록에서+기호가 붙은 브랜치는 다른 worktree가 쓰고 있는 브랜치임- worktree 폴더로 이동하면 평범한 git 저장소처럼 커밋, fetch, merge, push를 하면 됨
- worktree 안에서도
git switch는 되지만 다른 worktree가 쓰고 있는 브랜치로는 옮길 수 없으므로, 브랜치를 바꾸려면 폴더를 옮기면 됨
# worktree 삭제 (브랜치는 남음)
git worktree remove ../_worktrees/some-api/feature-auth
# 커밋하지 않은 변경이 있어도 강제로 삭제
git worktree remove --force ../_worktrees/some-api/feature-auth
# rm -rf로 직접 지웠다면 남은 메타데이터 정리
git worktree prune
# 브랜치까지 지우기
git branch -d feature/auth