Cherry-pick
- Okunuşu
- çeri pik
Kısaca
Git'te cherry-pick, belirli bir commit'in değişikliklerini geldiği branch'in geri kalanını birleştirmeden, mevcut branch'inize yeni bir commit olarak kopyalar.
Git'te cherry-pick nedir?
Cherry-pick, deponuzun herhangi bir yerindeki tek bir commit'i alıp üzerinde bulunduğunuz branch'e uygulamanızı sağlar. Git, o commit'in neyi değiştirdiğini hesaplar ve mevcut branch'inizde aynı değişiklikleri ve mesajı içeren yeni bir commit oluşturur. Kaynak branch'in geri kalanına dokunulmaz.
Yaygın bir kullanım, bir düzeltmeyi eski sürüme taşımaktır (backport). Bir hata düzeltmesinin main üzerinde commit edildiğini ve bunu zaten canlıda olan bir release/2.1 branch'inde de istediğinizi varsayalım: release branch'ine geçer ve düzeltmenin commit hash'iyle git cherry-pick çalıştırırsınız. Yanlış branch'te yapılmış bir commit'i kurtarmak ya da bitmemiş bir feature branch'inden tamamlanmış tek bir değişikliği almak için de kullanışlıdır.
Cherry-pick, arkadaşınızın yemek kitabının tamamını almak yerine yalnızca bir tarifi kendi kitabınıza kopyalamaya benzer. Kopyalanan commit, değişiklikleri birebir aynı olsa bile yeni bir hash'e sahip yeni bir commit'tir. Branch'ler arasında çevredeki kod farklıysa cherry-pick bir merge çakışması üretebilir; bunu her zamanki gibi çözer ve git cherry-pick --continue ile tamamlarsınız.
Cherry-pick, bir commit serisinin tamamını getiren merge ve rebase'ten farklıdır. Aşırı kullanımı, aynı değişikliğin branch'ler arasında birkaç farklı commit olarak bulunmasına yol açabilir; bu da geçmişin izlenmesini zorlaştırır ve ileride kafa karıştırıcı çakışmalara neden olabilir. Birçok ekip cherry-pick'i acil düzeltmeler (hotfix) ve backport'lar için ayırır ve yeni commit mesajının hangi commit'ten kopyalandığını kaydetmesi için -x seçeneğini ekler.
Önemli noktalar
git cherry-pick <hash>tek bir commit'in değişikliklerini mevcut branch'e uygular.- Orijinali taşımak yerine yeni hash'e sahip yeni bir commit oluşturur.
- Düzeltmeleri release branch'lerine taşımak ya da yanlış yere yapılmış bir commit'i başka yere almak için yaygın olarak kullanılır.
- Çakışmalar merge çakışmaları gibi çözülür, ardından
git cherry-pick --continueile tamamlanır. - Az kullanın; tüm branch'leri getirmek için merge ve rebase daha uygundur.
Örnek
# Find the hash of the commit you want to copy
git log --oneline main
# a1b2c3d Fix crash when the cart is empty
# Switch to the branch that also needs the fix
git switch release/2.1
# Apply that one commit here (-x notes the original hash in the message)
git cherry-pick -x a1b2c3d
# If there's a conflict: fix the files, stage them, and continue
git add src/cart.ts
git cherry-pick --continue # or: git cherry-pick --abortSık sorulan sorular
Cherry-pick ile merge arasındaki fark nedir?
Merge, başka bir branch'teki her commit'i sizinkine getirir. Cherry-pick ise yalnızca seçtiğiniz belirli commit'leri kopyalar ve branch'inizde yeni commit'ler oluşturur.
Birden fazla commit'i cherry-pick edebilir miyim?
Evet. git cherry-pick a1b2c3d e4f5a6b örneğindeki gibi birkaç hash yazabilir ya da A'dan sonraki her commit'i B dahil olmak üzere uygulayan git cherry-pick A..B gibi bir aralık kullanabilirsiniz.
Cherry-pick kötü bir uygulama mıdır?
Kendi başına değil, ancak bilinçli kullanılmalıdır. Aynı değişikliği birçok branch'e cherry-pick etmek commit'leri çoğaltır ve geçmişi ile gelecekteki merge'leri kafa karıştırıcı hale getirebilir; bu yüzden en iyi, acil düzeltme ve backport gibi hedefli durumlarda işe yarar.
İlgili sayfalar
- CommitSürüm Kontrolü, s. 5Commit, Git'te projenin dosyalarının; benzersiz bir kimlik, yazar, zaman damgası ve değişikliği anlatan bir mesajla kaydedilmiş anlık görüntüsüdür.
- BranchSürüm Kontrolü, s. 2Git'te branch, bir özellik ya da düzeltme üzerinde, birleştirene kadar ana kodu etkilemeden çalışmanızı sağlayan bağımsız bir geliştirme hattıdır.
- MergeSürüm Kontrolü, s. 29Git'te merge, bir branch'teki değişiklikleri başka bir branch'e katarak ayrı geliştirme hatlarını tek ve ortak bir geçmişte yeniden birleştirir.
- RebaseSürüm Kontrolü, s. 33Git'te rebase, bir branch'in commit'lerini başka bir commit'in üzerine yeniden uygular; geçmişi yeniden yazıp merge commit'siz, temiz ve doğrusal kılar.
- Merge ConflictSürüm Kontrolü, s. 30Merge çakışması, iki branch bir dosyanın aynı satırlarını değiştirdiği için Git'in otomatik birleştiremediği, sonuca birinin karar vermesi gereken durumdur.
- GitSürüm Kontrolü, s. 10Git, dosyalardaki değişiklikleri zamanla izleyen ücretsiz, açık kaynaklı dağıtık sürüm kontrol sistemidir; iş birliğini ve hataları geri almayı kolaylaştırır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin