Kafa karıştırıcı bit burada:
Git bunları asla tek tek dosyalar olarak görmez. Git her şeyi tam içerik olarak düşünüyor.
Git genellikle kendi deposundaki nesnelerin yerine 160 bit karmaları kullanır. Bir dosya ağacı temel olarak her birinin içeriğiyle (ve bazı meta verilerle) ilişkili adların ve karmaların listesidir.
Ancak 160 bit karması içeriği benzersiz olarak tanımlar (git veritabanının evreninde). İçerik olarak karmaları olan bir ağaç, içeriğindeki içeriği içerir .
Bir dosyanın içeriğinin durumunu değiştirirseniz, karması değişir. Ancak karması değişirse, dosya adının içeriğiyle ilişkili karması da değişir. Bu da "dizin ağacının" karmasını değiştirir.
Git veritabanı bir dizin ağacını sakladığında, bu dizin ağacı tüm alt dizinlerin ve içindeki tüm dosyaların içeriğini ima eder ve içerir .
Lekelere veya diğer ağaçlara (değişmez, tekrar kullanılabilir) işaretçilerle bir ağaç yapısında düzenlenir, ancak mantıksal olarak tüm ağacın tüm içeriğinin tek bir anlık görüntüsüdür. Temsil git veritabanında düz veri içeriği değil, mantıksal olarak onun veri ve başka bir şey tümüdür.
Ağacı bir dosya sistemine serileştirdiyseniz, tüm .git klasörlerini sildiyseniz ve git'e ağacı tekrar veritabanına eklemesini söylediyseniz, sonunda veritabanına hiçbir şey eklemezsiniz - öğe zaten orada olurdu.
Git'in hash değerlerini değişmez verilere referans sayıcı bir işaretçi olarak düşünmek yardımcı olabilir.
Bunun üzerine bir uygulama oluşturduysanız, belge, katmanları olan, grupları olan ve nesneleri olan bir grup sayfadır.
Bir nesneyi değiştirmek istediğinizde, nesne için tamamen yeni bir grup oluşturmanız gerekir. Bir grubu değiştirmek istiyorsanız, yeni bir sayfa gerektiren ve yeni bir belge gerektiren yeni bir katman oluşturmanız gerekir.
Tek bir nesneyi her değiştirdiğinizde, yeni bir belge oluşturur. Eski belge var olmaya devam ediyor. Yeni ve eski belge içeriklerinin çoğunu paylaşır - aynı sayfalara sahiptirler (1 hariç). Bu sayfa aynı katmanlara sahip (1 hariç). Bu katman aynı gruplara sahiptir (1 hariç). Bu grup aynı nesnelere sahiptir (1 hariç).
Aynı şekilde, mantıksal olarak bir kopyasını kastediyorum, ama uygulama açısından aynı değişmez nesneye sadece referans olarak sayılan bir işaretçi.
Git deposu buna çok benzer.
Bu, belirli bir git değişiklik kümesinin işleme iletisini (karma kodu olarak) içerdiği, çalışma ağacını içerdiği ve üst değişikliklerini içerdiği anlamına gelir.
Bu üst düzey değişiklikler, üst düzey değişikliklerini içerir.
Git repo'sunun tarih içeren kısmı değişiklik zinciri. Bu değişiklik dizini "dizin" ağacının üzerindeki bir seviyede değiştirir - "dizin" ağacından, bir değişiklik kümesine ve değişiklik zincirine benzersiz şekilde erişemezsiniz.
Bir dosyaya ne olduğunu öğrenmek için, bir değişiklik kümesinde bu dosyayla başlarsınız. Bu değişiklik kümesinin bir geçmişi var. Genellikle bu tarihte, bazen aynı içeriğe sahip aynı adlı dosya bulunur. İçerik aynıysa, dosyada değişiklik yapılmamıştır. Farklıysa, bir değişiklik var ve tam olarak ne olduğunu çözmek için iş yapılması gerekiyor.
Bazen dosya gitti; ancak, "dizin" ağacının aynı içeriğe (aynı karma koduna) sahip başka bir dosyası olabilir, bu yüzden bu şekilde izleyebiliriz (not; bu nedenle bir dosyayı bir kesinleştirme işleminden ayrı olarak taşıma taahhüdü istiyorsunuz -Düzenle). Ya da aynı dosya adı ve dosyayı kontrol ettikten sonra yeterince benzer.
Yani git birlikte bir "dosya geçmişi" patchwork olabilir.
Ancak bu dosya geçmişi, dosyanın bir sürümünden diğerine olan bir bağlantıdan değil, "tüm değişiklik kümesinin" etkin bir şekilde ayrıştırılmasıyla gelir.