Git cherry-pick 알아보기

git cherry-pick은 특정 커밋을 현재 branch로 가져오게 하는 명령어이다. 이름에서도 쉽게 알 수 있듯이 여러 커밋 중에서 특정 커밋(체리)만 따오는 행위라고 이해하면 쉽다.

Image.png

사용법

모든 커밋은 각각의 고유한 ID인 hash값이 존재하는데, 이를 이용해 특정 commit을 가져올 수 있다.

Image.png

기본 명령어는 다음과 같다.

git cherry-pick <commit-hash>

merge를 하지 않고 저 커밋 내역을 main으로 가져와 보겠다.

현재 main branch의 로그는 다음과 같다.

Image.png

Image.png

Image.png

commit된 변경 사항을 main branch로 가져오고, HEAD가 cherry-pick 으로 가져온 commit을 가리키게 되었다.

여러 개의 커밋을 가져올 수도, 혹은 범위를 지정할 수도 있다.

# 여러개의 커밋 가져오기
git cherry-pick <commit-hash1> <commit-hash2>

# 범위로 가져오기
git cherry-pick <start-commit>..<end-commit>

주요 옵션

  • -edit 또는 -e: 커밋 메시지를 편집할 수 있다.
  • -no-commit 또는 -n: 변경사항을 스테이징 영역에만 추가하고 커밋하지 않는다.
  • -signoff 또는 -s: 커밋 메시지에 서명을 추가한다.
  • -x: 원본 커밋 해시를 커밋 메시지에 추가한다.

언제 사용하면 좋을까?

  • 버그 수정 적용
    • 특정 브랜치에서 발견된 버그를 다른 브랜치에도 빠르게 적용해야 할 때
    • 예: 프로덕션 브랜치의 긴급 버그 수정을 개발 브랜치에도 적용
  • 특정 기능 이전
    • 한 브랜치에서 개발된 기능의 일부만 다른 브랜치로 가져와야 할 때
    • 예: 실험적 브랜치의 성공적인 기능을 메인 개발 라인에 통합
  • 릴리스 관리
    • 특정 릴리스에 포함되어야 할 변경사항만 선택적으로 가져올 때
    • 예: 다음 버전 릴리스에 포함될 기능만 선택적으로 적용

충돌 주의

cherry pick도 어쨌든 커밋 내역을 가져와 합치는 것이므로 언제든 충돌이 발생할 수 있다.

충돌이 났을 경우, 충돌을 해결하고 아래 명령어로 계속 진행하면 된다.

git cherry-pick --continue

추가 옵션:

  • Cherry-pick 중단: 충돌 해결이 복잡하거나 cherry-pick을 취소하고 싶다면
git cherry-pick --abort

이 명령은 cherry-pick 시작 전 상태로 되돌린다.

  • 충돌을 그대로 두고 다음 커밋으로 진행: 여러 커밋을 cherry-pick하는 중이라면, 현재 충돌을 그대로 두고 다음 커밋으로 진행할 수 있다.
git cherry-pick --skip
  • 3-way 병합 사용: cherry-pick 시 -m 옵션을 사용하면 3-way 병합을 수행합니다. 이는 때때로 충돌 해결을 더 쉽게 만들 수 있다.
git cherry-pick -m 1 <commit>