15 Nisan 2015 Çarşamba

Team Foundation Server'da Conflict (Çakışma) Türleri ve Çözümleri

     Team Foundation sürüm denetimi kullanmanın bir avantajı, bir çok kişinin aynı anda çalışabildiği dosyaları yönetebilmektir. Bir eksisi ise bazen get, check-in, unshelve, merge ya da geri alma işlemlerinden önce çakışmaları çözmeniz gerekmektedir. Conflict ( Çakışma) ile karşılaşmak can sıkıcı olabilir, ancak sistem, çakışmaları anlamanıza ve çözümlemenize yardımcı olacak bilgi ve araçları sağlar.[1]

     Peki nedir bu çakışma, neden oluşur, genel olarak açıklamak gerekirse;
     Eğer check-out yapmadan önce get latest ile son sürümü aldıysanız, dosyaları check-in edeceğiniz zaman server sizin değişikliklerinizin eski versiyon üzerinde kaldığını bilir ve sizin müdahele ettiğiniz satırlarda yeni versiyonda değişiklik varsa sizi çakışma olduğu doğrultusunda uyarır ve check-in yapmadan önce bunları düzeltmeniz gerektiğini belirtir. Şekil 1'de görsel olarak özetlemek gerekirse;
Şekil 1: Conflict[2]
     Çakışma aşağıdaki operasyonlar sırasında oluşabilir:
  • Branchlar arasındaki değişikleri merge ederken
  • Kendi çalışma alanınıza (workspace) dosyaları alırken (get işlemleri)
  • Dosyanın yeni sürümünü check-in yaparken [3]
     1. Çakışma Türleri     1.1 - Versiyon Çakışması
     Versiyon çakışmaları chech-in, get ya da merge işlemleri sırasında oluşabilir. Her durum çakışma için farklı sonuçlar oluşturmaktadır.
  • Check-in: İki kullanıcı dosyanın son sürümlerini check-out eder. İlk kullanıcı değişikliklerini check-in eder; bu durum dosyanın yeni sürümünü yaratmış olur. İkinci kullanıcı check-in yapmaya çalıştığında versiyon çakışması olur çünkü ikinci kullanıcının değişiklikleri dosyanın son sürümü üzerinde yapılmamıştır.
  • Get: İki kullanıcı dosyanın son sürümlerini check-out eder. İlk kullanıcı değişikliklerini check-in eder; bu durum dosyanın yeni sürümünü yaratmış olur. İkinci kullanıcı get latest işlemi yaptığı zaman versiyon çakışmasına neden olur çünkü get latest işlemi workspacedeki check-out edilmiş dosyayı update etmeye çalışır.
  • Merge: Branch edilmiş dosya iki branchta da değiştirilirse oluşur. Yani kullanıcı değişiklikleri bir branchtan diğerine merge etmeye çalıştığında versiyon conflict oluşur çünkü dosya iki branch üzerinde de değiştirilmiştir.
     Tablo 1'de versiyon çakışması için çözüm olarak hangi durumlarda neler yapılacağı kısaca gösterilmektedir.

Tablo 1: Versiyon Çakışması Çözüm Seçenekleri [3]
     1.2 -  Dosya Adı Çakışması
     Dosya adı çakışmaları chech-in, get ya da merge işlemleri sırasında oluşabilir.  Bu 3 durumda da, Source Control Server'da iki ya da daha fazla öğe aynı yolu işgal ederse conflict ile sonuçlanır.

  • Check-in: İki kullanıcı aynı uygulamaya dosya ekler. Tesadüfen iki kullanıcı da yeni dosyaları için aynı ismi seçerler. Bir kullanıcı kendi dosyasını check-in eder. Bu durumda diğer kullanıcı check-in yapmaya çalışırsa dosya adı çakışması meydana gelir.
  • Get: İki kullanıcı aynı uygulamaya aynı isimli dosya eklerler. Bir kullanıcı kendi dosyasını check-in eder. Diğer kullanıcı get latest işlemini yapmaya çalıştığında dosya adı çakışması meydana gelir çünkü ilk kullanıcının eklediği dosya ikinci kullanıcının eklediği yere alınamaz.
  • Merge: Uygulama branch edilmiş ve iki branchta da çalışılıyorsa bu iki brancha aynı isimli dosya eklendiğinde kullanıcı iki branchı merge etmek istediğinde dosya adı çakışması oluşur. Çünkü kaynak brancha eklenen dosya hedef branchta zaten olduğu için branch edilemez.

     Dosya adı çakışmaları server path namespace'e öğe ekleme ya da taşıma işlemleri sırasında da oluşabilir. Bunlar add, rename, branch undelete, merge işlemleri olabilir.
     
    Tablo 2'de dosya adı çakışması için çözüm olarak hangi durumlarda neler yapılacağı kısaca gösterilmektedir.

Tablo 2: Dosya Adı Çakışması Çözüm Seçenekleri [3]
     1.3 - Yerel Dosya Üzerine Yazma Çakışması
     Sadece get işlemleri sırasında oluşur. Bu çakışma get işlemi kendi çalışma alanınızdaki yazılabilir dosyanın üzerine yazmaya çalıştığında oluşur. Yerel dosya üzerine yazma çakışmaları dosyanın üzerine yazma ya da dosyayı check-out etme ve değişiklikleri merge etmeyi içerir.

     2. Çakışmaları Giderme
     Şekil 2'de görüldüğü gibi conflict oluştuğu zaman Team Explorer'da çıkan "Resolve Conflicts" linkine tıklayınca açılan şekil 3'teki pencereyi çakışmaları gidermek için kullanabilirsiniz.

Şekil 2: Resolve Conflicts
   
Şekil 3: Resolve Conflicts Penceresi
     Resolve Conflict penceresi default olarak sadece en son denediğiniz işlemin neden olduğu çakışmaları gösterir. Şekil 3'te sol üstte görüldüğü gibi "Path Filter applied" yazısı bunu belirtmektedir. Tüm çakışmaları göstermek için "Get All Conflicts" yazısına tıklayarak "Path Filter applied" yazısı yerinde çalışma alanımızdaki tüm çakışmaların sayısını ve neler olduklarını görebiliriz.

     Çalışma alanınızdaki dosyalarda değişiklik yaptığınızdan bu yana uzun zaman geçtiyse, yeni çakışmalar oluşmuş olabilir. Bu yüzden işlem yapmadan önce "Refresh" butonu ile Resolve Conflict penceresini yenilemeniz daha iyi olacaktır.

     Her çakışma bilgileri ve bazen çözümlemenize yardımcı olabilecek bağlantıları içerir. Conflict hakkında daha fazla bilgi almak için üzerine sağ tıkladığınızda çıkan menüde History, Compare ve Annonate seçenekleri mevcut.

     History, dosyanın geçmişini görüntüler. Çakışmaya neden olan işlem Merge ya da Rollback (Geri Alma) ise, Source History (Kaynak Geçmiş) ya da Target History'yi (Hedef Geçmiş) seçip çakışmaya neden olan dosyanın geçmişine bakabilirsiniz.
     Annonate, dosyanın en son sürümünde yapılan tüm değişiklikler hakkında, her değişikliği kimin ve ne zaman yaptığı gibi, ayrıntıları görüntülemek için kullanabilirsiniz.
     Compare, karşılaştırma penceresini açarak kodunuzdaki farklılıkları listeler ve buradan rahatlıkla çakışmaya neden olan satırları görebilirsiniz.

     2.1 - Çakışmalar için AutoResolve All
     Söz konusu seçeneği kapatmadığınız sürece varsayılan olarak sistem otomatik olarak çakışmalara "AutoResolve All" işlemini yapmaya çalışır. Resolve Conflicts penceresinde, AutoResolve All'u el ile seçtikten sonra iki seçeneğiniz oluyor:

     All Conflict Types; Sistemin çakışmaları tüm sezgisel yöntemlerini kullanarak otomatik olarak çözümlemeyi denemesini istiyorsanız bu seçeneği kullanabilirsiniz.
     Specific Conflict Types; Sistemin çakışmaları çözümlemeyi denemesini, ama bazı sezgisel yöntemleri dışlamayı istiyorsanız  bu seçeneği kullanabilirsiniz. Bunu seçtikten sonra şekil 4'te görülen Choose Conflicts To Resolve (Çözümlenecek Çakışmaları Seç) iletişim kutusu belirir. Etkinleştirmek ya da devre dışı bırakmak istediğiniz seçenekleri işaretleyip ya da temizleyip  AutoResolve'e (Otomatik Çöz) tıklayarak tamamlayabilirsiniz.
 
Şekil 4: Çözümlenecek Çakışmaları Seç
     Sistem Pending Changes (Bekleyen Değişiklikler) penceresinde görüntülenen çakışmaları otomatik olarak çözümleme girişiminde bulunur.Ancak sistemin otomatik olarak çözümleyemediği çakışmalar pencerede kalmaya devam eder. Bu çakışmaları manuel olarak çözümlemeniz gerekmektedir. 

     Eğer bu seçeneğin default olarak kalmasını istemiyorsanız, menü çubuğundan Araçlar, Seçenekler'i seçin ve ardından Seçenekler iletişim kutusunda Kaynağı Denetle, Visual Studio Team Foundation Server'a gidip "Attempt to automatically resolve conflicts when they are generated" (Oluştukları anda çakışmaları otomatik olarak çözümlemeyi dene) onay kutusunun işaretini kaldırın.

     2.2 - Otomatik Seçenekleri Anlama
     Şekil 4'teki penceredeki seçenekleri anlamak için tablo 3'ü inceleyebilirsiniz.

Tablo 3: Otomatik Seçenekleri Anlama [3]

     2.3 - AutoMerge
     Yukarıdaki otomatik seçenekleri anlama bölümünde açıklanan tüm AutoMerge seçeneklerini kullanarak seçilen çakışmaları çözümlemeyi denemek istiyorsanız bunu seçebilirsiniz. 
     CONTROL ve SHIFT tuşlarını basılı tutup ve birden çok çakışma seçebilirsiniz.
     AutoMerge devre dışıysa, bu çakışma manuel olarak çözümlenmelidir.

     2.4 - Çakışmayı El ile (Manuel) Çözümleme
     Sistem otomatik olarak bir çakışmayı çözümleyemezse veya neyin değiştiğini anladığınızdan emin olmak istiyorsanız, çakışmayı el ile çözümlemeniz gerekir. Her bir çakışma içinde, sistem çakışmaları çözümlemek için gerçekleştirebileceğiniz eylemleri görüntüler. Görüntülenen eylemler çakışma türüne ve çakışmaya neden olan işleme bağlıdır.
     Merge aracı ile değişiklikleri birleştirme;
     Çakışan içerik değişiklikleri nedeniyle bir çakışma oluştuğunda Resolve Conflict penceresindeki "Merge Changes in Merge Tool" seçeneğini seçebilirsiniz. Daha sonra şekil 5'te görüldüğü gibi farklılıkları gösteren merge penceresi açılmaktadır.

Şekil 5: Merge Penceresi
     Çakışmayı çözmek için yapmanız gereken alttaki Result bölmesinde gösterilmiştir. Bu pencerede, aşağıdakileri yapabilirsiniz:
  • Pencere yerleşimini seçebilirsiniz: Dikey Görünüm, Yatay Görünüm, Karışık Görünüm.
  • Farklar ve çakışmalar arasında gezinebilirsiniz.
  • Resultta içerilecek dosyayı sol ve sağ sürümlerinden (source yada target) yanlarındaki check box ile seçebilirsiniz. 
  • Reasult bölmesindeki dosyaya ek içerik yazabilirsiniz.
  • Üst menüden dosyanın geçmişini görüntüleyebilirsiniz.
  • Dosyanın çeşitli sürümlerini karşılaştırabilirsiniz.
  • Kimin neyi değiştirdiğini görmek için dosyaya açıklama ekleyebilirsiniz.
     Result bölmesinin içeriğinden memnun olduğunuzda, sol üstteki "Accept Merge" (Birleştirmeyi Kabul Et) seçerek işlemi tamamlayabilirsiniz. 

     Böylece çakışma olması halinde düzeltme yollarını tamamlamış oluyoruz. Bu haftalık yazımı burada bitiriyorum. Haftaya Work Item konusu üzerinden devam edeceğim.  
 
     Okuduğunuz için teşekkürler...










Referanslar:
[1] Resolve Team Foundation Version Control conflicts, https://msdn.microsoft.com/tr-tr/library/ms181432.aspx, 14.04.2015
[2] Check Out in Team System, http://www.woodwardweb.com/vsts/000179.html, 14.04.2015
[3] Understanding File Differences and Conflict Types, https://msdn.microsoft.com/en-us/library/ms181434(v=vs.90).aspx#LocalOverwrite, 15.04.2014

Hiç yorum yok:

Yorum Gönder