Git'teki "Tamamlama karması", "Üst Karması" ve "Ağaç karması" arasındaki fark nedir?


12

Bugün bu dokümanı çevrimiçi okuyarak bazı temel git bilgilerini öğreniyorum:

http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi

Ve bu bölümde, git log --pretty=format:" "günlük bilgilerini kendi zevkimle göstermek için kullanmayı öğrenmeye başladım.

Ancak bazı nasıl, ben formatı tablo iki benzer seçenekler gördüğümüz %Hiçin Commit Hash, %Piçin Parent Hashve %Tiçin Tree Hash.

Onları komut satırımda denedim, hepsi aynı uzunlukta farklı değerlere sahip hash değerleri olduğu ortaya çıktı.

Ben googled ve stackoverflowed, şimdiye kadar belirgin bir ipucu yok.

Bunun hakkında bir fikrim var Hash value, bu git kesinliğinin bir sağlama toplamı.

Ama ne yapar Parent Hashve ne yapar Tree hash?

  • PS: Ah, şimdi bazı fikirlerim var Parent Hash, bir dalın doğrudan kaynağının hash değeri demek mi?

Yanıtlar:


7

Ebeveyn karmaları:

$ git log --graph
*   commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\  Merge: 79e6924 3113760
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:02:09 2016 +0800
| |
| |     commit5
| |
| |     Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:01:26 2016 +0800
| |
| |     commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/  Author: linjie <linjielig@gmail.com>
|   Date:   Mon Mar 14 16:01:59 2016 +0800
|
|       commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <linjielig@gmail.com>
| Date:   Mon Mar 14 16:01:00 2016 +0800
|
|     commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
  Author: linjie <linjielig@gmail.com>
  Date:   Mon Mar 14 16:00:34 2016 +0800

     commit1

$ git log --pretty=format:'%<(82)%P %s'
79e69240ccd218d49d78a72f33002fd6bc62f407 31137606f85d8960fa1640d0881682a081ffa9d0  commit5
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit4
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit3
316dd3fb3c7b501bc9974676adcf558a18508dd4                                           commit2
                                                                                   commit1

Görebilirsiniz commit4 ve commit3 üstüdür commit5 , commit2 üstüdür commit3 ve commit4 , commit1 üstüdür commit2 .

Ağaç karması:

$ git log --pretty=format:'%T %s'
f3c7cee96f33938631a9b023ccf5d8743b00db0e commit5
e0ecb42ae45ddc91c947289f928ea5085c70b208 commit4
d466aea17dc07516c449c58a73b2dc3faa9d11a1 commit3
b39f2e707050e0c5bbb3b48680f416ef05b179ba commit2
5706ec2b32605e27fa04cbef37d582325d14dda9 commit1

$ git cat-file -p f3c7ce
100644 blob 8bb2e871e94c486a867f5cfcbc6f30d004f6a9e5    dev
100644 blob 47f16c8e00adba77ec5c176876e99c8e9f05d69b    master

$ git cat-file -p 5706ec
100644 blob fc0bfde0d44bb4d6c7d27b6e587ebedd34ba5911    master

Komutun işlevi: Türüne <object>göre içeriğini güzel yazdırın .

git cat-file -p 

Git'te, tüm içerik ağaç ve blob nesneleri olarak depolanır; ağaçlar UNIX dizin girişlerine karşılık gelir ve bloblar az çok inode veya dosya içeriğine karşılık gelir. Tek bir ağaç nesnesi, her biri ilişkili mod, tür ve dosya adıyla bir bloba veya alt ağaca SHA-1 işaretçisi içeren bir veya daha fazla ağaç girişi içerir. Git normal olarak hazırlama alanınızın veya dizininizin durumunu alıp ondan bir dizi ağaç nesnesi yazarak bir ağaç oluşturur. Taahhüt nesneleri, ağaç nesnesini kimin kaydettiği, ne zaman kaydettikleri veya neden kaydedildikleri hakkında bilgi içerir. Bu, taahhüt nesnesinin sizin için sakladığı temel bilgidir.

Sonuç:

Tamamlama karması, Ebeveyn karması, Ağaç karması SHA-1'dir. Yürütme karması ve Ebeveyn karması, Ebeveyn karmasının çocuğu dışında aynıdır. Ağaç karması, bir Ağaç nesnesini temsil eder. İşleme karması ve Ebeveyn karması bir taahhüt nesnesini temsil eder.

Referans:

  1. Git Internals - Git Nesneleri

  2. git-cat-file - Havuz nesneleri için içerik veya tür ve boyut bilgileri sağlar


4

Bir ağaç tarihinin herhangi bir noktaya bağlı olmayan dosyaları ve dizinleri, hiyerarşik bir koleksiyon. Örneğin, bir dosya oluşturup daha sonra dosyayı silerseniz (başka herhangi bir işlem olmadan), başladığınız ağaçla sonuçlanırsınız.

Bir taahhüt projenizin tarihinde bir noktadır. Bir komut bir ağacı belirtir, fakat aynı zamanda yazar / taşıt ve zaman, bir taahhüt mesajı (yazarın neyin değiştiğini açıkladığı) ve en önemlisi de havuzun önceki durumu olan sıfır veya daha fazla ebeveyn gibi diğer bilgileri içerir. (İlk taahhüdünüzün sıfır ebeveyni vardır. Bundan sonra çoğunun doğrusal gelişim sırasında bir ebeveyni ve birleştirirseniz birden fazla ebeveyni vardır.)

Bunun git cat-file -ptürden bağımsız olarak belirli bir karmanın içeriğini yazdıran komutla bunun nasıl çalıştığını anlayabilirsiniz . Örneğin, HEAD taahhüdüne bakmak için şunları çalıştırabilirsiniz:

$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700
committer Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700

Merge pull request #951 from github/global-args

Avoid depending on a hardcoded list of git global flags

Bu taahhüdün içindeki ağacı görmek için ağaç olabilir cat-file -p:

$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5        .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03        .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278        CONTRIBUTING.md
...

Benzer şekilde, ebeveynlere bakarsanız, bunların da taahhütler olduğunu göreceksiniz. Bir iç ağaç için bir steno gibi işlemek revDİR rev^{tree}. Yani bir önceki komut yazılmış olabilirdi git cat-file -p HEAD^{tree}. Bunun rev^ebeveyni anlamına gelir rev. Birden anne olduğunda, rev^1, rev^2vb daha fazla bilgi mevcuttur git rev-ayrıştırma adam sayfası .


2

"Taahhüt Karması" mevcut işin karmasıdır. Girdinin ilişkili olduğu taahhüt.

"Ebeveyn Karması", taahhüdün geldiği tüm ana dal (lar) ın karmasıdır.

"Tree hash", yürütmedeki geçerli dizinin karmasıdır. Karma, üst dizinden görüldüğü takdirde dizinin sahip olduğu karma değerine eşittir git ls-files --stage --abbrev.

Referans:


1
commit has3. paragrafınızın başlangıcında ne anlama geliyor?
Zen
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.