컴퓨터 옮겨가며 작업 이어가기 Feat. Git
직장 동료와 코드 리뷰를 하다 '~기능 구현 중'이라는 커밋이 눈에 띄었다. 이게 뭐냐고 물어보니 회사에서 작업하다가 집에 가서 이어하기 위해 그때까지의 작업을 저장해 놓은 커밋이라는 답을 들었다. 커밋을 그렇게 해도 되나 싶으면서도 아니면 어떻게 해야 할지 바로 떠오르지는 않았다.
작업의 진행 상황을 임시 저장하는 용도로 커밋을 사용했던 동료의 방법은 간단하고 직관적이지만 다른 사람이 볼 때 의미 없는 커밋을 쌓는다는 단점이 있었다. 당장 나만 해도 코드 리뷰를 하면서 이 커밋은 무슨 역할인지 헷갈렸다. 이 글에서는 찾은 방법에 대해 간략하게 소개해보도록 하겠다.
임시 브랜치 활용
두괄식으로 바로 소개해보자면, Git으로 임시 브랜치를 만들어 활용하는 방법이다. 이 방법을 사용하면 커밋 내역을 깨끗하게 유지하면서도 안전하게 작업 내용을 저장할 수 있다. 코드로 설명해 보자면 아래과 같다.
# 1. 임시 브랜치 생성 및 커밋
git switch -c feature/temp
git add .
git commit -m "임시 커밋"
git push origin feature/temp
# 2. 임시 작업을 이어갈 때
git checkout feature/temp
git reset HEAD~1
// ... 작업 ...
git commit -m "기능 커밋"
git push origin feature/temp --force
# 3. 작업 완료 후 원래 브랜치에 병합
git switch feature/main
git fetch origin
git merge(rebase) feature/temp
# 4. 임시 브랜치 삭제
git branch -d feature/temp
1번은 회사에서 하던 작업을 그대로 이어서 집에서 하고 싶을 때의 경우를 상정했다. 임시 브랜치를 생성해 그때까지의 작업을 임시 브랜치에 커밋한다.
2번은 퇴근 후 집에서 작업을 마저 해야 하는 경우일 것이다. 웬만하면 회사 일은 회사에서 끝내는게 좋겠지만... 그런 경우가 '간혹' 있으니까. 2번에서 기능 커밋을 하고 나면 원격 저장소와 로컬 저장소의 커밋 히스토리는 달라진다. 원격 저장소에는 아직 '임시 커밋'이 있고, 로컬 저장소에는 '기능 커밋'만 존재하기 때문에 push 할 때 force push를 해야 한다.
3번은 다음날 회사에 출근해 어제 집에서 한 작업물을 받아와야 하는 경우다. 메인 브랜치로 가 우선 fetch로 원격 브랜치를 업데이트하고 임시브랜치를 병합한다.
4번은 임시 브랜치를 삭제하는 것이다. 원격 저장소에 가서 원격 브랜치까지 정리하면 완료!
브랜치 병합 방법
작업을 완료하고 원래 브랜치와 임시 브랜치를 병합할 때 두 가지 방법이 있다. 각 조직의 정책에 따라 선택하면 될 듯 하다.
1. merge
merge는 병합 커밋을 생성하며, 브랜치의 이력이 병합된 모습을 그대로 보여준다. 협업 시 작업 흐름을 추적하기 쉽다.
A---B---C---D (feature/main-task)
\
E---F (feature/temp-branch)
# merge 병합 후
A---B---C---D---G (feature/main-task, merge commit)
\ /
E---F
2. rebase
커밋을 재배치하여 히스토리를 깔끔하게 정리한다. 원본 커밋이 사라지기 때문에 협업 시 주의가 필요하다.
A---B---C---D (feature/main-task)
\
E---F (feature/temp-branch)
# rebase 병합 후
A---B---C---D---E'---F' (feature/temp-branch)
여담
사실 main 브랜치에서 임시 커밋을 하는 방법도 같은 원리로 동작할 수는 있다. 임시 커밋을 reset HEAD로 돌려버리면 그만일 수 있다. 하지만 이 방법은 반드시 force push를 동반하므로 같이 사용하는 브랜치라면 분명 위험 부담이 있다. 브랜치 하나 생성한다고 시간이 엄청 늘어나는 것도 아니니 위의 방법대로 안전하게 개발하는게 낫다고 생각한다.