Git geçmişini basitleştirmeyi anlama

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Git geçmişini basitleştirmek kafa karıştırıcı bir süreç olabilir. Zamanın 99% var olduğunu bile bilmeyeceksiniz, ancak bazen Git'in karanlık köşelerinden atlar ve sizi ısırır. Bu makalede, geçmiş basitleştirmenin ne olduğunu ve dosya geçmişine bakarken karışıklığa nasıl neden olabileceğini inceleyeceğiz.

Yaygın bir senaryoyla başlayalım:

  1. Bir dosyaya bir değişiklik gönderir ve ardından bu değişikliği ana dala (main) birleştirirsiniz.
  2. Bazı iş arkadaşlarınız da dallarını ana dal ile birleştiriyor.
  3. Bir süre sonra geri gelirsiniz ve değişikliklerinizin eksik olduğunu fark edeceksiniz.
  4. Suçluyu ararken, dosya geçmişine bakıyorsunuz ve fark ediyorsunuz ki... değişiklikleriniz listelenmiyor bile!?

Git commit geçmişi bir ağaç yapısıdır. Bazen kronolojik geçmiş, gerçek dosya ağacı geçmişiyle aynı değildir. Bu durum, en sık birleştirme işlemesi bir dosyayı özgün durumuna geri döndürüyorsa oluşur. Bu durumda, varsayılan geçmiş görünümü aslındatüm değişiklikleri göstermez çünkü teknik olarak dosya değişmedi. Bu senaryoda Git, geçmişi basitleştirebileceğini fark eder ve büyük olasılıkla aradığınız "değişiklikler" günlükten kaldırılır.

Daha önce karşınıza çıkmadıysa, Değişikliklerimin nereye gittiğini merak edip hayal kırıklığına uğrayabilirsiniz.

Geçmiş basitleştirmesi: Varsayılan olarak Açık

Varsayılan olarak, bir dosya (git log file.txt) üzerindeki log komutunu çalıştırmak, geçmişi otomatik olarak sadeleştirir ve bazı commit'leri çıktısından gizleyebilir. Daha fazla bilgi için git günlük el kitabı sayfasınabakın.

Karışıklığa ek olarak, geçmiş basitleştirmenin oluşmamasıdır. Tüm değişikliklere baktığınızda basitleştirebileceğiniz bir şey yoktur.

Geçmiş basitleştirmesini kapatmak için --full-historykomut satırı anahtarını kullanmanız gerekir.

Geçmiş Basitleştirme Örneği

Basitleştirmenin nasıl çalıştığını daha iyi anlamak için kendi tarih basitleştirme örneğimizi oluşturuyoruz. İlk olarak, oluşturacağımız geçmişin diyagramına bakalım:

git dallarını

Gördüğünüz gibi şunları yapacağız:

  1. Bir dosya oluşturun.
  2. Bu dosyaya bir dalda (hayvanlar) bir satır ekleyin.
  3. Bu dosyaya başka bir dalda (fruit) farklı bir satır ekleyin.
  4. hayvan dalını ana ile birleştirin.
  5. Dalı meyve ana dala geri birleştirin ve meyve dalından dosyanın tamamını seçin.
  6. Dosyanın geçmişini denetleyin.

Git bizim için tarihi basitleştirecek. Buradaki anahtar 5. adımdır. hayvan dalındaki tüm değişiklikleri yok saydık. Git, dosyamızın aslında 1. ve 5. adım arasında değişmediğini fark eder ve bu yüzden yalnızca iki geçmiş girdisigösterir.

İlk olarak dosyayı oluşturup depomuza ekleyeceğiz:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Şimdi bir hayvan dalındaki dosyaya "eşekler" metnini eklemeye karar verdik:

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Denemeler yaparken, bunun yerine dosyamızda meyveyle devam etmek istediğimize karar veririz, bu nedenle farklı bir dal oluşturur ve dosyanın sonuna "muzlar" metnini ekleriz:

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Değişikliklerimizden memnun hissediyoruz, hayvan dalımızı tekrar ana dalda birleştirmeye karar verdik:

> git checkout main
> git merge animals

Şimdi test.txt dosyamızın günlüğüne bakalım:

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Şimdiye kadar çok iyi, değil mi? Kayıt çıktımızda olağan dışı görünen bir şey yok. Şimdi fikirlerimizi değiştirip meyve dalımızı birleştirmeye karar verdik diyelim:

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

Eyvah, birleştirme çakışması. Biraz düşündükten sonra, meyve dalımızdan gelen test.txtdosyasının tamamını kullanmaya karar verdik. Genellikle bir tür metin düzenleyicisi veya birleştirme aracı kullanırsınız, ancak yalnızca iki satır olduğundan dosyanın tamamını yeniden oluşturacağız:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Şimdi test.txt dosyamızın geçmişine göz atalım:

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Beklendiği gibi, günlükteki ilk denememizden hiçbir değişiklik görmüyoruz ve birleşimimizi de görmüyoruz! Hala oradalar mı? Git değişiklikleri tamamen ortadan kaldırdı mı?

> git log --full-history test.txt

Gördüğünüz gibi, full-history bayrağı olmadan günlüğü basitleştirse de Git tüm değişikliklerimizi saklamıştır:

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Git geçmişi basitleştirme özeti

Tarih basitleştirmesinin en önemli özelliği çoğu zaman bunu asla farkedemeyecek olmanızdır. Ancak birleştirme çakışması ters gittiğinde ve ne olduğunu öğrenmek istediğinizde git günlük geçmişine bakıp değişikliklerinizin nereye gittiğini merak edebilirsiniz.

Panik yerine şunu biliyorsun:

  • Dosyalar için geçmiş basitleştirmesi varsayılan olarak açıktır
  • --full-history bayrağı size daha kapsamlı bir dosya geçmişi verir

Update: Bu makaleyi yazdığımdan Azure DevOps Services, webüzerinde harika geçmiş görüntüleme seçenekleri sunmİşlemiştir. Bunun anlamı, komut satırında gezinmek istemiyorsanız, yalnızca gezginimizde geçmişini görüntülemek istediğiniz dosyayı çekebileceğiniz ve size basit veya basit olmayan geçmiş görünümleri belirtebileceğiniz aşağıdaki geçmiş filtresi gösterilir:

Git Filtreleri

(c) 2016 Microsoft Corporation. Tüm hakları saklıdır. Bu belge "as-is" olarak sağlanmaktadır. URL ve diğer İnternet Web sitesi başvuruları da dahil olmak üzere bu belgede ifade edilen bilgiler ve görüşler bildirimde bulunmadan değişebilir. Kullanım riski size aittir.

Bu belge size herhangi bir Microsoft ürünündeki herhangi bir fikri mülkiyet için herhangi bir yasal hak sağlamaz. Bu belgeyi iç ve başvuru amacıyla kopyalayabilir ve kullanabilirsiniz.