Cherry-pick, belirtilen bir commit’teki değişiklikleri kaynak dalın tüm geçmişini aktarmadan mevcut dala uygulayan bir Git komutudur. merge veya rebase’in aksine, cherry-pick her commit ile bireysel olarak çalışır: geliştirici hash ile belirli bir commit seçer ve yalnızca onun değişikliklerini aktarır. Git dokümantasyonuna (2026) göre, cherry-pick özellikle tam bir merge’in aşırı veya riskli olduğu durumlarda sürüm dalları arasında düzeltmelerin hedefli aktarımı için kullanışlıdır. Komut yeni bir hash ile yeni bir commit oluşturur, ancak orijinal mesajı ve yazarı korur.
Önemli Noktalar
Cherry-pick, mevcut bir commit’ten değişiklikleri alıp mevcut dala yeni bir commit olarak uygulayan git cherry-pick komutudur. Orijinal commit kendi dalında yerinde kalırken, hedef dalda değişikliklerin bir kopyası oluşturulur. Komut, tüm bir dalı taşımadan belirli bir düzeltmeyi aktarmanız gerektiğinde kullanışlıdır.
Sözdizimi: git cherry-pick <commit-hash>. Git, belirtilen commit’in ebeveynine göre farkını (diff) analiz eder ve bu farkı mevcut dala uygular. Birden çok dosya değiştirilirse, hepsi birlikte aktarılır. Komut ayrıca aralıkları da kabul eder: git cherry-pick A..B — A’dan B’ye kadar tüm commit’ler, A hariç.
Bayraklar yetenekleri genişletir: -n (--no-commit), commit oluşturmadan değişiklikleri çalışma dizinine ve indekse uygular — birden çok commit’in değişikliklerini birleştirmeniz gerektiğinde kullanışlıdır. -x bayrağı, commit mesajına bir satır (cherry picked from commit ...) ekleyerek geçmişteki değişikliklerin kaynağını izlemeyi kolaylaştırır.
# Hash ile tek bir commit’i cherry-pick yap
git cherry-pick a1b2c3d
# Birden çok commit’i cherry-pick yap (sırayla)
git cherry-pick a1b2c3d e4f5g6h i6j7k8l
# Otomatik commit olmadan cherry-pick yap
git cherry-pick -n a1b2c3d
# -x bayrağı orijinal commit’e referans ekler
git cherry-pick -x a1b2c3d
Ana senaryo, sürüm dalları arasında düzeltmelerin aktarılmasıdır. Şöyle düşünün: develop’da kritik bir hata bulundu ve düzeltildi. Sürüm dalı release/v2.1 zaten ayrılmış ve bu hatayı da içeriyor. Tüm develop’ı release’e birleştirmek birçok bitmemiş kod getirirken, tek düzeltme commit’ine cherry-pick uygulamak güvenli ve kesin bir çözümdür.
İkinci senaryo, değişiklikleri geri alıp sonra geri yüklemedir. Bir commit git revert ile geri alındıysa ve daha sonra geri almanın bir hata olduğu ortaya çıkarsa — geri alınan commit’e cherry-pick uygulamak değişiklikleri geri yükler. Bu, bir revert’i geri almaktan daha doğrudur çünkü tekrarlanan çakışmalar oluşturmaz.
Üçüncü senaryo, entegrasyon testi için farklı özellik dallarından commit’leri birleştirmedir. Birden çok bitmemiş dalı (tamamlanmamış kodla) birleştirmek yerine, her birinden yalnızca hazır commit’leri seçip birlikte nasıl çalıştıklarını test edebilirsiniz.
Cherry-pick, tüm dallar yerine bireysel commit düzeyinde çalışmasıyla rebase ve merge’den ayrılır. rebase bir dalın tüm commit’lerini aktarır ve merge iki dalı birleştirirken, cherry-pick yalnızca gerekli olanları seçer. Bu, onu daha hassas bir araç yapar, ancak aynı zamanda daha manueldir.
Bir diğer fark ise yazarlıktır. Cherry-pick sırasında, Git varsayılan olarak orijinal commit’in yazarını korur, ancak committer geçerli kullanıcı olur. Commit mesajı, -x bayrağıyla kaynağı izleyebilir. rebase sırasında, hem yazar hem de committer yeni bir hash ile geçerli kullanıcı olur.
Performans: tek bir commit’e cherry-pick uygulamak, birçok commit’i olan iki dalı birleştirmekten daha hızlıdır. Ancak onlarca commit’i aktarmanız gerekiyorsa, geçici bir dal oluşturup rebase yapmak daha verimlidir ve onlarca hash belirtmeyi gerektirmez.
| İşlem | Kapsam | Yan etkiler |
|---|---|---|
| Cherry-pick | Bireysel commit’ler | Yeni hash, kod tekrarı |
| Rebase | Bir dalın tüm commit’leri | Geçmişi yeniden yazma, yeni hash’ler |
| Merge | Dalların tam birleştirilmesi | Merge commit’i, geçmişi koruma |
Birden çok commit, hash’lerini boşluklarla ayırarak tek bir komutla aktarılabilir: git cherry-pick A B C. Git, commit’leri belirtilen sırayla sırayla uygular. Herhangi bir commit çakışmaya neden olursa, cherry-pick duraklar ve geliştirici çakışmayı çözmeli, ardından git cherry-pick --continue ile devam etmelidir.
Commit aralığı: git cherry-pick A..B (A’dan sonra B’ye kadar tüm commit’ler, A hariç) ve git cherry-pick A^..B (A dahil B’ye kadar tüm commit’ler). Aralıklar, ebeveyn ilişkisi olmadan bir daldan tüm commit’leri aktarmanız gerektiğinde kullanışlıdır — örneğin, tamamlanmış bir özelliği eski bir daldan yeni bir dala taşırken.
--strategy bayrağı, Git’in değişiklikleri nasıl uygulayacağını belirler. Varsayılan olarak recursive stratejisi kullanılır, ancak çakışma tarafını otomatik olarak seçmek için ours veya theirs belirtebilirsiniz. --mainline bayrağı, bir merge commit’ine cherry-pick uygulanırken kullanılır — diff’in hesaplandığı ebeveyn numarasını (1 veya 2) belirtir.
# Cherry-pick commit aralığı
git cherry-pick develop~5..develop~2
# Merge commit’ini cherry-pick yap (ebeveyn belirt)
git cherry-pick -m 1 m9n0o1p
# theirs stratejisini kullan
git cherry-pick --strategy=recursive \
--strategy-option=theirs a1b2c3d
# Çakışma çözümünden sonra devam et
git cherry-pick --continue
Cherry-pick sırasında çakışmalar, aktarılan commit’teki değişikliklerin hedef dalda değiştirilen aynı satırları etkilemesi durumunda ortaya çıkar. Git yürütmeyi duraklatır, çakışan dosyaları işaretler ve çözüm bekler. Durumda, bu dosyalar both modified olarak görünür.
Çakışma çözme adımları: çakışan dosyayı açın, çakışma işaretleyicilerini bulun (<<<<<<<, =======, >>>>>>>), içeriği düzenleyin, işaretleyicileri kaldırın, çözülen dosyalar için git add çalıştırın ve git cherry-pick --continue çalıştırın. Çakışma çözülemezse — git cherry-pick --abort tüm cherry-pick’i iptal eder ve dalı orijinal durumuna döndürür.
Yaygın bir sorun: commit zaten mevcut değişikliklere eşdeğer değişiklikler içeriyor. Bu durumda Git, cherry-pick denediğinde “nothing to commit” veya “empty commit” bildirir. --keep-redundant-commits ve --empty=keep bayrakları, Git’i sırayı korumak için boş bir commit oluşturmaya zorlarken, --skip böyle bir commit’i atlamayı sağlar.
# Cherry-pick sırasında çakışma — dur
git cherry-pick a1b2c3d
# error: a1b2c3d... commit mesajı uygulanamadı
# Çakışmayı çöz → indekse ekle
git add src/conflicted_file.swift
git cherry-pick --continue
# Boş commit’i atla (zaten uygulanmış)
git cherry-pick --skip
# Tam iptal
git cherry-pick --abort
İlk kural: aktarılan commit’in kendi kendine yeterli olduğunu her zaman doğrulayın. Commit A, aktarılmayan commit B’deki değişikliklere bağımlıysa, A’ya cherry-pick uygulamak derlemeyi bozabilir. Cherry-pick’ten önce, commit’in hangi dosyaları değiştirdiğini git show --stat <hash> ile kontrol etmek faydalıdır.
İkinci kural: cherry-pick işlemlerini belgeleyin. Commit mesajının orijinal commit’e bir referans tutması için -x bayrağını kullanın. Bu, daha sonraki geçmiş analizinde değişikliğin nereden geldiğini anlamaya yardımcı olur. -x olmadan, cherry-pick normal bir commit gibi görünür ve kaynağı yalnızca git log --graph ile belirlenebilir.
Üçüncü kural: çok fazla ayrışmış dallar arasında cherry-pick’ten kaçının. Commit oluşturulduktan sonra uzun zaman geçmiş ve kod tabanı önemli ölçüde değişmişse, çakışmalar çok sayıda ve karmaşık olacaktır. Bu gibi durumlarda, hedef dalda düzeltmeyi yeniden uygulamak daha iyidir — onlarca çakışmayı çözmekten daha az zaman alır.
Sıkça Sorulan Sorular
Cherry-pick yapmak, git cherry-pick aracılığıyla belirtilen bir commit’in değişikliklerini mevcut dala uygulamak anlamına gelir. Komut, aynı değişikliklerle ancak yeni bir hash ile yeni bir commit oluşturur. Orijinal commit kendi dalında değişmeden kalır. Bu, yalnızca belirli bir commit gerektiğinde tüm dalı birleştirmeye bir alternatiftir.
Cherry-pick, tüm dalı taşımadan bir veya daha fazla belirli commit’i aktarmanız gerektiğinde seçilir. Merge, dalların tam olarak birleştirilmesi için kullanılır. Tipik bir cherry-pick senaryosu, diğer değişikliklerin henız hazır olmadığı bir sürüm dalına geliştirme dalından bir hata düzeltmesi aktarmaktır.
Tamamlanmadan önce — git cherry-pick --abort işlemi tamamen iptal eder. Başarıyla tamamlandıktan sonra — git revert <hash>, cherry-pick değişikliklerini geri alan bir commit oluşturur. --abort’tan farkı: revert commit’i geçmişten kaldırmaz, yeni bir geri alma commit’i oluşturur.
Değişiklikler hedef dalda zaten mevcut olduğunda boş commit oluşur. Böyle bir commit’i atlamak için git cherry-pick --skip veya hash sırasını korumak için boş commit oluşturmak üzere git cherry-pick --keep-redundant-commits kullanın.
Cherry-pick seçilen commit’leri (tek tek veya liste olarak) mevcut dala aktarır. Rebase bir dalın tüm commit’lerini yeni bir tabana taşır. Cherry-pick kaynak dalı değiştirmez, rebase geçmişi yeniden yazar. Cherry-pick hassas ancak manueldir; rebase otomatiktir ancak herkese açık dallar için tehlikelidir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun