rein's world

git worktree를 활용해서 일하기

지난 몇 달(6? 12?) 사이의 프로그래밍 작업은 아래와 같은 식으로 주로 진행했다.

  1. 새로운 작업에 대해서 git worktree 로 작업 공간을 준비한다. git worktree add -b feature-foo-1 ../feature-foo-1 origin/main
  2. 새 작업 공간에서 작업을 수행한다.1 해당 작업 공간은 feature-foo-1 branch 에 해당하고, 여기서 필요한 수정/테스트를 진행한다.
  3. 새 작업 공간에서 한 작업을 mainline에 반영한다.
  4. 1에서 만든 작업 공간을 제거한다: git worktree remove --force ../feature-foo-12

이 작업 방식이 꽤 잘 맞았는데,

  • git worktree list 로 동시에 진행하고 있는 작업을 바로 알 수 있다. 예를 들어 hotfix-bar를 작업하다가 feature-foo로 되돌아가는게 별 지장없이 이루어지더라.
  • 저장소에 있는 코드가 아닌, 빌드 시간에 생성하는 코드 때문에 겪는 문제가 없다. Branch를 오가면 이 코드도 새로 생성해야하는데, 이로 인한 문제를 피할 수 있다.3 특히나 파일 변경 시간 기준으로 코드 생성 여부를 처리하는 도구를 쓴다면, 이런 문제가 더 쉽게 생기더라.
  • 수정 사항이 의도치 않은 branch에 적용되거나 하는 일이 없더라. 하나의 작업 공간에서 여러 branch를 오가면 작업하면 종종 문제를 겪게 되더란.
  • 임시 파일 관리. 작업 하다가 임시 파일이 생기면 git clean -d -f -- {sub directory} 같은 명령으로 정리하곤 하는데, git wortree remove ... 면 신경쓸게 없다.

이전에는 주로 어떻게 했었나? git clone 을 로컬 저장소에 대해서 실행하면 새로 복제한 저장소는 pack파일을 공유하고, 이 결과 추가적인 용량 증가가 거의 없는 상태에서 새 작업 공간을 만들 수 있었다. 다만 이 경우엔 branch나 commit 들을 여러 복제된 저장소 간에 공유하지 않기 때문에, 일부 작업 간에 commit을 cherry-pick 하거나 할 때 불편하다.



  1. 사족을 달자면 VScode의 Peacock 확장 기능을 잘 써먹고 있다. 이걸로 작업 공간마다 다른 색을 써서 구분이 가게 해놓고 쓴다. 특히나 “Peacock: Surprise Me with a Random Color” 명령이 아주 유용하다. ↩︎

  2. 간단한 스크립트를 만들어서 이 작업을 크게 신경쓰지 않고 처리하고 있다. ↩︎

  3. 여러가지 코드 생성기로 작성한 코드를 넣을지 말지는 의견이 분분하다. 내가 일하는 환경에선 종류에 따라서 들어가는 것도 있고, 그렇지 않은 것도 있다. ↩︎