Git geçmişini basitleştirmeyi anlama

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git geçmişini basitleştirme kafa karıştırıcı bir canavar olabilir. Zamanın %99'unun 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öndererek değişikliği main olarak birleştirin.
  2. Bazı iş arkadaşlarınız da dallarını main ile birleştirir.
  3. Bir süre sonra geri gelirsiniz ve değişikliklerinizin eksik olduğunu fark edeceksiniz.
  4. Suçluyu arıyorsanız, dosya geçmişine bakın ve bildirimde bulun... değişiklikleriniz listelenmiyor bile!?

Git işleme geçmişi bir ağaçtı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ında tü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, hayal kırıklığına uğrayabilir ve değişikliklerimin nereye gittiğini merak ediyor olabilirsiniz.

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

Varsayılan olarak, günlük komutunun bir dosyada git log file.txt çalıştırılması geçmişi otomatik olarak basitleştirir ve büyük olasılıkla bazı işlemeleri çıkışından gizler. Daha fazla bilgi için git log man sayfasına bakın.

Karışıklığa ek olarak, tüm değişikliklere baktığınızda basitleştirebileceğiniz bir şey olmadığından, yalnızca komutunu çalıştırdığınızda git loggeçmiş basitleştirmesinin gerçekleşmemesidir.

Geçmiş basitleştirmesini kapatmak için komut satırı anahtarını --full-historykullanmanı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ı

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

  1. dosyasını 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. Dal hayvanlarını main'a geri birleştirin.
  5. Dal meyvesini main'a geri birleştirin ve dosyanın meyve dalından tüm kopyası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 temelde 1. ve 5. adım arasında değişmediğini fark eder ve bu nedenle bize yalnızca iki geçmiş girdisi gö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 dosyamızın test.txt 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? Günlük çıkışımızda hiçbir şey olağan dışı görünmüyor. Ş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.

Birleştirme çakışması. Biraz dikkate aldıktan sonra, meyve dalımızdaki dosyanın tamamını test.txt 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 dosyamızın test.txt 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

Elbette, günlükteki ilk denememizden hiçbir değişiklik görmüyoruz ve birleştirmemizi 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, bayrağı olmadan full-history 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
  • Bayrağı --full-history size daha kapsamlı bir dosya geçmişi verir

Güncelleştirme: Bu makaleyi yazdığımdan beri Azure DevOps Services web'de 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 "olduğu gibi" sağlanır. URL ve diğer İnternet Web sitesi başvuruları da dahil olmak üzere bu belgede ifade edilen bilgiler ve görünümler bildirimde bulunmadan değişebilir. Kullanım riski size aittir.

Bu belge size, Microsoft ürünlerinin fikri mülkiyeti konusunda herhangi bir yasal hak sağlamamaktadır. Kendinize özgü başvuru amaçlarıyla bu belgeyi kopyalayıp kullanabilirsiniz.