기본 사용법:
# 특정 커밋 하나 가져오기
git cherry-pick <commit-hash>
# 예시: abc123 커밋을 현재 브랜치에 적용
git cherry-pick abc123
# 여러 커밋 가져오기
git cherry-pick abc123 def456 ghi789
# 범위로 가져오기 (A 다음부터 B까지)
git cherry-pick A..B
언제 사용하나요?
커밋(Commit)이란?
Git에서 커밋은 코드 변경사항의 스냅샷입니다. 각 커밋은 고유한 해시(SHA-1)를 가지며, 부모 커밋에 대한 참조와 변경 내용을 포함합니다.
브랜치 간 코드 이동 방법 비교
git merge: 브랜치 전체를 합침 (히스토리 포함)git rebase: 브랜치의 베이스를 옮김 (히스토리 재작성)git cherry-pick: 특정 커밋만 복사해서 적용cherry-pick의 원리
cherry-pick은 선택한 커밋의 변경사항(diff)을 복사해서 현재 브랜치에 새 커밋으로 만듭니다. 원본 커밋을 이동시키는 게 아니라 복제하는 것이므로, 새 커밋은 다른 해시를 갖습니다.
주요 옵션들
# 커밋 메시지 수정하며 가져오기
git cherry-pick -e <commit>
# 커밋하지 않고 변경사항만 스테이징
git cherry-pick -n <commit>
git cherry-pick --no-commit <commit>
# 원본 커밋 정보를 메시지에 추가
git cherry-pick -x <commit>
# 결과: (cherry picked from commit abc123...)
# Merge 커밋을 cherry-pick할 때 부모 지정
git cherry-pick -m 1 <merge-commit>
충돌(Conflict) 해결
cherry-pick 중 충돌이 발생하면:
# 1. 충돌 파일 확인
git status
# 2. 충돌 해결 후 스테이징
git add <resolved-files>
# 3. cherry-pick 계속 진행
git cherry-pick --continue
# 또는 취소하고 원래 상태로
git cherry-pick --abort
# 현재 커밋 건너뛰기 (여러 커밋 중일 때)
git cherry-pick --skip
실무 시나리오: 핫픽스 적용
# 상황: main 브랜치에 긴급 버그 수정을 했는데,
# 이걸 develop 브랜치에도 적용해야 함
# 1. main에서 버그 수정 커밋 확인
git log main --oneline
# abc123 fix: critical payment bug
# 2. develop 브랜치로 이동
git checkout develop
# 3. 해당 커밋만 가져오기
git cherry-pick abc123
# 4. 완료! develop에도 버그 수정이 적용됨
주의사항
-m 옵션 필수cherry-pick vs rebase vs merge
| 상황 | 권장 명령 | 이유 |
|---|---|---|
| 브랜치 전체를 합치고 싶음 | merge |
히스토리 보존, 안전함 |
| 깔끔한 선형 히스토리 원함 | rebase |
커밋 재정렬, 깔끔함 |
| 특정 커밋 1-2개만 필요 | cherry-pick |
선별적 적용 가능 |
| 핫픽스를 여러 브랜치에 전파 | cherry-pick |
정확히 같은 수정만 적용 |
다이어그램 설명: