Conflict (Ders 8)
Bir önceki derste nispeten gerçekçi bir durumu ele almıştık. Fakat ne yazık ki koldar her zaman bu kadar temiz bir şekilde birleşmiyor. Bazen iki kişi aynı satırı değiştirmiş olabiliyor. Bu durumda git ne yapacağını bilemiyor, merge (birleştirme) işlemini yarıda bırakıyor ve hangi satırları kullanması gerektiğini bize soruyor.
Hemen basit bir şekilde böyle bir durum yaratalım. Diyelim ki oyundaki karakterlerden birisinin ismi değişti. Ekip içinde bir iletişim problemi oluştu, bize ve Ece’ye karakter isimlerini değiştimemiz gerektiği söylendi ve farklı isimler verildi. Ece Refik karakterinin ismini Yılmaz yaptı. GitDers_Ece/GitDers/Scripts klasöründeki Karakterler.txt dosyası şu hale geldi:
Fatih
Aylin
Yılmaz
Turgut
Fuat
Fırat
Ece bu değişikliği hiç vakit kaybetmeden “Karakter değişikliği” başlığı ile commit edip push ile sunucuya gönderdi.
Biz de Refik karakterinin ismini Yıldırım yaptık. Yani GitDers/Scripts klasöründeki Karakterler.txt dosyasını şöyle değiştirdik:
Fatih
Aylin
Yıldırım
Turgut
Fuat
Fırat
Commit mesajı olarak “Karakter güncellendi” yazıp commit’imizi yaptık.
Şimdi commit’imizi sunucuya push’lamak istiyoruz. Bir önceki derste öğrendiğimiz gibi Pull origin diyerek projemizi güncelliyoruz. Fakat bu defa karşımıza Resolve conflicts before merging origin/master into master mesajı çıkıyor. Mesajda bir dosyanın çeliştiği yazıyor (1 conflicted file).
Eğer şimdi projemizdeki Karakteler.txt dosyasını açarsanız karşınıza şöyle bir şey çıkacaktır:
Fatih
Aylin
<<<<<<< HEAD
Yıldırım
=======
Yılmaz
>>>>>>> ca1175392b34f2e160ccda67496303447a97ff42
Turgut
Fuat
Fırat
Burada < işaretleri ile başlayan satır conflict‘in ya da çelişkinin başlangıcını, > işareti ile başlayan satır ise bitişini gösteriyor. = işaretine kadarki kısım bizim yaptıklarımıza ondan sonraki kısım ise sunucudan gelenlere denk geliyor. Bu çelişkiyi çözmenin en basit yolu bütün alakasız satırları silmek. Yani Ece’nin değişikliğini almak ve kendi yaptıklarımızı silmek istiyorsak Yılmaz haricindeki her şeyi silebiliriz:
Fatih
Aylin
Yılmaz
Turgut
Fuat
Fırat
Veya hem Yılmaz’ı hem de Yıldırım’ı ayrı karakterler olarak da tutabiliriz:
Fatih
Aylin
Yıldırım
Yılmaz
Turgut
Fuat
Fırat
Yani <, > ve = ile başlayan satırları sildiğimiz taktirde git bunu bir çelişki olarak görmeyecektir.
Benim bilgisayarda Visual Studio Code yüklü olduğu için Github Desktop bu çelişkiyi çözmek için onu açmayı teklif ediyor. VSCode bu çelişkileri renkli bir şekilde gösterip daha kolay görmeyi sağlıyor.
Ayrıca çelişkinin üzerinde birleştirme işlemini otomatik yapmayı öneren birkaç opsiyon da mevcut. Bu işlemler büyük dosyalarda çok karmaşık bir hale gelebiliyor, o nedenle bunun için özelleşmiş Beyond Compare veya SourceGear DiffMerge gibi programlar var. Onlara da daha sonra göz atabiliriz.
Ben iki değişikliği de kabul edip dosyayı kayedeceğim. Bunu yaptıktan sonra Github Desktop’a dönün ve hiç çelişki kalmadığına dair bir mesaj göreceksiniz.
Commit merge diyerek bir önceki derste git’in otomatik olarak yaptığı commit’i yapabilirsiniz.
Git’in çok daha fazla ayrıntısı olsa da takım içinde çalışırken büyük ölçüde bu komutları kullanacaksınız. Github Desktop programına alışınca ve git’in nasıl çalıştığını iyice kavrayınca SourceTree gibi daha ayrıntılı bir araca geçmenizi ya da komut satırı ile git’i kullanmayı öğrenmenizi tavsiye ederim.
Filed under: Git - @ December 15, 2019 11:02 pm
Tags: Programlama, git, versiyon kontrol, proje yönetimi, conflict, git conflict