Git Cherry-pick: 꼬여버린 브랜치에서 원하는 커밋만 수술하듯 추출하기
"Feature 브랜치에서 10가지 기능을 정신없이 개발하고 있었는데, 상사가 당장 3번째에 작업했던 '결제 버그 수정' 건만 따로 떼어내서 당장 운영 서버(Main)에 배포하라고 지시합니다."
협업을 하다 보면 반드시 마주치는 식은땀 나는 상황이다. 10개의 커밋이 엉켜있는 브랜치를 통째로 git merge 해버리면 아직 미완성인 나머지 9개의 기능까지 운영 서버에 딸려 들어가 대형 사고가 난다. 그렇다고 코드를 눈으로 보고 메인 브랜치에서 수동으로 다시 복사해서 붙여넣자니 휴먼 에러가 발생할 것이 뻔하다.
초보자들은 코드를 텍스트 에디터에 따로 빼두고 브랜치를 바꾼 뒤 덮어쓰는 위험한 원시적 노동을 한다. 본 가이드에서는 거대한 커밋 뭉치 속에서 딱 내가 원하는 하나의 커밋만 외과 의사처럼 정밀하게 잘라내어 타겟 브랜치에 이식하는 Git Cherry-pick (체리픽) 아키텍처를 단호하게 제시한다.
1단계: 핵심 원리 분석 (커밋의 원자성)
Git의 커밋(Commit)은 앞뒤 맥락이 모두 섞인 덩어리처럼 보이지만, 사실 각각의 커밋은 '코드의 변경 사항(Diff)'을 담고 있는 독립적인 캡슐(원자)이다.
체리픽(Cherry-pick)은 케이크 위에 올려진 맛있는 체리만 쏙 골라 먹는다는 뜻이다. 즉, 복잡한 Feature 브랜치를 메인에 병합(Merge)하지 않고, 오직 '결제 버그 수정'이라는 특정 커밋의 고유 해시(Hash) 번호만 지정하여 그 변경 사항만을 현재 브랜치로 복사해 오는 강력한 명령어다.
2단계: 완벽한 해결책 - 체리픽 실전 수술 가이드
우선 내가 가져오고 싶은 커밋의 정확한 번호를 알아야 한다. 작업하던 브랜치에서 터미널에 git log --oneline을 쳐서 빼내고 싶은 커밋의 7자리 해시값(예: a1b2c3d)을 복사해 둔다.
그다음 코드를 이식받을 타겟 브랜치(주로 main)로 이동하여 수술을 시작한다.
# 1. 코드를 반영할 메인 브랜치로 이동
git checkout main
# 2. 메인 브랜치를 최신 상태로 업데이트
git pull origin main
# 3. 방금 복사해 둔 특정 커밋 번호만 정밀 이식(Cherry-pick)
git cherry-pick a1b2c3d
# 여러 개의 커밋을 가져오고 싶다면 띄어쓰기로 나열
# git cherry-pick a1b2c3d e4f8a9b
이 명령어를 치는 순간, Feature 브랜치의 다른 불안정한 코드들은 전혀 건드리지 않은 채 오직 a1b2c3d 커밋의 코드 수정 사항만 메인 브랜치에 안전하게 반영된다.
3단계: 트러블슈팅 - 체리픽 도중 충돌(Conflict)이 발생했다면?
과거의 커밋을 현재의 최신 브랜치로 가져오는 과정이므로, 필연적으로 병합 충돌(Conflict)이 발생할 수 있다. 에러 창이 떴다고 쫄 필요 없다.
VSCode 등의 에디터를 열어 충돌이 난 파일의 코드를 알맞게 정리한 후, git add . 로 수정한 파일을 스테이징 영역에 올린다. 그리고 절대 git commit을 치지 말고, git cherry-pick --continue를 입력하여 중단되었던 체리픽 수술을 우아하게 마무리하면 된다. 만약 꼬여서 포기하고 싶다면 언제든 git cherry-pick --abort를 쳐서 타임머신을 타고 되돌아갈 수 있다.
아키텍트의 시선 (Insight)
Git은 코드를 저장하는 클라우드 외장하드가 아니다. 커밋 하나하나는 프로젝트에 가치를 더하는 논리적인 '가치 단위'여야 한다. 체리픽이 자유롭게 작동하려면, 평소에 기능을 개발할 때 한 커밋에 여러 가지 성격의 작업을 섞지 말고 철저하게 단일 목적성(Single Responsibility)을 갖도록 쪼개서 커밋하는 전문가적 습관이 선행되어야 한다.
댓글
댓글 쓰기