- Bu teknikler hangi sorunlara çözüm olur?
- Git stash ile yarım işi saklamak
- Cherry-pick ile tek işlemeyi taşımak
- Reflog ile kaybolan işlemeleri kurtarmak
- Örnek senaryo: acil hata düzeltmesi
- Sık yapılan hatalar
- Stash ve cherry-pick için yardımcı komutlar
- Bu beceri Mindset programlarında nerede çalışılır?
- Sık sorulan sorular
Git stash, cherry-pick ve reflog: ileri teknikler komut komut
Git stash ile yarım işi saklamayı, cherry-pick ile tek işlemeyi taşımayı ve reflog ile kaybolan işlemeleri kurtarmayı komut örnekleri ve senaryolarla öğrenin.
Bu teknikler hangi sorunlara çözüm olur?
Her biri günlük çalışmada sık yaşanan ayrı bir durumu çözer. Stash, yarım kalmış işinizi işlemeye dönüştürmeden geçici olarak kenara koyar; örneğin başka bir dalda acil bir hataya bakmak için dal değiştirmeniz gerektiğinde. Cherry-pick, başka bir daldaki belirli bir işlemeyi seçip bulunduğunuz dala kopyalar; örneğin ana daldaki bir hata düzeltmesini yayında kullanılan sürüm dalına almak için. Reflog ise Git'in dal işaretçilerinin geçmiş hareketlerini tuttuğu kayıttır ve yanlışlıkla silinen ya da geri alınan işlemeleri kurtarmanızı sağlar.
Hepsi geçmişle ilgili işlemlerdir ve ortak özellikleri "hatayı geri almayı kolaylaştırması"dır. Bu teknikleri bilmek, hata yaptığınızda korkmadan deneme yapmanıza imkân verir.
Git stash ile yarım işi saklamak
Çalışma dizininizde kaydetmediğiniz değişiklikler varken başka bir dala geçmeniz gerekirse:
git stash push -m "WIP odeme formu" git switch hata-duzeltme
Değişiklikleriniz saklanır ve çalışma dizini temizlenir. Geri dönünce stash listesini görürsünüz: git stash list. Değişiklikleri geri getirmek için pop ve apply komutları vardır. git stash pop değişiklikleri uygular ve listeden siler; git stash apply uygular ama listede bırakır. Birden çok yerde kullanmak istediğiniz bir stash için apply uygundur.
Varsayılan olarak yalnızca izlenen dosyalar saklanır. Yeni, izlenmeyen dosyaları da almak için -u bayrağı eklenir. Uygularken çakışma çıkarsa normal çakışma çözümü yapılır ve stash silinmez; çözümden sonra kendiniz git stash drop ile temizlersiniz. Stash'i uzun süre dinlendirmeyin; unutulan stash'ler hangi işe ait olduğu anlaşılmaz hâle gelir. Anlamlı mesaj yazmak bu yüzden önemlidir.
Cherry-pick ile tek işlemeyi taşımak
Cherry-pick, bir işlemenin yaptığı değişikliği bulunduğunuz dala yeni bir işleme olarak uygular. Önce işlemenin kimliğini (hash) git log ile bulun, sonra hedef dalda çalıştırın:
git switch surum-dali git cherry-pick <islemenin-kimligi>
Alınan işleme yeni bir kimlikle oluşur; içerik aynı, geçmiş farklıdır. -x bayrağı mesaja "cherry picked from" satırı ekler ve sonradan kaynağın izlenmesini sağlar. -n bayrağı işleme oluşturmadan değişikliği hazırlar; birden fazla işlemeyi tek işlemede toplamak istediğinizde kullanılır. Bir aralık için ilk ve son işleme arasında nokta nokta yazımı kullanılabilir.
Çakışma çıkarsa normal çözüm yapılır ve git cherry-pick --continue ile sürdürülür; git cherry-pick --abort işlemi iptal eder. Cherry-pick bağımlı işlemeleri otomatik getirmez: aldığınız işleme önceki bir işlemede eklenen koda dayanıyorsa derleme bozulabilir. Bu yüzden alınan değişikliğin kendi başına tutarlı olup olmadığını kontrol edin.
Reflog ile kaybolan işlemeleri kurtarmak
Yanlışlıkla bir dalı sildiniz, git reset --hard ile işlemeleri attınız ya da bir rebase sonucu geçmişi bozdunuz. İşlemeler gözden kaybolmuş olsa da Git bunları hemen silmez. git reflog, HEAD ve dal işaretçilerinin son hareketlerini sırasıyla listeler; her satırda işlemenin kimliği ve ne olduğu (checkout, commit, reset, rebase) yazar.
Kurtarma adımları şöyledir:
- git reflog ile işlemenin kaybolmadan önceki hâlini bulun
- Kimliği not edin
- git switch -c kurtarma <kimlik> ile oraya yeni bir dal açın
- Ya da mevcut dalı git reset --hard <kimlik> ile oraya döndürün
Önce yeni bir dal açmak daha güvenlidir, çünkü hiçbir şey ezilmez. Reflog yereldir: yalnızca o makinede çalışır, uzak depoda tutulmaz. Ayrıca kayıtlar sonsuza kadar saklanmaz; eski girişler zaman içinde temizlenir. Bu yüzden hatayı fark eder etmez müdahale etmek gerekir.
Örnek senaryo: acil hata düzeltmesi
Örneğin bir özellik dalında yarım bir değişiklik üzerinde çalışırken yayında kritik bir hata bildirildi. Adımlar: yarım işi stash ile saklarsınız, yayın dalına geçersiniz, hatayı düzeltip işlemeyi oluşturursunuz ve gönderirsiniz. Aynı düzeltme ana geliştirme dalında da gerekiyorsa düzeltme işlemesini cherry-pick ile o dala da alırsınız. Sonra özellik dalınıza dönüp git stash pop ile işinize devam edersiniz.
Bu akış stash ve cherry-pick tekniklerinin birlikte kullanımıdır. Reflog devreye, bu akış sırasında yanlışlıkla bir işlemeyi kaybettiğinizde girer. Böyle bir iş akışında dikkat edilecek nokta, düzeltmeyi farklı yerlerde ayrı ayrı yazmak yerine aynı işlemeyi taşımaktır: böylece hangi düzeltmenin nereye girdiği izlenebilir kalır ve -x ile kaynak kaydı tutulur.
Sık yapılan hatalar
Stash'te sık hata, stash'i unutmak ya da hangi dala ait olduğunu karıştırmaktır. Mesaj yazın, düzenli listeyi temizleyin. Pop ile uygularken çakışma çıkarsa stash'in silinmediğini bilin; sonucu kontrol etmeden drop yapmayın.
Cherry-pick'te yaygın hata, aynı değişikliği farklı dallarda ayrı işleme olarak tutup sonradan dalları birleştirirken çakışma yaşamaktır. Birleşecek dallar arasında sürekli cherry-pick yapmak yerine ortak işi tek bir dalda toplamak daha temizdir. Bir aralığı cherry-pick ederken sıralamayı da gözetin.
Reflog'da en büyük yanılgı, reflog'un bir yedek olduğunu sanmaktır. Yerel, geçici ve yalnızca işaretçi hareketlerini kapsar; commit edilmemiş değişiklikleri kurtarmaz. Bu yüzden önemli işi sık sık işleyin ve uzak depoya gönderin.
Stash ve cherry-pick için yardımcı komutlar
Stash içeriğini uygulamadan önce incelemek için git stash show -p komutu farkı gösterir. Yalnızca belirli dosya parçalarını saklamak isterseniz git stash push -p etkileşimli olarak hangi parçaların saklanacağını sorar; bu, yarım işinizin yalnızca bir bölümünü kenara koymak istediğinizde işe yarar. Bir stash'in uygulandığı dalda sorun çıkıyorsa git stash branch yeni-dal komutu saklı değişiklikleri, stash'in alındığı işlemeden başlayan yeni bir dalda uygular ve çoğu çakışmayı baştan önler.
Cherry-pick için de benzer bir inceleme alışkanlığı gerekir. Almadan önce git show ile işlemenin hangi dosyalara dokunduğuna bakın. Birden çok ilişkili işlemeyi almanız gerekiyorsa tek tek almak yerine aralığı belirtin ya da değişikliği hedef dalda bir birleştirme ile taşımayı düşünün. Birleştirme (merge) işlemesini cherry-pick ederken hangi ebeveyn hattını esas alacağınızı -m bayrağıyla belirtmeniz gerekir; belirtmezseniz Git işlemi reddeder. Sürüm dalına birleştirme işlemesi almaya çalışırken karşılaşılan hata mesajının nedeni budur.
Bu beceri Mindset programlarında nerede çalışılır?
Mindset'in GIT ve GITHUB Uzmanlığı Eğitimi ileri düzey Git tekniklerini, Git İleri Seviye: Branching, Rebase ve Monorepo eğitimi ise Git nesne modeli ve referansları, geçmiş düzenleme ve sorun teşhisini ele alır. Reflog gibi kurtarma araçlarının anlaşılması nesne modeli ve referansların mantığına dayanır. Eğitimler, Git'i temel düzeyin ötesinde kullanmak isteyen geliştiricilere ve ekibine kurtarma ve geçmiş yönetimi standardı kazandıran teknik liderlere yöneliktir.
Kurumsal ekipler için acil düzeltme, sürüm dalı yönetimi ve hata kurtarma akışlarının ortak bir yöntemle tanımlanması, canlı ortamdaki olaylarda süreyi kısaltır.
İlgili Mindset programı
GIT ve GITHUB Uzmanlığı Eğitimi
Sık sorulan sorular
Git stash pop ile apply arasındaki fark nedir?
İkisi de saklanan değişiklikleri çalışma dizinine uygular. Pop, uyguladıktan sonra stash kaydını siler; apply kaydı listede bırakır. Aynı değişikliği başka dalda da kullanacaksanız ya da çakışma riski görüyorsanız apply daha güvenlidir.
Cherry-pick ile merge arasında nasıl seçim yapılır?
Başka bir daldaki yalnızca belirli bir düzeltmeyi almak istiyorsanız cherry-pick uygundur. Bir dalın tüm işini almak istiyorsanız merge ya da rebase kullanılır. Cherry-pick aynı değişikliği farklı kimlikle çoğaltır; bu yüzden sürekli tekrarlanması geçmişi karışık hale getirir.
Silinen bir dalı reflog ile geri getirebilir miyim?
Evet, dalın son işlemesi reflog'da duruyorsa. git reflog çıktısında silmeden önceki ucu bulun ve git switch -c dal-adi <kimlik> ile aynı adla yeniden oluşturun. Dal başka makinede silindiyse o makinenin reflog'una bakmak gerekir.
Commit edilmemiş değişikliklerimi reflog kurtarır mı?
Hayır. Reflog yalnızca işlemelerin ve dal işaretçilerinin hareketini kaydeder. Hiç işlenmemiş ya da stash edilmemiş çalışma dizini değişikliği, üzerine yazıldığında Git'te iz bırakmaz. Önemli değişiklikleri geçici de olsa işlemek ya da stash etmek en güvenli alışkanlıktır.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme, DevOps ve Bulut Teknolojileri