Git neden revizyon numaraları yerine hash kullanıyor?


80

Git'in neden revizyon numaralarını tercih ettiğini merak ettim. Revizyon numaraları çok daha açık ve daha kolay anlaşılır (bence): Birine 1200 no'lu revizyona göz atma veya 92ba93e işleme koyma arasında bir fark var! (Sadece bir örnek vermek için).

Peki, bu tasarım için herhangi bir sebep var mı?


3
"V1.0" ile bir etiketi etiketleyebilir ve ardından bu etiket tarafından verilen işleme başvurabilirsiniz. Bkz git-scm.com/book/en/v2/Git-Basics-Tagging
Michael Durrant

Yanıtlar:


114

Tek, monoton olarak artan bir revizyon numarası yalnızca, tüm revizyonların sayıları izleyebilen ve atayabilecek tek bir yere aktığı merkezi bir sürüm kontrol sistemi için gerçekten anlamlıdır. Deponun çok sayıda kopyasının bulunduğu ve değişikliklerin keyfi iş akışlarında çekilip itildiği DVCS dünyasına girdiğinizde, kavram geçerli olmaz. (Örneğin, revizyon numaraları atamak için tek bir yer yoktur - havuzunuzu istiflerseniz ve bir yıl sonra değişikliklerimi almaya karar verirseniz, bir sistem revizyon numaralarımızın çelişmemesini nasıl sağlayabilir?)


11
Çarşıya bakmak isteyebilirsiniz - hala revizyon numaralarını tutan bir DVCS. Buradaki tek garanti, revizyon numaralarının bir dalda benzersiz olmalarıdır.
krlmlr

3
@ krlmlr Person 1: "Hey, <P2>, what was revision 12345 for?" P2: "Revision 12345 was commited by <P3>." P3: "I don't have a revision 12345..."- Doğru hatırlıyorsam, Mercurial'ın da benzer bir sorunu var. Öte yandan, git kullanıyor olsaydı, hepsinin her bir işlem için özdeş referansları olurdu.
Izkata

1
@Izkata: P1: "Do you have revision with the GUID gdlmsnblngoijlafd-35345-fg?"... Bazaar'da hala GUID var ...
krlmlr 20:13

5
@Izkata Mercurial yok değil benzer bir sorun var. Aynen olduğu gibi karma kullanırlar git. Ayrıca, yazma kolaylığı için yalnızca yerel bir rev numarası sağlarlar.
Hank Gay,

1
git ile, karma değerin ilk 5 karakteri genellikle tam revizyon kimliği için bir steno kullanacak kadar benzersizdir.
mendota

40

Dağıtılmış bir sistemde karmalara ihtiyacınız var. Diyelim ki siz ve bir meslektaşım aynı depoda çalışıyorsunuz ve ikiniz de yerel olarak bir değişiklik yaptınız ve daha sonra zorluyorsunuz. 1200 numaralı revizyona kim girecek ve herhangi bir taraf hakkında herhangi bir bilgiye sahip olmadığından verilen 1201 numaralı revizyon kim olacak? Tek gerçekçi teknik çözüm, bilinen bir yöntemi kullanarak değişikliklerin karmaşasını oluşturmak ve buna dayanarak olayları birbirine bağlamaktır.

İlginç bir şekilde HG sürüm numaralarını desteklemektedir, ancak bunlar açıkça yalnızca yerel bir özelliktir - havuzunuzda bir küme vardır, iş arkadaşınızın deposunda nasıl itilip çekildiğine bağlı olarak farklı bir küme bulunur. Komut satırı kullanımını Git'ten biraz daha kolay hale getiriyor.


34

Veri bütünlüğü.

Mevcut cevaplara saygıyla katılmıyorum. DVCS için karmalar gerekli değildir, bkz . Çarşı yolu . Herhangi bir başka küresel benzersiz tanımlayıcı ile de yapabilirsiniz. Karma değerler, veri bütünlüğünü güvence altına almak için bir önlemdir: Nesnenin içerdiği bilgilerin özetini (işleme, ağaçlar, ...) gösterir. İçeriği, karma bir değişiklik yapmadan (yani bir ön saldırı veya çarpışma saldırısı ) değiştirmenin imkansız olmasa da zor olduğuna inanılmaktadır. (Gerçekten merak ediyorsanız, 2011'de Marc Stevens'ın makalesine bakın ).

Bu nedenle, nesnelere SHA karmaları ile atıfta bulunmak, içeriğin değiştirilip değiştirilmediğini kontrol etmeyi sağlar. Ve (neredeyse) benzersiz olmaları garanti edilirse, revizyon tanımlayıcıları olarak da kullanılabilirler - uygun şekilde.

Daha fazla ayrıntı için Git kitabının 9. Bölümüne bakın .


8
Bu bir güvenlik önlemi değildir, çünkü karma değiştirilmiş bir taahhüt için kolayca yeniden hesaplanabilir. Yalnızca bütünlük için kullanılır, hesaplanan karma değere karşı içeriği doğrulamak için kullanılır - Git'teki SHA-1 kullanımı hakkındaki Linus Torvalds'ın bu yoruma bakınız .
Lee,

@Lee: Eğer Chuck'ın deposu, Alice ve Bob'un revizyon karmaşası açısından sahip olduklarından farklıysa, Chuck'ın da farklı içeriklere sahip olduğu garanti edilir. Öte yandan, Chuck'ın revizyon haslıklarıyla aynı görünen farklı içeriklere sahip bir depo üretmesi çok zor.
krlmlr

@Lee: Bağlantını kaçırdım. O zaman "veri bütünlüğü"
diyelim

cevap doğru olmalı
SuperUberDuper

8

Layman'ın sözleriyle:

  • Hash'lerin neredeyse evrensel olarak benzersiz olması amaçlanmıştır . Garanti edilmez, ancak aynı SHA'nın farklı içerik için üretilmesi son derece düşük bir ihtimaldir. Belirli bir proje için pratik terimde benzersiz olarak kabul edebilirsiniz.
  • Revizyon numaraları ile, özellikle 1200 revizyonuna geçmek için bir ad alanı kullanmak zorunda kalacaksınız.
  • Git hem dağıtılmış hem de merkezi olarak çalışabilir. Peki revizyon numaralarını nasıl doğru ve benzersiz hale getirirsiniz?
  • Ayrıca revizyon numaralarının kullanılması, yeni revizyonların daha yüksek rakamlara sahip olması ve dallanma, birleşme, yeniden yapılanma vb.
  • Etiketleri her zaman taahhütlere koyma seçeneğiniz vardır.

32
Benzersiz olacağı garanti edilmez, benzersiz olması muhtemeldir. :)
dsw88

@ mustang2009cobra Bu doğru.
Tulains Córdova

1
Değişiklik kabul edilmedi, çünkü karma değişmedi. İki meteorun aynı anda bilgisayarımı ve bilgisayarı depoya çarpması, bilgisayarları tahrip etmesi ve katılan herkesi öldürmesi daha muhtemel.
gnasher729


1

Hash, dağıtılmış VCS için benzersiz bir çözüm değildir. Ancak dağıtık bir sistemle ilgilenildiğinde, olayların yalnızca kısmi sıralaması kaydedilebilir. (VCS için, etkinlik bir taahhüt olabilir.) Bu nedenle, monoton olarak artan bir revizyon numarası elde etmek imkansızdır. Genellikle böyle kısmi sıralı bir ilişkiyi kaydetmek için vektör saati (veya vektör zaman damgası) gibi bir şey benimseriz . Çarşı'da kullanılan çözüm budur .

Peki neden Git vektör saati yerine karma kullanıyor? Bence asıl sebep kiraz toplama . Bir depoda kiraz toplama işlemi yaptığımızda, işlemlerin kısmi sıralaması değişiyor. Bazı komisyonların vektör saatleri yeni kısmi siparişi temsil etmek için yeniden atanmalıdır. Bununla birlikte, dağıtılmış sistemdeki bu yeniden atama, tutarsız vektör saatlerine neden olacaktır. Başa çıkan karma sorun budur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.