Git Interactive Rebase, Cherry pick, Reflog ve Submodule Kullanımı

Interactive Rebase

Kullanım amacımız, sıklıkla task branch'imiz üzerinde değişiklik yapmak istememizdir. Task branch'i olduğunu vurguladım çünkü remote main'inde böyle bir değişiklik haberi olmayan diğer committer'ları etkileyecektir.

Bu yetenek ile:

Commit'lerimizin mesajlarını değiştirebilir,
Commit içeriğindeki dosyaları değiştiştirebilir,
İstemediğimiz commit'leri kaldırabilir ve ya birden fazla commit'in mesajını isteğimize göre tutarak ya da tutmayarak tek commit haline getirebiliriz.

Aşağıda Fork uygulaması üzerinden örnek bir kullanım ve seçeneklerimiz ile onlara ait olan açıklamalar görülebilir:

Burada değiştirmek istediğimiz commitler'den bir öncesine gitmiş ve sonraki commit'lerden birinin mesajını diğerininde içeriğini değiştirmek üzere resolve ekranı açılıp demo için olduğu gibi eklenmiştir. Bunu yukarıdaki gibi Fork üzerinden yapabildiğimiz gibi command line ile yapmakta mümkün.

git rebase -i HEAD~3 örnek syntax'ı ile... Açılan vim ekranından pick, edit ve diğer keyword'leri isteğimize uygun editleyip kaydedip işleme devam ediyoruz.

Cherry-Pick

Kullanım amacımız, başka bir branch'de uygulanmış kritik öneme sahip bir özelliğin ya da bugfix'in kullanımdaki brach'e kazandırılması. Burada önemli olan bunun abuse'lanmayıp gerekmedikçe merge'ler ile ilerlemesi. Aksi taktirde cherry-pick'lenen commit'lere ait dosyalardan sonradan gerçekleşen değişiklikler ve başka bir branch'e daha cherry-pick'lenip değiştirildiği sonradan bu branchlerin merge'lenmesi gibi durumlarda yapılan değişikliğin ne olduğunun farkında olmak gerekecektir. Zira cherry-pick'lenen commit farklı bir commit sha'a sahiptir.

Reflog

Kullanım senaryomuz, genellikle herhangi bir şekilde yaptığımız git command değişikliğini geri almak istediğimiz durumlardır.

Bu yetenek ile silinmiş, adı değiştirilmiş, taşınmış branch'leri geri getirebilir ve öncesinde ne yapıldığından emin olamadığımız durumları kontrol edebiliriz.

Submodule

Kullanım senaryomuz, kendi projemize dış kaynaklı dahil ettiğimiz versiyon kontrole sahip projelerin yönetimini sağlayabilmek.

Örneğin github'da reposu olan bir projenin kaynak kodunu kendi projemizde kullanıyoruz ya da herhangi bir binary, compiled code archive kullanıyoruz diyelim. Bu bizden bağımsız geliştirilmiş projenin güncelliğini manuel yapmaktansa bize versiyon kontrol üzerinden hem safe hem hızlı bir şekilde yapabilmemizi sağlar.

Artık tamamen ayrı bir repo bizim repomuzun içine yerleşmiş durumda. Kendi repo'muzdaki değişiklik .gitmodule ve projeye eklenmiş subproject olarak sınırlanmış durumda. Kendi lokal kopyamız üzerinden yabancı projeyi mediate edecek ya da değiştirecek eklemeler yapıp bunun ayrı yürütülmesini de sağlayabiliriz.