GIT —İşlemleri Geri Alma

Damla Ulutas
Huawei Developers - Türkiye
4 min readMay 20, 2021

Git kullanırken bazen istemediğimiz durumlar olur ve kodlarımızı geri almak ya da geçmiş commitlerimizi düzeltmek isteriz. Genelde bu geri alma ve düzeltme işlemleri başımıza bela olur. Ya kodlarımızı kaybederiz ya conflict’e düşer ya da takım arkadaşımızın kodunu ezeriz. Bu makalede hangi tip sorunlarda hangi yöntemleri kullanmamız gerektiğini açıklamaya çalışacağım. Umarım yararlı olur.

Haydi başlayalım. :)

1.Amend

Diyelim ki bir commit yaptınız ve bir şeyleri eklemeyi unuttunuz ve hemen düzeltmek istiyorsunuz. Bunun için amend komutunu kullanabilirsiniz.

Peki amend’i hangi durumda kullanabiliriz:

  • Commitinizin pushlanmamış olması gerekir. Kodunuzu puslayıp central servera gönderdiyseniz amend komutunu kullanmanız tavsiye edilmez. Muhtemelen conflict oluşturursunuz ve localinizdeki kodlarınız, geri aldığınız kodunuz ve repodaki kodlarınızı karşılaştırıp merge etmeniz gerekebilir. Detaylı bilgi için The Perils of Rebasing bakabilirsiniz. Amend sadece pushlanmamış commit’ler için tercih edilmelidir. Pushlanmış kodlar için farklı komutlar kullanacağız.
  • Amend ile sadece son commitinizi geri alabilirsiniz. Mesela iki ya da üç commit öncesi için değil.
  • Önceki commit hiç gerçekleşmemiş gibi ve commit geçmişinizde görünmeyecek. Commit historyde iz bırakmaz.
  • Commit yaptınız commit mesajınızı yanlış yaptığınızı fark ettiniz. Değişiklik yapmadan amend’i kullanırsanız size son commit mesajınızı değiştirme fırsatı verir. Commitiniz üzerine yazılır.

2.Reset

Yanlış bir commit attınız ya da yöneticiniz yaptığınız değişkliklerin geri alınmasını istiyor. Benzer seneryolar içi reset komutunu kullanabilirsiniz. Reset komutu kodunuzu belli bir commit numarasına ya da belli bir commit sayısı kadar geriye döndürmenizi sağlar.

Reset kullanırken pushlamadan önce stage’deki kodları, stage’de değişiklik yoksa central server reposu ve local repo kodları arasındaki farkları kontrol etmeniz önerilir. Özellikle reset hard kullanıyorsanız mutlaka central serverdaki reponuzu başka bir yere yedeklemeniz önerilir. Pushlama yaptığınızda önceki kodlarınızı kaybetmek bazen tehlikeli olabilir. :/

Reset tiplerine bakalım:

— Reset Soft: stage everything. Reset soft ile kodlarınızı istediğiniz şekilde geri aldınız. Ama repoyu değiştirmesini istemiyorsunuz. Alınan değişiklikleri stagede görmek ve kontrollü bir şekilde commitlemek istiyorsunuz. İşte reset soft değişiliklerinizi geri alıp, sizin için stagede commitlemeye hazır bekletir. İsterseniz discard changes deyip geri alırsınız. Hiçbir dosyanızda bir kayıp olmaz.

  • Reset soft kodlarınızı istediğiniz şekilde geri alır. Değiştirilmiş ve düzenlenmiş kodları Git’e ekler ( add stash) ve sizin kontrolünüze sunar.
  • Localinizdeki dosyalarınız bozulmaz.

Aşağıda reset soft komutunun iki ayrı kullanımını görüyorsunuz. İlki size kodlarınızı 2 commit geriye , diğeri de belli bir commit numarasına döndürmenize yardımcı olur.

Reset Mixed: unstage everything. Aynı geri alma işlemini yaptınız, repoyu da değiştirmek istemiyorsunuz ama değişen kodları stagede de istemiyorsunuz. İşte reset mixed tam size göre.

  • Localinizdeki dosyalarınız bozulmaz.
  • Reset mixed kodlarınızı istediğiniz şekilde geri alır. Değiştirilmiş ve düzenlenmiş kodlar Git’e eklenmez untracked olur. Siz istediğiniz değişiklikleri seçer stage’e alırsınız.

Reset mixed komut örneklerini aşağıda görüyorsunuz. İlki size kodlarınızı 2 commit geriye , diğeri de belli bir commit numarasına döndürmenize yardımcı olur.

Reset Hard: ignore everything. Geri alma işlemini hard ile yapıyorsanız dikkatli olmalısınız. Çünkü local reponuz iz bırakmadan değiştirilir. Pushlamadağınız central server reponuzu geri alınacak ve commit history kaybolacaktır. İstenmeyen sonuçlar için yedekleme yapılmalıdır.

  • Dosyalarda yaptığınız değişiklikleri belirtilen noktaya kadar siler.
  • Dosyalarınız değiştirilir. Working treede ve stagede değişiklik göremezsiniz.

Reset hard komut örneklerini aşağıda görüyorsunuz. İlki size kodlarınızı 2 commit geriye , diğeri de belli bir commit numarasına döndürmenize yardımcı olur.

3. Revert

Commitlerinizi geri almak istiyorsunuz ama takım halinde de çalıştığınız için commit history bozulmasın istiyorsunuz. Çünkü bazen geri aldığınız commiti de geri almak isteyebilirsiniz. :D

Revert bunu yeni bir commit atarak yapıyor. Aslında geri almak istediğiniz commitiniz aynı yerinde commit historyde duruyor. Peki yeni bir commit atmaktan farkı yok neden kullanayım ki dediğinizi duyar gibiyim. Bir kere değişiklerinizi sizin için geri getiriyor. Bakıp tek tek yapmanızdan daha kolay. İkincisi merge commitinizi de geri almanızı sağlıyor. Birden fazla commit içinde kullanabiliyorsunuz, örneğin iki commit aralığındaki tüm commitleri tek tek taramanıza gerek yok.

Revert bir çok farklı şekilde kullanılabilir. Ben kullanışlı olanlarını sizin için filtreledim.

Revert edit: Belli bir commite revert etmeden önce size commit mesajınızı da düzenleme imkanı verir. İsterseniz — no-edit seçeneğini de tam tersi mesajı düzenlemeden geçmek için kullanabilirsiniz.

Aşağıda komutu son commit işleminizi geri almak ve commit mesajını da editlemek için kullanabilirsiniz.

Revert commit_no: Bir commiti revert ettiğiniz de yeni commit oluşturulur. İstersenizbu commit numarasını da tekrar revert edebilirsiniz.

Revert gpg sign: GPG nedir ilk burdan başlayalım.GPG, GPL lisansına sahip, açık kaynak kodlu bir OpenPGP şifreleme standartıdır. OpenPGP ise, izni olmayan kişilerin görmesini istemediğiniz her türlü verinin bütünlüğünü ve güvenliğini sağlayan bir protokoldür. Git kullanırken buna neden ihtiyaç duyayım diyebilirsiniz. Şöyle ki GPG ile imzalanan commit’ler, sizin kimliğinizi doğrulamaktadır. GPG key’ler kişiye özel olduğu için, gelen commit’lerin gerçekten o şahıstan geldiğini doğrulamış olursunuz. GitHub ve GitLab üzerinden GPG Key ekleyebilirsiniz. Bu işlemler bu makalenin konusu olmadığı için geçebiliriz. Biz sadece bir commiti revert ederken oluşan commitin otomatik olarak GPG ile gönderilmesine bakalım.

Revert -n: Revert ile birden fazla commiti tek seferde geri almanız mümkün. Bir başlangıç commit_no ve bir de bitiş commit_no verirseniz. Aradaki tüm commitleriniz tek bir komutla geri alınır. Aşağıda örneğini görebilirsiniz.

— Revert -m: Merge işlemi yaptınız. Bunu geri almanın güzel bir yoludur. Merge işleminizi sorunsuz bir şekilde geri alabilirsiniz. (Fast-forward için geçerli değil. Revert commiti geri almaya yarıyor ve Fast-forward işleminde merge-commit oluşmadığı için revert işlemine uygun değil.)

Daha fazla bilgi için Git-Documantation’a bakabilirsiniz.

--

--