git cherry-pick
Birden fazla işlem uygulayabilmeyi öğrendiğinizden beri, ayrım gerçekten biraz tartışmalı hale geldi, ancak bu yakınsak evrim olarak adlandırılacak bir şey ;-)
Gerçek ayrım, her iki aracı da yaratma amacında yatmaktadır:
git rebase
'nin görevi, bir geliştiricinin kendi özel havuzunda sahip olduğu bir dizi değişikliği, bazı yukarı akış dallarının X sürümüne karşı oluşturulan bir dizi değişikliği aynı dalın Y sürümüne (Y> X) iletmektir. Bu , bu işlem serilerinin temelini etkili bir şekilde değiştirir , dolayısıyla "yeniden satış".
(Ayrıca, geliştiricinin herhangi bir keyfi işleme üzerine bir dizi taahhüdü aktarmasına izin verir, ancak bu daha az açık bir kullanımdır.)
git cherry-pick
bir gelişim çizgisinden diğerine ilginç bir taahhüt getirmek içindir. Klasik bir örnek, kararsız bir geliştirme dalında yapılan bir güvenlik düzeltmesinin, merge
pek çok istenmeyen değişiklik getireceğinden, a'nın hiçbir anlam ifade etmediği bir kararlı (bakım) şubesine geri gönderilmesidir.
İlk ortaya çıkışından bu yana git cherry-pick
, tek seferde birden fazla işlem seçebildi.
Bu nedenle, muhtemelen bu iki komut arasındaki en çarpıcı fark, üzerinde çalıştıkları şubeye nasıl davrandıklarıdır: git cherry-pick
genellikle başka bir yerden bir taahhüt getirir ve bunu mevcut şubenizin üzerine uygular, yeni bir commit kaydederken git rebase
, mevcut şubenizi alır ve yeniden yazar. bir dizi kendi bahşişi şu ya da bu şekilde taahhüt eder. Evet, bu neler git rebase
yapılabileceğine dair son derece basitleştirilmiş bir açıklama , ancak genel fikri içine kaptırmaya çalışmak kasıtlı.
git rebase
Tartışılan kullanım örneğini daha fazla açıklamak için güncelleme yapın .
Bu durum göz önüne alındığında,
Kitap şöyle der:
Ancak, başka bir yol daha var: C3'te tanıtılan değişikliğin yamasını alıp C4'ün üzerine yeniden uygulayabilirsiniz. Git'te buna yeniden sıralama denir. Rebase komutu ile, bir şubede yapılan tüm değişiklikleri alıp başka bir şubeye uygulayabilirsiniz.
Bu örnekte, aşağıdakileri çalıştıracaksınız:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
Buradaki "püf noktası", bu örnekte "deney" dalının (yeniden adlandırma konusu) başlangıçta "ana" daldan ayrılması ve dolayısıyla C0 ile C2 arasındaki taahhütleri paylaşmasıdır - etkili bir şekilde "deney" ana "kadar ve C2 dahil, artı bunun üzerine C3 işleyin. (Bu, mümkün olan en basit durumdur; tabii ki, "deney" orijinal tabanının üzerinde birkaç düzinelerce işlem içerebilir.)
Şimdi git rebase
"deney" i "usta" nın şu anki ipucu üzerine yeniden düzenlemesi söyleniyor ve git rebase
şöyle devam ediyor:
git merge-base
Hem "deney" hem de "usta" tarafından paylaşılan son işlemin ne olduğunu görmek için çalışır (başka bir deyişle, saptırmanın amacı nedir). Bu C2.
- Sapma noktasından bu yana yapılan tüm taahhütleri saklar; oyuncak örneğimizde sadece C3'tür.
- HEAD'i (işlem çalışmaya başlamadan önce "deney" in ipucu kaydına işaret eder) "ana" ifadesinin ucuna işaret edecek şekilde geri sarar - biz ona geri dönüyoruz.
- Kaydedilen taahhütlerin her birini
git apply
sırayla (olduğu gibi ) uygulamaya çalışır . Oyuncak örneğimizde bu sadece bir commit, C3. Diyelim ki uygulaması bir commit C3 'üretecek.
- Her şey yolunda giderse, "deneme" referansı, son kaydedilen kaydetme uygulamasından (bizim durumumuzda C3 ') sonuçlanan kaydetmeyi gösterecek şekilde güncellenir.
Şimdi sorunuza geri dönün. Gördüğünüz gibi, burada teknik olarak git rebase
gerçekten de bir dizi taahhüdü "deney" ten "usta" nın ucuna naklediyor, böylece süreçte gerçekten "başka bir dal" olduğunu haklı olarak söyleyebilirsiniz. Ancak işin özü, "deney" deki ipucu taahhüdünün "deney" deki yeni ipucu taahhüdüne dönüştüğü, sadece temelini değiştirdi:
Yine, teknik olarak git rebase
burada "usta" dan bazı taahhütleri birleştirdiğini söyleyebilirsiniz ve bu kesinlikle doğrudur.