Git cherry-pick 사용법

Yeongsu Han
Cross-Platform Korea
5 min readAug 12, 2019

다른 개발자와 협업하다가 브랜치가 여기저기 꼬여서
도저히 내 코드를 살릴 수 없는 상황이 되었나요?

rebase또는merge를 해야하는데 컨플릭트를
어디서부터 어떻게 해결해야 할지 감이 안 오나요?

git merge war

협업하면서 당면하는 문제들

열심히 feature를 만들어서 pull-request 를 보냈지만 시작시점부터 설계를 잘못했거나 코드베이스를 잘못 이해해서 리셋을 통해 아예 새로 시작하는 마음으로 pull-request를 보내야 하는 경우가 있습니다.(좌절…)

아까운 내 코드들…

이런경우 내가 이전에 작성한 코드를 모두 날리지 않고 제대로 작성된 코드(커밋)를 선택적으로 가져올 수 있다면 좌절감이 좀 덜 할 수 있을 것 같은데요…

이런 경우에 유용한 cherry-pick commit에 대해서 알아보기 위해 다음처럼 상황을 가정해보겠습니다

feature브랜치의 최종커밋을 보니 다음처럼 잘못된 내용을 커밋 했네요

잘못된 커밋
+ feature 브랜치에서 다음처럼 잘못된 커밋을 했습니다.+  - 체리픽 커밋은 다른 브랜치를 내가 작업한 브랜치로 합치는 커밋이랍니다!!

보통의 경우라면 이 부분을 수정하거나 삭제하고 다시 커밋을 하겠지만 conflict등의 여러가지 복잡한 경우가 있다고 가정하고 작성의도에 맞게 cherry-pick커밋을 활용해 보겠습니다

먼저 이전 브랜치(feature/add-title)는 남겨둔 채 다음처럼 master 브랜치 에서 feature/add-title-correct 브랜치를 새로 만들고 checkout 한 다음

체리픽을 위한 임시 브랜치 생성

git cherry-pick명령어를 통해 내가 원하는(올바른) 커밋만 가져 오겠습니다

커밋내용은 git cherry-pick을 터미널에 입력한 뒤 tab을 눌러 현재 브랜치에서 가져올 수 있는 커밋들을 자동완성 된 히스토리를 통해 볼 수 있습니다

(b8ffcad) add #title 커밋은 단순히 #깃 체리픽이란 이라는 타이틀만 작성한 올바른 커밋입니다. 이 커밋은 가져가는게 좋겠습니다

(feature/add-title-correct) % git cherry-pick b8ffcadHAED                  feature/add-title                masterORIGIN_HEAD           feature/add-title-correct59924ff   -- [59924ff] commit incorrect description (23minutes ago)b8ffcad   -- [b8ffcad] add #title (27minutes ago)
  • cherry-pick 실행
git cherry-pick b8ffcad(가져 가고 싶은 커밋넘버)

명령어를 실행하고 히스토리를 보니 내가 원하는 커밋이 새로운 브랜치에서 정상적으로 들어온 것이 보입니다

임시브랜치에 add#title 커밋이 생성된것을 확인

단순하고 간단한 예시지만 cherry-pick commit의 유용성이 느껴지시나요? 이후에는 새로 만든 브랜치에서 다시 pull-request를 보내도 되겠지만 원격으로(GitHub 등) 이미 보낸 requestclose하고 다시 새로운 요청을 만드는 것은 번거롭고 깔끔하지 못한 방법이므로 기존 브랜치로 checkout 한 뒤 새로운 브랜치에 reset 해보겠습니다

git checkout feature/add-titlegit reset feature/add-title-correct — hard

여기서 — hard 옵션이 없을 경우 기존 브랜치(feature/add-title)에서 작업한 내용이 unstaged된 채 남아 있으니 필요한 경우가 아니라면 옵션을 추가 하는 것이 좋습니다

(feature/add-title) % git reset feature/add-title-correct — hardHEAD is now at 3981811 add #title

소스트리 같은 git gui툴을 사용한다면 다음처럼 커밋메세지를 우클릭 하고cherry pick을 클릭해서 실행 할 수도 있습니다

소스트리를 활용한 체리픽

최종결과

원래 브랜치를 reset한 뒤 올바른 커밋을 수행
git diff master
  • diff 결과
+# 깃 체리픽(Git cherry pick)++ 깃 체리픽에 대해서 제대로 된 설명을 넣어서 커밋해 봅시다!+  - 깃 체리픽은 원하는 브랜치를 해당하는 커밋 내용만 반영, 업데이트 할 수 있는 기능입니다 !

지금까지 특별한 경우가 아닌 이상 잘 쓰지 않는 기능이지만 알아두면 개발자들의 고생을 많이 줄여줄 수 있는 cherry-pick에 대해서 알아봤습니다

감사합니다 🙃

블로그에 이것저것 개발 관련 지식들을 작성하고 있습니다https://awesomezero.com

--

--