초보 개발자는 대부분 반복을 통해 Git을 익힙니다. git pull, git push, git commit 같은 기본 명령어의 의미를 빠르게 배우죠. 하지만 더 큰 프로젝트에 참여하고 팀과 협업하게 되면, 프로젝트를 함께 작업하는 여러 사람 사이에서 코드베이스의 버전 관리 히스토리를 깔끔하게 유지하는 데 도움이 되는 고급 Git 명령어를 익혀야 합니다.
git cherry-pick이 바로 그런 명령어 중 하나입니다. 이 명령은 한 브랜치에서 특정 커밋만 골라 다른 기능 브랜치나 마스터(master) 브랜치의 HEAD에 붙일 때 사용합니다.
git cherry-pick이란?
cherry-pick(체리픽)을 조별 과제에 비유해 볼 수 있습니다. 각자 맡은 파트를 작업한 뒤, 마지막에 모든 부분을 하나로 합치는 것이죠. 이때 흐름을 자연스럽게 만들기 위해 특정 섹션의 일부를 가져와 다른 섹션에 붙여 넣는 경우가 있습니다.
git cherry-pick도 본질적으로 같은 작업입니다. 하나의 기능 브랜치에서 커밋 하나 또는 여러 개를 가져와, 새로운 커밋 형태로 다른 브랜치에 붙이는 것입니다. 실제 동작 방식을 살펴보겠습니다.
위의 기본 다이어그램은 Git으로 관리되는 프로젝트의 두 개 브랜치를 나타냅니다. 알파벳은 각 브랜치에서 저장소에 이루어진 서로 다른 커밋을 의미하고, 점선은 오래된 것부터 최신 것까지의 히스토리를 나타냅니다. 아래 단계를 따라가며 두 브랜치의 구조와 동작 방식을 상상해 보세요.
git cherry-pick 수행 단계
각각의 Git 커밋, 즉 위 그림의 알파벳 하나하나를 '체리'라고 생각해 보세요. 체리마다 고유한 해시(hash)가 연결되어 있습니다. 해시가 무엇인지 잘 모르겠다면, 해당 커밋에 연결된 지문(fingerprint) 또는 고유 식별자라고 생각하면 됩니다. 체리를 따서 다른 브랜치에 추가하려면 이 해시 값이 필요합니다.
- git checkout <커밋을 가져올 브랜치 이름>
커밋(체리)을 가져올 브랜치로 먼저 체크아웃합니다. - git reflog
Git 참조 로그인reflog는 최근 수행된 작업들을 기록합니다. 예시는 다음과 같습니다.% git reflog
bf654bb (HEAD -> master, origin/master) HEAD@{0}: commit: last commit message made
2394353 HEAD@{1}: commit: where head was 2 commit messages ago
b4b51eb HEAD@{2}: commit: where head was 3 commit messages ago
대규모 팀에서 작업한다면 커밋 날짜, 시간, 작성자 등 더 많은 정보가 reflog에 포함될 수 있습니다. 여기서는 커밋 해시, 커밋이 이루어진 브랜치, 수행된 작업, 실제 커밋 메시지를 확인할 수 있습니다.
다른 브랜치에 추가하고 싶은 커밋을 찾았다면 해당 해시 값을 메모해 두세요. 해시는 예시에서 각 줄 맨 앞에 있는 숫자와 문자로 이루어진 문자열입니다. - git checkout <커밋을 추가할 브랜치 이름>
해시를 확인했다면, 이제 커밋을 추가할 브랜치로 전환합니다. - git cherry-pick [-x] <커밋 해시>
git cherry-pick명령어에 커밋 해시를 함께 입력하면, 해당 커밋이 그 브랜치의 작업 트리(working tree)에 추가됩니다. 공개(public) 브랜치에서 체리픽을 할 때는-x플래그를 사용하세요. 이 플래그를 붙이면 원래 어떤 커밋에서 체리픽했는지를 남기는 주석이 커밋 메시지에 추가됩니다.
체리픽 이후 다이어그램이 어떻게 변하는지 다시 살펴보겠습니다.
이 예제에서 선택한 '체리', 즉 커밋 해시는 'C'입니다. 위의 단계를 모두 수행하면 선택한 커밋 'C'가 두 번째 브랜치의 히스토리에 새로운 커밋으로 추가됩니다.
마무리 팁
마지막으로 해야 할 일은 체리픽한 커밋에 있던 노트(note)를 옮기는 것입니다. git notes copy <체리픽한 커밋 해시> <새 커밋 해시> 명령을 사용하면 원본 커밋에 달려 있던 노트를 그대로 복사할 수 있습니다.
또한 체리픽 과정에서 발생할 수 있는 병합 충돌(merge conflict)이 있다면 반드시 해결해야 합니다.
이 글에서는 git cherry-pick이라는 고급 Git 명령어를 사용하는 과정을 살펴보았습니다. 한 브랜치의 특정 커밋만 골라 다른 브랜치에 추가해야 할 때 이 명령어를 활용해 보세요.