Git'te commit-ish ve tree-ish nedir?


117

Soru

Git'te commit-ish ve tree-ish'in belirli örnekleri nelerdir?

Yığın Taşması sorusu "Git'te ağaç-benzeri ne anlama geliyor?" özellikle ağaç-benzeri ile ilgilenir, ancak her ikisi hakkında daha fazla bilgi edinmek istiyorum .

Arka fon

Dokümantasyondaki Kullanımlar

Git dokümantasyonu "commit-ish" ve "tree-ish" için birkaç referans yapar. Örneğin , Git kaynak kodunu inceliyorsanız :

$ git grep --files-with-matches --extended-regexp "commit(-)*ish"
config.txt
git-describe.txt
git-fast-import.txt
git-name-rev.txt
git-push.txt
git-rebase.txt
git-rev-parse.txt
git.txt
gitcli.txt
glossary-content.txt
howto/revert-branch-rebase.txt
revisions.txt

ve

$ git grep --files-with-matches --extended-regexp "tree(-)*ish" | \
$ grep --invert-match RelNotes
diff-format.txt
diff-generate-patch.txt
git-archive.txt
git-cat-file.txt
git-checkout.txt
git-diff-index.txt
git-diff-tree.txt
git-ls-files.txt
git-ls-tree.txt
git-merge-tree.txt
git-read-tree.txt
git-reset.txt
git-svn.txt
git.txt
gitcli.txt
gittutorial-2.txt
glossary-content.txt
revisions.txt

Tanımlar

Git dokümantasyonu "commit-ish" ve "tree-ish" ne olduğunu tanımlar :

<tree>

Bir ağaç nesnesi adını belirtir.

<commit>

Kaydetme nesnesi adını gösterir.

<tree-ish>

Bir ağaç, kaydetme veya etiket nesnesi adını belirtir. Bir <tree-ish> argümanı alan bir komut, nihayetinde bir <tree>nesne üzerinde işlem yapmak ister, ancak otomatik olarak referansları kaldırır <commit>ve <tag>a işaretini gösteren nesneler <tree>.

<commit-ish>

Bir kaydetme veya etiket nesnesi adını belirtir. Bir <commit-ish> argümanı alan bir komut, nihayetinde bir <commit>nesne üzerinde işlem yapmak ister, ancak <tag>bir <commit>.

Belgeler Yeterince Açık Değil

Yukarıdaki dokümantasyon "commit-ish" ve "tree-ish" ne olduğunu tanımlasa da, hala çok belirsiz ve belirsiz buluyorum.

Belirli "commit-ish" ve "tree-ish" örnekleri nelerdir ve birbirlerinden nasıl farklıdırlar?

Yanıtlar:


156

Kısa Cevap (TL; DR)

İşte commit-ish ve tree-ish tanımlayıcılarının tam listesi ( Git revizyon belgelerinden ):

----------------------------------------------------------------------
|    Commit-ish/Tree-ish    |                Examples
----------------------------------------------------------------------
|  1. <sha1>                | dae86e1950b1277e545cee180551750029cfe735
|  2. <describeOutput>      | v1.7.4.2-679-g3bee7fb
|  3. <refname>             | master, heads/master, refs/heads/master
|  4. <refname>@{<date>}    | master@{yesterday}, HEAD@{5 minutes ago}
|  5. <refname>@{<n>}       | master@{1}
|  6. @{<n>}                | @{1}
|  7. @{-<n>}               | @{-1}
|  8. <refname>@{upstream}  | master@{upstream}, @{u}
|  9. <rev>^                | HEAD^, v1.5.1^0
| 10. <rev>~<n>             | master~3
| 11. <rev>^{<type>}        | v0.99.8^{commit}
| 12. <rev>^{}              | v0.99.8^{}
| 13. <rev>^{/<text>}       | HEAD^{/fix nasty bug}
| 14. :/<text>              | :/fix nasty bug
----------------------------------------------------------------------
|       Tree-ish only       |                Examples
----------------------------------------------------------------------
| 15. <rev>:<path>          | HEAD:README.txt, master:sub-directory/
----------------------------------------------------------------------
|         Tree-ish?         |                Examples
----------------------------------------------------------------------
| 16. :<n>:<path>           | :0:README, :README
----------------------------------------------------------------------

1-14 no'lu tanımlayıcıların tümü "commit-ish" dir, çünkü hepsi kaydetmeye yol açar, ancak işlemeler aynı zamanda dizin ağaçlarını da gösterdiği için, sonuçta (alt) dizin ağacı nesnelerine yol açar ve bu nedenle "ağaç" olarak da kullanılabilir -imtrak".

# 15, bir (alt) dizine atıfta bulunduğunda ağaç benzeri olarak da kullanılabilir, ancak belirli dosyaları tanımlamak için de kullanılabilir. Dosyalara atıfta bulunduğunda, hala "ağaç benzeri" olarak kabul edilip edilmediğinden veya daha çok "blob-ish" gibi davranıp çalışmadığından emin değilim (Git, dosyalara "blob" olarak atıfta bulunur).

Uzun Cevap

Git'te İşlemler ve Dizin Ağaçları

En düşük seviyelerinde Git, dört temel nesne kullanarak kaynak kodunu izler:

  1. Kaydetmeleri işaret eden açıklamalı etiketler.
  2. Projenizin kök dizin ağacına işaret eden Commits.
  3. Dizinler ve alt dizinler olan ağaçlar.
  4. Dosya olan bloblar.

Linus Torvalds Git'i içerik adreslenebilir bir dosya sistemi gibi tasarladığından, bu nesnelerin her birinin kendi sha1 hash ID'si vardır, yani dosyalar içeriklerine göre alınabilir (sha1 ID'leri dosya içeriğinden üretilir). Pro Git kitabı şu örnek diyagramı verir :

Pro Git kitabından Şekil 9-3

Commit-ish vs Tree-ish

Birçok Git komutu, işlemeler ve (alt) dizin ağaçları için özel tanımlayıcıları kabul edebilir:

  • "Commit-ish", sonuçta bir commit nesnesine götüren tanımlayıcılardır. Örneğin,

    tag -> commit

  • "Ağaç benzeri", nihayetinde ağaç (yani dizin) nesnelerine götüren tanımlayıcılardır.

    tag -> commit -> project-root-directory

Commit nesneleri her zaman bir dizin ağacı nesnesine (projenizin kök dizini) işaret ettiğinden, "commit-ish" olan herhangi bir tanımlayıcı, tanımı gereği, "tree-ish" dir. Başka bir deyişle, bir commit nesnesine götüren herhangi bir tanımlayıcı, bir (alt) dizin ağaç nesnesine yönlendirmek için de kullanılabilir .

Ancak, dizin ağacı nesneleri hiçbir zaman Git'in sürüm oluşturma sistemindeki işlemlere işaret etmediğinden, bir (alt) dizin ağacına işaret eden her tanımlayıcı, bir yürütmeyi işaret etmek için de kullanılamaz. Başka bir deyişle, "kesinleştirme" tanımlayıcıları kümesi, "ağaç benzeri " tanımlayıcılar kümesinin katı bir alt kümesidir.

Commit-ish olarak kullanılamayan ağaç benzeri tanımlayıcılar :

  1. <rev>:<path>, doğrudan dizin ağaçlarına götürür , nesneleri işlemeye değil. Örneğin HEAD:subdirectory,.

  2. Dizin ağacı nesnelerinin Sha1 tanımlayıcıları .


3
Unutma stash@{0}. Tüm bunların neresinde olduğunu bilmek istiyorum. Stash ( my-thing@{0}) gibi başka şeyler var mı? Zula sadece bir <refname>mi?
Nate

Ağaç benzeri bir tanımlayıcının commit-ish tanımlayıcıdan daha spesifik bir tanımlayıcı gibi göründüğü açık bir şekilde açıklanmadı . Belki tuhafım ama bunu açıklamanın tek mantıklı yolu bu IMO
Steven Lu

29

Ana dili İngilizce olmayan [sic!] Konuşanlar için not: "-ish", "gibi niteliklere sahip" veya "biraz" olduğunu belirtmek için bir sıfata uygulanabilecek bir sonektir - bkz. Http://chambers.co.uk / arama /? query = imsi & title = 21

Dolayısıyla "ağaç gibi" - bir "ağaç" gibi .... "kesinleştirme" - "commit" gibi

örneğin, "Mars kırmızımsı bir yıldız gibi görünür" ("d" ikiye katlanır!); "tabaktaki yemek sıcak değil, sıcaktı"

Bunun, dil kullanımını daha iyi açıklamaya yardımcı olduğuna inanıyorum.


Her zaman "ağaç benzeri" ve "taahhütlü" kelimelerini "İsveççe" veya "İngilizce" demeye benzer şekilde yorumladım. Tanımladığınız kullanım bana daha az mantıklı geliyor çünkü bu "ish" biçimi bir sıfat yaratıyor. Ancak devir bir ağaç veya işlem "gibi" değildir , bir ağaç veya işlemdir. Öte yandan, "ish" i bir dil eki olarak düşünürseniz, komut satırında isimler olarak daha anlamlı olurlar, burada "ağaç-benzeri" ismi oluşturan dildir. Yazarların niyeti hangi yorumdu bilmiyorum ama ben bunu hep böyle görüyorum.
jmt

Demek istediğini anlıyorum, ama ben sadece anadili İngilizce olan biri olarak sahip olduğum izlenimi veriyordum!
MikeW
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.