본문 바로가기

Project Management/Git & Github

[Chapter 5] Case Study(3) - cherry pick

github logo image

 

 

 

이번 시간에는 실제로 자주 이용되는 '체리픽' 기능에 대해서 살펴보도록 하겠습니다. 우선, 이 과정을 실습하기 위해서는 다음과 같이 해당 프로젝트의 브랜치 운영 원칙이 정의되어 있어야 합니다. 다음과 같은 브랜치 운영 전략을 예시로 들겠습니다. 

 

· 기본적으로 [master] 브랜치를 운용한다.
· 기능 추가 등이 필요할 때, [master]에서 [feat/xxx] 피처 브랜치를 따서 개발을 진행한다. 
  ▷ 기능 추가가 완료되면 [master]로 병합한다.
  ▷ [master]로 병합된 내용은 dev._____.com에 반영되어 확인이 가능하다.
· 일정 단위로 개발이 완료가 되면, [master]에서 latest 브랜치에 병합한다.
  ▷ [latest]에 병합된 내용은 실제 라이브 서비스에 반영된다.

 

위의 내용을 한번 도식화 해본다면, 아래 그림과 같습니다. 우선 이러한 프로세스를 기반으로 개발이 진행되고 있다고 가정해 보겠습니다. 

 

 

 

 

 


 

 

이제 문제 상황을 한번 가정해 보겠습니다. 우선 어떤 시점에 [latest] 브랜치에 출시를 진행했습니다. 그리고 [master] 브랜치에서는 몇 개의 커밋이 계속 진행되었습니다. 그런데, 갑자기 [latest] 브랜치를 통해 라이브 서비스 되던 부분에 버그가 발견되었음을 확인했습니다!

 

그래서 재빨리 [master] 브랜치에서 [fix/text-bug] 브랜치를 따서 수정을 하고 다시 [master] 브랜치에 이 번경 커밋을 병합했습니다. 이제 이 버그 수정 사항을 [latest]에 병합해서 라이브 출시를 진행해야 하는데, 생각해 보니 [latest] 병합 이후에 이미 [master]에서 몇 가지 커밋이 더 추가되어 있는 상태입니다. 지금까지의 수정사항을 모두 병합하면 마지막에 작업한 버그 수정 커밋 말고 나중에 서비스 예정인 몇 가지 기능까지 딸려 들어가게 생겼습니다. 

 

이럴 때 딱 하나의 특정 커밋만 병합이 필요합니다. 이럴 때 사용하는 특정 커밋 하나만을 선택해 브랜치에 병합하는 기능을 '체리 픽(cherry-pick)'이라고 합니다.

 

 

 


 

 

그럼 이제 체리픽을 진행하는 상황을 실제로 실습해 보도록 하겠습니다. 위에서 설명한 케이스를 실제 소스 트리에서 실행해 보겠습니다. 일단 요약하면, 피처 브랜치 a와 b를 만듭니다. 그리고 a에서 세 개의 커밋을 만들고 이 중 두 번째 생성 커밋만을 피처 브랜치 b에 병합하겠습니다. 

 

 

git_casestudy 원격 저장소를 통해 작업하겠습니다. 우선 [master] 브랜치를 기점으로 새로운 브랜치 [feat/a]를 생성해 줍니다. 이제 이 [feat/a] 브랜치에서 세 개의 커밋을 만들 것입니다.

 

 

 

첫 번째 커밋을 생성하겠습니다. 우선 [feat/a] 브랜치로 체크아웃 된 상태에서, "README.MD" 파일에 텍스트를 하나 추가하겠습니다. 이를테면 github case study 정도로 추가하고 소스트리에서 커밋까지 진행하겠습니다. 커밋 메시지는 [첫 번째 체리픽 실습 커밋] 정도로 하겠습니다. 

 

첫 번째 커밋입니다

 

 

이번에는 로컬에 "cherrypick.md" 파일을 만들고 적당히 '체리픽 실습' 정도의 텍스트를 추가합니다. 커밋 메시지는 [두 번째 체리픽 실습 커밋 - 체리픽 대상] 정도로 하겠습니다. 

 

두 번째 커밋입니다

 

 

 

 

세 번째 커밋 생성 단계입니다. 이번에는 "README.MD" 파일에 새로운 텍스트를 한 줄 추가합니다. 적당한 메시지를 추가하고, 커밋 메시지는 [세 번째 체리픽 실습 커밋] 정도로 지정하겠습니다. 

 

세 번째 커밋입니다

 

 

 

 


 

 

자, 이제 [feat/b] 브랜치를 생성할 차례입니다. 일단 [master]브랜치를 더블클릭해 마스터 브랜치로 체크아웃을 진행합시다. 이제 로컬 저장소에는 새로 만들었던 cherrypick.md 같은 파일들은 모두 사라지고 다시 두 번째 커밋 시점으로 파일들이 돌아간 상태가 되었습니다. 

 

마스터 브랜치로 체크아웃 합니다

 

 

 

자, 이제 이 상태에서 마스터 브랜치의 두 번째 커밋을 베이스로 [feat/b] 브랜치를 생성하겠습니다. 피처 브랜치 b를 생성하고 여기에 "featb.md" 파일을 생성해 '피처브랜치 b 생성' 정도의 텍스트도 추가하겠습니다. 

 

피처브랜치 b를 생성합니다

 

 

피처브랜치 b에 featb.md 파일을 추가했습니다

 

 

 

이제 우리는 [feat/b] 브랜치에 [feat/a]의 커밋 중 [두 번째 체리픽 실습 커밋 - 체리픽 대상] 요 커밋 하나만을 병합하려고 합니다. 현재 상태에서 피처 브랜치 a를 그대로 b에 병합한다면, 첫 번째 커밋과 세 번째 커밋까지 딸려 들어오게 되니까요. 

 

우선 [feat/b] 브랜치가 선택된 상태에서, 우리가 원하는 체리픽 대상 커밋인 [feat/a]의 [두 번째 체리픽 실습 커밋 - 체리픽 대상]을 우클릭합니다. 그리고 "체리픽"을 클릭합니다.

 

[feat/b] 상태에서, [feat/a]의 대상 커밋을 체리픽 합니다

 

체리픽 경고 안내 팝업. 확인을 누릅니다

 

 

 

간단하게 아래와 같이 [feat/b] 브랜치에 [feat/a]에 있던 해당 커밋이 적용되었습니다. 로컬 저장소에도 "cherrypick.md"파일이 성공적으로 생성되었습니다.