[Git] 5.3. 커밋 하나만 떼서 지금 브랜치에 붙이기 : cherry-pick
카테고리: Git
태그: CherryPick, Git, GitHub, GUI, SourceTree
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] 브랜치 생성
우선 현재 [main] branch를 base로 [feat/a] branch를 만든다. 그리고 이 [feat/a] branch에 커밋을 연달아 3개 추가할 것이다. 먼저 README.md 파일에 ‘Git으로 놀아보자!’ 텍스트를 추가하고 커밋한다.
나. [feat/a] 브랜치에 커밋 생성
커밋 메시지는 ‘첫 번째 커밋’이다.
cherrypick.md 파일을 만든 뒤, ‘체리픽 실습하기’ 텍스트를 입력하고 Sourcetree에서 사진처럼 ‘두 번째 커밋 - 탐나는 커밋’ 커밋 메시지와 함께 커밋한다.
마지막으로 README.md 파일에 ‘Let’s git it!’ 이라는 텍스트를 추가하고, Sourcetree에서 ‘세 번재 커밋’이라는 커밋 메시지와 함께 커밋한다.
이렇게 커밋 그래프가 예쁘게 만들어졌다. 이제 히스토리에서 [main] 브랜치를 더블클릭해서 [main] 브랜치에 체크아웃한다. [main] 브랜치로 돌아가는 것이다.
다. [feat/b] 브랜치 생성
[main] 브랜치를 베이스로 다시 [feat/b] 브랜치를 생성해보자.
라. [feat/b] 브랜치의 작업
[feat/b] 브랜치에서 작업을 시작한다. 우선 [git-playground]에 ‘featb.md’ 파일을 생성하고 ‘feat/b 브랜치’ 라는 텍스트를 입력한 뒤 저장한다.
Sourcetree의 [feat/b] branch에서 ‘featb.md’ 파일을 스테이지에 올리고 ‘featb 기능 추가’라는 커밋 메시지와 함께 커밋한다.
커밋 그래프는 위와 같다.
마. cherry-pick의 활용
[feat/a]는 고양이가, [feat/b]는 문어가 작업한다고 가정하자. 그런데 문어가 [feat/a]의 ‘두 번째 커밋 - 탐나는 커밋’만을 가져와서 [feat/b] 브랜치에 반영하고 싶을 때 단순히 [feat/a] 브랜치와 병합하게 되면 원치 않는 ‘첫 번째 커밋’과 ‘세 번째 커밋’까지 [feat/b] 브랜치에 반영된다. 이를 피하고 싶다면 cherry-pick을 사용한다.
[feat/b] 브랜치에 있는 상태에서 복제하기를 원하는 ‘두 번째 커밋 - 탐나는 커밋’을 우클릭 한 뒤, [체리 픽]을 선택한다.
충돌되는 변경사항이 있어서 해결해야 한다는 오류 메시지와 함께 체리 픽이 중단되었다. 스테이지 위아래의 파일을 확인해보니 ‘cherrypick.md’ 파일이 있었다. 이를 스테이지에 올리고 ‘두 번째 커밋 - 탐나는 커밋 체리 픽’이라는 커밋 메시지와 함께 커밋을 해주었다.
이렇게 ‘두 번째 커밋 - 탐나는 커밋’과 같은 코드의 커밋이지만, 커밋 메시지도 새롭게 쓸 수 있다. 또한 커밋 아이디도 다른 것을 보아 변경사항은 복사해왔지만 서로 다른 커밋이라는 점도 주목할 필요가 있다.
Reference
- 팀 개발을 위한 Git GitHub 시작하기, 한빛미디어, 정호영,진유림
댓글남기기