전체 목록
GitMedium#88

Git cherry-pick이란 무엇이며, 어떤 상황에서 활용하면 좋나요?

#Git#cherry-pick#브랜치#협업
힌트

특정 커밋만 선택적으로 가져와야 하는 상황을 생각해보세요.

정답 및 해설

Git cherry-pick이란 무엇이며, 어떤 상황에서 활용하면 좋나요?

git cherry-pick은 다른 브랜치에 있는 특정 커밋(들)만 선택하여 현재 브랜치에 적용하는 명령어입니다. 브랜치 전체를 merge하거나 rebase하지 않고, 원하는 커밋만 골라서 가져올 수 있다는 점이 특징입니다. "체리를 골라 따듯" 필요한 변경사항만 선택적으로 적용한다는 의미에서 이름이 붙었습니다.

기본 사용법

# 특정 커밋 하나 적용
git cherry-pick <commit-hash>

# 예시
git cherry-pick a1b2c3d

# 적용 후 자동으로 새로운 커밋이 생성됨
# (원본과 내용은 같지만 커밋 해시는 다름)

커밋 해시 확인하기

# 로그에서 해시 확인
git log --oneline feature/payment
# a1b2c3d fix: 결제 금액 소수점 버그 수정
# d4e5f6g feat: 결제 API 연동
# g7h8i9j feat: 결제 UI 구현

# 다른 브랜치의 로그 확인
git log --oneline --all
git log --oneline origin/hotfix/critical-bug

여러 커밋 cherry-pick

# 여러 커밋을 개별 지정 (각각 별도 커밋으로 적용)
git cherry-pick A B C

# 범위 지정 (A 미포함, B 포함까지)
git cherry-pick A..B

# 범위 지정 (A 포함, B 포함까지)
git cherry-pick A^..B

# 예시: hotfix 브랜치의 최근 3개 커밋 가져오기
git cherry-pick hotfix~2..hotfix

주요 옵션

# 커밋 없이 스테이징만 (직접 커밋 메시지 수정 가능)
git cherry-pick -n <commit-hash>
git cherry-pick --no-commit <commit-hash>

# 커밋 메시지에 원본 커밋 해시 추가
git cherry-pick -x <commit-hash>
# 적용 결과 메시지: "feat: 버그 수정 (cherry picked from commit a1b2c3d)"

# 커밋 작성자 정보도 유지
git cherry-pick --signoff <commit-hash>

# cherry-pick 후 커밋 메시지 편집
git cherry-pick -e <commit-hash>

충돌 처리

cherry-pick 중 충돌이 발생하면 merge와 유사하게 처리합니다.

git cherry-pick a1b2c3d
# CONFLICT (content): Merge conflict in src/payment.ts
# error: could not apply a1b2c3d... fix: 결제 버그 수정

# 1. 충돌 파일 확인
git status

# 2. 충돌 해결 (파일 편집)
# <<<<<< HEAD
# 현재 브랜치 코드
# =======
# cherry-pick 하려는 코드
# >>>>>> a1b2c3d

# 3. 해결 후 스테이징
git add src/payment.ts

# 4. cherry-pick 계속 진행
git cherry-pick --continue

# 또는 취소
git cherry-pick --abort

# 또는 이 커밋은 건너뛰기
git cherry-pick --skip

실제 활용 사례

1. Hotfix를 여러 브랜치에 동시 적용

가장 대표적인 사용 사례입니다. main에 적용한 긴급 버그 수정을 develop 브랜치에도 동일하게 반영해야 할 때 유용합니다.

# 1. hotfix 브랜치에서 버그 수정 후 main에 merge
git checkout main
git merge --no-ff hotfix/payment-null-error
# → 커밋 해시: a1b2c3d

# 2. develop 브랜치에도 동일 수정 적용
git checkout develop
git cherry-pick a1b2c3d

# 3. release/1.2 브랜치에도 적용
git checkout release/1.2
git cherry-pick a1b2c3d
main:    ---M---F(hotfix)
              \
develop:  ---D---cherry-pick(F')
              \
release:  ---R---cherry-pick(F'')

2. 잘못된 브랜치에 커밋한 경우

# main에 실수로 커밋한 상황
git log --oneline
# a1b2c3d feat: 새 기능 구현 (← main에 직접 커밋하면 안 됨!)
# d4e5f6g chore: 기존 작업

# 1. 올바른 브랜치(feature) 생성 후 cherry-pick
git checkout -b feature/new-feature
git cherry-pick a1b2c3d  # main에서 잘못된 커밋 가져오기

# 2. main에서 잘못된 커밋 제거
git checkout main
git reset --hard HEAD~1  # 마지막 커밋 취소 (로컬에서만!)
# 또는 이미 push된 경우
git revert a1b2c3d  # revert commit 생성

3. 특정 기능의 일부만 가져올 때

# feature 브랜치에 여러 커밋이 있지만, 특정 유틸 함수만 필요한 경우
git log --oneline feature/big-refactor
# a1b2c3d refactor: 컴포넌트 전체 리팩토링
# d4e5f6g feat: 날짜 포맷 유틸 함수 추가  ← 이것만 필요
# g7h8i9j feat: API 모듈 리팩토링

git checkout main
git cherry-pick d4e5f6g  # 유틸 함수 커밋만 가져오기

4. 실험적 브랜치에서 검증된 커밋만 추출

# experimental 브랜치에서 작업하다가 일부만 production에 반영
git log --oneline experimental
# a1b2c3d experiment: 새로운 캐싱 전략 (검증 필요)
# d4e5f6g fix: 메모리 누수 수정  ← production에 바로 적용
# g7h8i9j experiment: 새로운 알고리즘 테스트

git checkout production
git cherry-pick d4e5f6g  # 검증된 버그 수정만 적용

cherry-pick vs 다른 방법 비교

방법적용 범위히스토리사용 시기
merge브랜치 전체merge commit 생성브랜치 전체를 통합할 때
rebase브랜치 전체선형으로 재작성로컬 브랜치 정리
cherry-pick특정 커밋만새 커밋 생성선택적 커밋 적용
revert특정 커밋 취소revert commit 생성커밋 효과 되돌리기

cherry-pick의 주의사항

커밋 의존성 문제

# B 커밋이 A 커밋에 의존하는 경우
git log --oneline feature
# B: feat: 결제 완료 페이지 (A의 결제 컴포넌트를 사용)
# A: feat: 결제 컴포넌트 생성

# B만 cherry-pick하면 A가 없어서 충돌 발생
git cherry-pick B  # ← A가 없어서 에러 발생 가능

# 올바른 방법: 의존하는 커밋들도 함께 cherry-pick
git cherry-pick A B
# 또는 범위로
git cherry-pick A^..B

중복 커밋 주의

# 이미 cherry-pick된 커밋을 나중에 merge하면 중복 커밋 발생 가능
# → git은 이를 자동으로 처리하지만, 충돌이 날 수 있음
# → cherry-pick 사용 시 팀원과 커뮤니케이션 필요

실무 팁

# cherry-pick할 커밋 내용 미리 확인
git show <commit-hash>
git show a1b2c3d --stat  # 변경된 파일 목록만

# dry-run으로 충돌 여부 미리 확인 (실제 적용 안 함)
git cherry-pick --no-commit a1b2c3d
git diff --cached  # 확인 후
git cherry-pick --abort  # 취소

# cherry-pick 후 커밋 이력 확인
git log --oneline --graph

정리

사용 케이스명령어 예시설명
단일 커밋 적용git cherry-pick a1b2c3d가장 기본적인 사용법
여러 커밋 적용git cherry-pick A B C순서대로 각각 적용
범위 적용 (A 미포함)git cherry-pick A..BA 이후부터 B까지
범위 적용 (A 포함)git cherry-pick A^..BA부터 B까지 모두
커밋 없이 스테이징git cherry-pick -n <hash>직접 커밋 메시지 수정
출처 기록git cherry-pick -x <hash>원본 해시를 메시지에 추가
충돌 해결 후 계속git cherry-pick --continue충돌 해결 후 재개
취소git cherry-pick --abortcherry-pick 작업 취소

핵심: cherry-pick은 선택적 커밋 이식 도구로, hotfix 전파나 실수한 커밋 이동에 특히 유용합니다. 단, 커밋 의존성과 중복 적용에 주의해야 합니다.