Git ile tarihi baştan yazmak

Git kullanırken proje geçmişini düzgün tutmak ve yanlış bir commit yapınca düzeltmek mümkün. Web’de bu konuyla ilgili güzel dökümanlar var; şu ve şu sayfalara bakmanızı öneririm öncelikle. Ben biraz daha uygulamalı olarak bahsetmek istiyorum.

git commit

Şimdi, diyelim ki hatalı bir commit yaptık ve bunu düzeltmek istiyoruz. Ben boş bir git repository’si ile başlayıp bir dosya ekleyip commit edeceğim.

İlk commit cbe0bc7!

Yaptığımız bu commit’i düzenlemek için öncelikle gerekli değişiklikleri yapıp git add komutu ile değişikliği staging-area’ya almamız lazım. hello dosyasının adını text olarak değiştirip commit etmek üzere ekliyorum.

Değişiklikler.

Eğer ilk commit’imizi git history’sinde görmek istemiyorsak git commit --amend komutu ile yaptığımız değişiklikleri ilk commit olacak şekilde güncelleyebiliriz.

Komut ile birlikte böyle bir sayfa gelecek karşınıza.

İlk yaptığımız commit’in mesajını da yukarıdaki ekranda güncelliyoruz ve kaydedip çıkıyoruz.

a4a9f66 is the new first commit!

Commit’i güncelledik ama tabi commit-id’si değişmiş oldu. Burası önemli.

Yapılan son commit’i düzeltmek aslında işin kolay tarafı. Peki daha önce yapılan bir commit nasıl düzenlenecek?

git rebase

Rebase komut’u yapılan commit’leri başka bir branch’e veya commit üzerine tekrar eklemeye yarıyor diyebiliriz. Bunu yaparken kullanabileceğimiz bir de interaktif mod’u var. Eklemelerin hepsini sırayla tek seferde yapmak yerine (Herhangi bir conflict durumunda devam etmiyor) tek tek yapılmasına yarıyor. Bu da düzeltmek istediğimiz commit sırasında durup yine git commit --amend kullanabiliriz anlamına geliyor.

Düzgün bir şekilde deneyebilmek için oluşturduğum repository’ye 2 commit yaptım.

Tarihimizle yüzleşmek O.o

Yaptığım son 2 commit’i de düzenlemek istediğimi düşünün.

Bunun için çalıştırmamız gereken komut: git rebase -i HEAD~2

Neden HEAD~2? Çünkü HEAD’in göstermiş olduğunu commit’ten önceki 2 commit’i güncellemek istiyoruz.

Neden -i? Çünkü interaktif mod’unu kullanacağız.

Let’s do this!

rebase management

Yine bir garip ekran.

Bu sayfaya commit’lerle ilgili yapmak istediğimiz işlemleri eklememiz gerekiyor. Örneğin sadece commit-msg’ını güncelleyeceksek ilgili commit’in olduğu satırda pick yerine r veya reword; commit’i içeriği ile birlikte güncellemek istiyorsak e veya edit yazmalıyız. Ben ilk commit’in mesajını güncelleyip ikinci commit’i içeriği ile beraber düzenliyorum.

reword & edit

Kaydedip çıktıktan sonra ilk commit için commit-msg düzenleme ekranı çıkıyor otomatik olarak. Burada yapmak istediğim değişikliği yaptıktan sonra rebase işlemi devam ediyor.

Done.

İşlem tamamlandı, ilk değiştirmek istediğim commit’i düzelttim. Rebase işlemi bir sonraki adımda commit içeriği ile ilgili yapılması gereken değişiklikler için duruyor.

git commit –amend my old friend.

O zaman düzenleyelim; hem dosya içeriğini hem de commit mesajını güncelleyelim.

Yoruma gerek yok aslında. Görüyorsunuz.

Sırasıyla git add hello.txt ve git commit --amend yapıyoruz. Son commit’i düzenleme işlemi ile aynı süreç.

Commit işlemi bittikten sonra işimiz tam bitmiş sayılmıyor.

Son bir işlem kaldı.

git rebase --continue diyerek işlemi tamamlıyoruz.

History gibi history.

Her zaman işler bu sayfada olduğu gibi olmuyor tabi ki. Üstüste yapılan commit’lerde eğer aynı satırlarda değişiklikler varsa conflict’leri çözmek gerekiyor öncelikle. Onunla ilgili de buradaki yazıya bakabilirsiniz.

See you later!

Kaynaklar

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s