Git Cherry-Pick 및 패치: 외과적 커밋 선택
가끔 신청해야 할 때가 있어요 특정 커밋 한 지점에서 다른 지점으로, 모든 것을 병합합니다. 힘내 체리 선택 e 자식 패치 그들은 이것을 허용한다 변화의 "수술 선택". 버그 수정을 백포트하는 강력한 도구입니다. 선택적 핫픽스 또는 전체 병합 없이 브랜치 간 커밋 공유.
🎯 무엇을 배울 것인가
- git Cherry-Pick 작동 방식
- 개별 커밋 및 범위 선택
- 패치 생성 및 적용
- 체리픽과 병합을 사용해야 하는 경우
체리픽 베이스
git cherry-pick 하나 이상의 기존 커밋의 변경 사항을 브랜치에 적용합니다.
현재, 생성 새로운 커밋 콘텐츠는 동일하지만 해시가 다릅니다.
# Situazione iniziale
main: A---B---C
\
feature: D---E---F (commit E contiene bug fix importante)
# Vogliamo solo E su main, non D e F
# Trova l'hash del commit E
git log feature
# commit abc1234 (E) "fix: resolve payment bug"
# Passa a main e applica solo E
git checkout main
git cherry-pick abc1234
# Risultato
main: A---B---C---E'
\
feature: D---E---F
# E' è un NUOVO commit con stesso contenuto di E ma hash diverso
# Cherry-pick singolo commit
git cherry-pick <commit-hash>
# Cherry-pick con messaggio commit custom
git cherry-pick <commit-hash> --edit
# Cherry-pick senza committare (per review prima)
git cherry-pick <commit-hash> --no-commit
# Abortire cherry-pick in caso di problemi
git cherry-pick --abort
커밋 범위별 체리 선택
한 번에 여러 커밋을 선별적으로 선택할 수 있습니다.
# Cherry-pick commit specifici
git cherry-pick abc1234 def5678 ghi9012
# Cherry-pick range (escluso il primo, incluso l'ultimo)
git cherry-pick abc1234..def5678
# Cherry-pick range incluso il primo
git cherry-pick abc1234^..def5678
# Esempio pratico: backport ultimi 3 commit da develop a hotfix
git checkout hotfix/1.0.1
git log develop --oneline -3
# abc1234 fix: typo
# def5678 fix: validation
# ghi9012 fix: security issue
git cherry-pick ghi9012 def5678 abc1234
# Applica i 3 fix nell'ordine corretto
Cherry-Pick의 충돌 관리
병합 및 리베이스와 마찬가지로 체리 선택도 충돌을 일으킬 수 있습니다.
# Cherry-pick con conflitti
git cherry-pick abc1234
# CONFLICT (content): Merge conflict in file.ts
# Opzione 1: Risolvi e continua
# Edita i file in conflitto
git add file.ts
git cherry-pick --continue
# Opzione 2: Salta questo commit
git cherry-pick --skip
# Opzione 3: Abortisci tutto
git cherry-pick --abort
# Vedere quali commit sono in cherry-pick
git status
# On branch main
# You are currently cherry-picking commit abc1234.
Cherry-Pick의 일반적인 사용 사례
✅ 체리픽을 사용하는 경우
- 백포트: 기본 릴리스 분기에서 이전 릴리스 분기로 버그 수정을 수행합니다.
- 선택적 핫픽스: 긴급한 특정 커밋만 적용
- 실수로 커밋: 커밋된 커밋을 잘못된 브랜치로 이동
- 테스트: 특정 커밋을 별도로 테스트
- 부분 통합: 지점에서 작업의 일부만 가져오기
# Situazione: Bug fix su main (v2.0), serve anche su v1.x
main (v2.0): A---B---C---D (D è il fix)
\
release/v1.1: E---F
# Applica il fix a release/v1.1
git checkout release/v1.1
git cherry-pick D
# Risultato
main (v2.0): A---B---C---D
\
release/v1.1: E---F---D'
# Ora v1.1.1 può essere rilasciata con il fix
Git 패치: 리포지토리 없이 변경 사항 공유
I 패치 커밋 diff가 포함된 텍스트 파일입니다. 공유에 유용함 이메일, 포럼을 통해 변경하거나 원격 저장소에 직접 액세스할 수 없는 경우.
# Crea patch per ultimo commit
git format-patch -1 HEAD
# Output: 0001-fix-add-validation.patch
# Crea patch per ultimi 3 commit
git format-patch -3
# Crea patch per range di commit
git format-patch abc1234..def5678
# Crea patch per tutti i commit del branch non in main
git format-patch main
# Patch in stdout (non crea file)
git format-patch -1 HEAD --stdout > my-fix.patch
# Patch per commit specifico
git format-patch -1 abc1234
# Applicare patch con git am (apply mailbox)
git am 0001-fix-add-validation.patch
# Applicare patch senza committare
git apply 0001-fix-add-validation.patch
# Verificare patch prima di applicare
git apply --check 0001-fix-add-validation.patch
# Applicare patch con risoluzione conflitti interattiva
git am -3 0001-fix-add-validation.patch
# Applicare multiple patch
git am *.patch
# Abortire apply in caso di problemi
git am --abort
차이점: 형식 패치와 diff
자식 형식 패치:
git format-patch -1 HEAD
- 커밋 메타데이터(작성자, 날짜, 메시지)를 포함합니다.
- 메일함 형식(.patch)
- 적용 가능
git am - 역사 보존
자식 차이:
git diff > changes.diff
- 그냥 원시적인 차이점
- 메타데이터 없음
- 적용 가능
git apply - 역사를 보존하지 않는다
실제 예: 오픈 소스 프로젝트에 기여
많은 오픈 소스 프로젝트(예: Linux 커널)는 패치 이메일을 통해 기여를 허용합니다.
# 1. Fork e clone del progetto
git clone https://github.com/project/repo.git
cd repo
# 2. Crea branch per la tua feature
git checkout -b fix/memory-leak
# 3. Lavora e committa
git commit -m "fix: resolve memory leak in parser"
# 4. Crea patch
git format-patch main
# Output: 0001-fix-resolve-memory-leak-in-parser.patch
# 5. Invia patch via email alla mailing list del progetto
git send-email 0001-fix-resolve-memory-leak-in-parser.patch \
--to=maintainer@project.org
# Oppure allega manualmente la patch all'email
체리픽(Cherry-Pick)과 병합(Merge): 언제 무엇을 사용할 것인가?
다음과 같은 경우 Cherry-Pick을 사용하세요.
- 유용하다 단 하나의 커밋 특정한
- 이전 버전으로 수정 사항을 백포트하는 중
- 잘못된 브랜치에 커밋이 적용되었습니다.
- 격리된 커밋 테스트
다음과 같은 경우 병합을 사용하세요.
- 당신이 원하는 모든 커밋 지점의
- 완전한 기능 통합
- 분기 기록 보존
- 일반적인 팀 작업 흐름
모범 사례
✅ 해야 할 일
- 백포팅에 Cherry-Pick 사용 버그 수정
- 커밋이 다음과 같은지 확인하세요. 독립된 (다른 사람에게 의존하지 않음)
- 각 체리픽 이후 테스트
- 체리픽임을 커밋 메시지에 문서화하세요.
- 미국
-x원산지를 추적하려면:git cherry-pick -x abc1234
❌ 하지 말아야 할 것
- 많은 커밋을 선택하지 마세요(병합/리베이스 사용).
- 체리가 선택되지 않은 다른 커밋에 의존하는 체리가 선택되지 않은 커밋
- 종속성을 이해하지 않고 선별하지 마십시오.
- 체리픽을 기본 워크플로로 사용하지 마세요.
# -x aggiunge "(cherry picked from commit abc1234)" al messaggio
git cherry-pick -x abc1234
# Risultato nel messaggio commit:
# fix: resolve payment bug
#
# (cherry picked from commit abc1234567890abcdef1234567890abcdef)
일반적인 문제 해결
# Problema: "commit is a merge but no -m option was given"
# Soluzione: Specifica quale parent seguire
git cherry-pick -m 1 abc1234 # Usa il primo parent
# Problema: "refusing to merge unrelated histories"
# Soluzione: Non cherry-pickare da repository non correlati
# Problema: Conflitti complessi
# Soluzione: Considera se merge non sia più appropriato
git cherry-pick --abort
git merge source-branch
# Problema: Empty commit dopo cherry-pick
# Soluzione: Il commit è già stato applicato, skippa
git cherry-pick --skip
결론
체리픽과 패치는 병합하지 않고 특정 변경 사항을 적용하기 위한 수술 도구입니다. 완료. 체리픽 수정 사항을 백포트하고 분기 간에 커밋을 이동하는 데 이상적입니다. 패치 저장소에 직접 액세스하지 않고도 변경 사항을 공유하는 데 유용합니다. 신중하게 사용: 일반적인 통합의 경우 병합 및 리베이스가 더 적합합니다.
🎯 핵심 포인트
- Cherry-Pick은 특정 커밋을 다른 분기에 적용합니다.
- 미국
-x체리픽의 유래를 추적하다 - 패치는 텍스트 파일을 통해 변경 사항을 공유합니다.
git format-patch메타데이터를 보존하고,git diffno- 일반적인 워크플로가 아닌 백포팅에 적합







