프로젝트 개발 중 새로운 기능 브랜치에서工作时, 긴급한 프로덕션 버그 수정이 필요한 상황이 발생할 수 있다. 보통 이럴 때 여러 가지 해결 방법을 사용하는데, 오늘은 더 효율적인 방법을 소개하려고 한다.
일반적인 해결 방법
방법 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를 활용하면 긴급 상황에서도 현재 작업을 중단하지 않고 빠르게 버그를 수정할 수 있다.