Sadece cevabı genişletiyorum @Leif Gruenwoldtve tarafından sağlanan referansta ne olduğunu detaylandırıyorum@Leif Gruenwoldt
Kendin Yap..
- Adım 1. Deponuzda boş bir metin belgesi (adın önemi yoktur) oluşturun
- Adım 2. Belgeyi Hazırlayın ve Teslim Edin
- 3. Adım. Blob'un karmasını çalıştırarak tanımlayın
git ls-tree HEAD
- Adım 4. Blob'un hash değerini bulun
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Adım 5. Sürprizinizden kurtulun ve aşağıyı okuyun
GIT, commit karmalarını nasıl hesaplar?
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
Metin blob⎵sabit bir önek ve \0aynı zamanda sabit ve NULLkarakterdir. <size_of_file>ve<contents_of_file> dosya bağlı olarak değişir.
Bakınız: Git commit nesnesinin dosya formatı nedir?
Ve hepsi bu kadar!
Fakat bekle! , <filename>hash hesaplaması için kullanılan bir parametre olmadığını fark ettiniz mi? İçerikleri oluşturuldukları tarih ve saat ile adlarından aynı kayıtsızsa, iki dosya potansiyel olarak aynı hash'e sahip olabilir. Bu, Git'in hareketleri işlemesinin ve diğer sürüm kontrol sistemlerinden daha iyi yeniden adlandırmasının nedenlerinden biridir.
Kendin Yap (Dahili)
- Adım 6. Farklı bir dosya ile başka bir boş dosya oluşturun.
filename Aynı dizinde olan
- Adım 7. Her iki dosyanın karmalarını karşılaştırın.
Not:
Bağlantı, treenesnenin nasıl karma hale getirildiğinden bahsetmez . Algoritma ve parametrelerden emin değilim, ancak gözlemime göre muhtemelen içerdiği tüm blobsve trees(muhtemelen hash'lerine) dayalı bir hash hesaplıyor