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:
- Bir dosyaya bir değişiklik göndererek değişikliği main olarak birleştirin.
- Bazı iş arkadaşlarınız da dallarını main ile birleştirir.
- Bir süre sonra geri gelirsiniz ve değişikliklerinizin eksik olduğunu fark edeceksiniz.
- 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 log
geçmiş basitleştirmesinin gerçekleşmemesidir.
Geçmiş basitleştirmesini kapatmak için komut satırı anahtarını --full-history
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:
Gördüğünüz gibi şunları yapacağız:
- dosyasını oluşturun.
- Bu dosyaya bir dalda (hayvanlar) bir satır ekleyin.
- Bu dosyaya başka bir dalda (fruit) farklı bir satır ekleyin.
- Dal hayvanlarını main'a geri birleştirin.
- Dal meyvesini main'a geri birleştirin ve dosyanın meyve dalından tüm kopyasını seçin.
- 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:
(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.