Git のチェリーピックとパッチ: サージカル コミットの選択
申請が必要な場合もあります 特定のコミットだけ あるブランチから別のブランチへ、 すべてをマージします。 Git のチェリーピック e gitパッチ 彼らはこれを許可します 変化の「外科的選択」。これらはバグ修正をバックポートするための強力なツールです。 選択的なホットフィックス、または完全なマージを行わずにブランチ間でコミットを共有する。
🎯 何を学ぶか
- git チェリーピックの仕組み
- 個々のコミットと範囲を厳選する
- パッチを作成して適用する
- チェリーピックとマージをいつ使用するか
チェリーピックベース
git cherry-pick 1 つ以上の既存のコミットからの変更をブランチに適用します
現在、作成中 新しいコミット 内容は同じですがハッシュが異なります。
# 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 Patch: リポジトリを使用しない変更の共有
I パッチ これらはコミットの差分を含むテキスト ファイルです。共有に便利 変更は電子メール、フォーラム経由、またはリモート リポジトリに直接アクセスできない場合に行われます。
# 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
違い: format-patch と diff
git フォーマット パッチ:
git format-patch -1 HEAD
- コミットメタデータ(作成者、日付、メッセージ)が含まれます
- メールボックス形式 (.patch)
- 適用可能
git am - 履歴を保存する
git の差分:
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
チェリーピックとマージ: いつ何を使用するか
次の場合にはチェリーピックを使用してください。
- 便利です たった 1 つのコミット 特定の
- 古いバージョンへのバックポート修正
- 間違ったブランチにコミットが適用されました
- 分離されたコミットテスト
次の場合にマージを使用します。
- あなたが欲しいのは すべてのコミット 支店の
- 完全な機能を統合する
- 分岐履歴を保存する
- 通常のチームワークフロー
ベストプラクティス
✅ やるべきこと
- バックポートにはチェリーピックを使用する バグ修正
- コミットが 自己完結型 (他人に依存しない)
- チェリーピックごとにテストする
- それがチェリーピックであることをコミットメッセージに文書化する
- アメリカ合衆国
-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
結論
チェリーピックとパッチは、マージせずに特定の変更を適用するための外科ツールです 完了しました。 チェリーピック 修正をバックポートしたり、ブランチ間でコミットを移動したりするのに最適です。 パッチ これらは、リポジトリに直接アクセスせずに変更を共有する場合に役立ちます。 慎重に使用してください。通常の統合では、マージとリベースの方が適切です。
🎯 重要なポイント
- チェリーピックは特定のコミットをさまざまなブランチに適用します
- アメリカ合衆国
-xチェリーピックの起源をたどる - パッチはテキスト ファイル経由で変更を共有します
git format-patchメタデータを保存し、git diffno- 通常のワークフローではなく、バックポートに最適です







