[Git] 5.3. 커밋 하나만 떼서 지금 브랜치에 붙이기 : cherry-pick

업데이트:

카테고리:

태그: , , , ,

cherry-pick 명령어

cherry-pick이란 다른 브랜티의 커밋 하나만 브랜치에 반영하는 것이다.

예를 들면, 어떤 회사에서 개발자들이 [master] 브랜치에서 각자의 브랜치인 [feat/a], [feat/b], [feat/c] 등에서 작업을 한 뒤 [master] 브랜치에 merge하고 굵직한 개발이 끝나면 [master] 브랜치의 코드를 [latest] 브랜치에 반영하여 배포한다고 생각하자. [latest] 브랜치에서 버그가 발생했는데, [latest] 브랜치에 merge한 [master] 브랜치에는 이미 여러 개발자가 commmit을 해놓아 그래프는 쭉쭉 뻗어나가고 있을 때 [master] branch에 버그를 해결하는 커밋을 추가하고 이를 똑 떼어내어 이 커밋만 [latest] branch에 붙이는 것이다.


실습

[feat/a] 브랜치, [feat/b] 브랜치를 만들고 [feat/a] 브랜치의 커밋 하나를 [feat/b] 브랜치에 반영해본다.


가. [feat/a] 브랜치 생성

image

우선 현재 [main] branch를 base로 [feat/a] branch를 만든다. 그리고 이 [feat/a] branch에 커밋을 연달아 3개 추가할 것이다. 먼저 README.md 파일에 ‘Git으로 놀아보자!’ 텍스트를 추가하고 커밋한다.


나. [feat/a] 브랜치에 커밋 생성

image

커밋 메시지는 ‘첫 번째 커밋’이다.

image

cherrypick.md 파일을 만든 뒤, ‘체리픽 실습하기’ 텍스트를 입력하고 Sourcetree에서 사진처럼 ‘두 번째 커밋 - 탐나는 커밋’ 커밋 메시지와 함께 커밋한다.

image

마지막으로 README.md 파일에 ‘Let’s git it!’ 이라는 텍스트를 추가하고, Sourcetree에서 ‘세 번재 커밋’이라는 커밋 메시지와 함께 커밋한다.

image

이렇게 커밋 그래프가 예쁘게 만들어졌다. 이제 히스토리에서 [main] 브랜치를 더블클릭해서 [main] 브랜치에 체크아웃한다. [main] 브랜치로 돌아가는 것이다.


다. [feat/b] 브랜치 생성

image

[main] 브랜치를 베이스로 다시 [feat/b] 브랜치를 생성해보자.

image


라. [feat/b] 브랜치의 작업

[feat/b] 브랜치에서 작업을 시작한다. 우선 [git-playground]에 ‘featb.md’ 파일을 생성하고 ‘feat/b 브랜치’ 라는 텍스트를 입력한 뒤 저장한다.

image

Sourcetree의 [feat/b] branch에서 ‘featb.md’ 파일을 스테이지에 올리고 ‘featb 기능 추가’라는 커밋 메시지와 함께 커밋한다.

image

커밋 그래프는 위와 같다.


마. cherry-pick의 활용

[feat/a]는 고양이가, [feat/b]는 문어가 작업한다고 가정하자. 그런데 문어가 [feat/a]의 ‘두 번째 커밋 - 탐나는 커밋’만을 가져와서 [feat/b] 브랜치에 반영하고 싶을 때 단순히 [feat/a] 브랜치와 병합하게 되면 원치 않는 ‘첫 번째 커밋’과 ‘세 번째 커밋’까지 [feat/b] 브랜치에 반영된다. 이를 피하고 싶다면 cherry-pick을 사용한다.

image

[feat/b] 브랜치에 있는 상태에서 복제하기를 원하는 ‘두 번째 커밋 - 탐나는 커밋’을 우클릭 한 뒤, [체리 픽]을 선택한다.

image

충돌되는 변경사항이 있어서 해결해야 한다는 오류 메시지와 함께 체리 픽이 중단되었다. 스테이지 위아래의 파일을 확인해보니 ‘cherrypick.md’ 파일이 있었다. 이를 스테이지에 올리고 ‘두 번째 커밋 - 탐나는 커밋 체리 픽’이라는 커밋 메시지와 함께 커밋을 해주었다.

image

이렇게 ‘두 번째 커밋 - 탐나는 커밋’과 같은 코드의 커밋이지만, 커밋 메시지도 새롭게 쓸 수 있다. 또한 커밋 아이디도 다른 것을 보아 변경사항은 복사해왔지만 서로 다른 커밋이라는 점도 주목할 필요가 있다.


Reference

  • 팀 개발을 위한 Git GitHub 시작하기, 한빛미디어, 정호영,진유림

댓글남기기