Git Worktree로 여러 브랜치에서 동시에 작업하기

프로젝트 개발 중 새로운 기능 브랜치에서工作时, 긴급한 프로덕션 버그 수정이 필요한 상황이 발생할 수 있다. 보통 이럴 때 여러 가지 해결 방법을 사용하는데, 오늘은 더 효율적인 방법을 소개하려고 한다.

일반적인 해결 방법

방법 1: 현재 작업 중지

// 기능 브랜치에서 작업 중단
git add .
git commit

// 또는 변경사항 임시 저장
git stash
git checkout master

마스터 브랜치에서 버그를 수정한 후 다시原来的 기능 브랜치로 돌아온다. stash를 사용했다면 git stash pop으로 복원한다.

방법 2: 별도 저장소 복제

원격 저장소를 다시 클론하여master 브랜치에서 버그를 수정한다.

각 방법의 단점

방법 1의 문제점은 дли고 실행 중인 테스트가 있다면 工作 디렉토리를 변경할 수 없으므로 기다려야 한다. 또한 stash를 사용할 경우 최소 4단계 이상의 명령어를 실행해야 하고 브랜치 전환이 번거롭다.

방법 2의 문제점은 원격 저장소가 크면 클론하는 데 상당한 시간이 소요된다.

해결 방안: Git Worktree

git worktree 명령어를 사용하면 이러한 문제를 효과적으로 해결할 수 있다. 이 명령어는 독립적인 작업 디렉토리를 생성하여 현재 작업 중인 파일들을 그대로 유지하면서 다른 브랜치에서 작업할 수 있게 해준다.

실습 예제

1. 초기 설정

먼저 테스트용 디렉토리를 생성하고 master 브랜치를 설정한다.

mkdir project_workspace && cd project_workspace
mkdir main_branch && cd main_branch/
git init

2. master 브랜치에 초기 코드 작성

// main_branch에서
vi config.txt
cat config.txt
master:initial:config.txt     (#1)

git add config.txt
git commit -m "init:config.txt"

3. 기능 브랜치 생성 및 개발

// master에서 새 브랜치 생성
git checkout -b feature

// feature 브랜치에서 개발
cat config.txt
master:initial:config.txt   (#1)

vi config.txt               (#2)
cat config.txt
master:initial:config.txt
feature:update:config.txt

git add config.txt          (#3)
git commit -m "feature:update"
[feature abc123def] feature:update
 1 file changed, 1 insertion(+)

touch temp.data             (#4)

git status                  (#5)
Untracked files:
  temp.data

4. 긴급 버그 발생 시 worktree 사용

기능 개발 도중 긴급 버그가 발생했다. 이때 worktree를 사용하여 별도 작업 디렉토리를 만든다. 다음은 master 브랜치를 기반으로 urgent-fix 디렉토리를 생성하는 예제이다.

// feature 브랜치에서 실행
git worktree add ../urgent-fix master

// worktree 디렉토리로 이동
cd ../urgent-fix

// 버그 수정 시작
cat config.txt
master:initial:config.txt

vi config.txt
cat config.txt
master:initial:config.txt
urgent:hotfix:config.txt

git add config.txt
git commit -m "hotfix:emergency fix"

위에서 생성한 urgent-fix 디렉토리는 master 브랜치를 기반으로 생성되었으므로, 수정 사항을 master에 직접 제출할 수 있다.

5. 기능 개발 계속하기

버그 수정이 완료되면原来的 master 디렉토리로 돌아간다. 이전에하던 작업과 tracked되지 않은 파일이 그대로 유지된다.

// urgent-fix 디렉토리에서 상위 디렉토리로
cd ..

// project_workspace/main_branch로 이동
cd main_branch

// 원래 상태 확인
git status
Untracked files:
  temp.data

필요하면 urgent-fix 브랜치를 feature에 병합할 수도 있다.

// feature 브랜치에서
git merge main_branch

Worktree의 장점

  • 여러 브랜치를 동시에Checkout하지 않고 작업 가능
  • 진행 중인 작업을 commit하거나 stash할 필요 없음
  • 저장소 전체를 다시 클론할 필요 없음
  • 필요에 따라 여러个工作 디렉토리 생성 가능

Git worktree를 활용하면 긴급 상황에서도 현재 작업을 중단하지 않고 빠르게 버그를 수정할 수 있다.

태그: Git git-worktree version-control branching DevOps

6월 16일 00:09에 게시됨