คำตอบสั้น ๆ (TL; DR)
"Tree-ish" เป็นคำที่อ้างถึงตัวระบุใด ๆ (ตามที่ระบุไว้ในเอกสารประกอบการแก้ไข Git ) ที่นำไปสู่แผนผังไดเร็กทอรี (ย่อย) ในที่สุด (Git หมายถึงไดเร็กทอรีเป็น "ทรี" และ "ทรีออบเจ็กต์")
ในกรณีของโปสเตอร์ต้นฉบับfoo
คือไดเร็กทอรีที่เขาต้องการระบุ วิธีที่ถูกต้องในการระบุไดเร็กทอรี (ย่อย) ใน Git คือการใช้ไวยากรณ์ "tree-ish" (รายการ # 15 จากเอกสารการแก้ไข Git ):
<rev>:<path>
เช่นHEAD:README
, :README
,master:./README
คำต่อท้าย:
ตามด้วยพา ธ ตั้งชื่อหยดหรือทรีตามเส้นทางที่กำหนดในอ็อบเจ็กต์ tree-ish ที่ตั้งชื่อโดยส่วนก่อนโคลอน
ดังนั้นในคำอื่น ๆ ที่เป็นไวยากรณ์ที่ถูกต้องไม่ได้master:foo
master/foo
"Tree-ish" อื่น ๆ (Plus Commit-ish)
นี่คือรายการที่สมบูรณ์ของตัวระบุกระทำ-ish และต้นไม้ ish (จากเอกสารการแก้ไข Git , ขอบคุณที่ LopSae สำหรับการชี้ออก ):
----------------------------------------------------------------------
| 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, :README, master:./README
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
ตัวระบุ # 1-14 ล้วนเป็น "คอมมิต - ish" เนื่องจากทั้งหมดนำไปสู่คอมมิต แต่เนื่องจากคอมมิตชี้ไปที่แผนผังไดเร็กทอรีด้วยในที่สุดจึงนำไปสู่ (ย่อย) ออบเจ็กต์แผนผังไดเร็กทอรีดังนั้นจึงสามารถใช้เป็น "tree -ish"
# 15 ยังสามารถใช้เป็น tree-ish เมื่ออ้างถึงไดเร็กทอรี (ย่อย) แต่ยังสามารถใช้เพื่อระบุไฟล์เฉพาะได้ เมื่อกล่าวถึงไฟล์ฉันไม่แน่ใจว่ายังถือว่าเป็น "tree-ish" อยู่หรือไม่หรือทำหน้าที่เหมือน "blob-ish" มากกว่า (Git หมายถึงไฟล์เป็น "blobs")
คำตอบยาว
ในระดับต่ำสุด Git จะติดตามซอร์สโค้ดโดยใช้อ็อบเจ็กต์พื้นฐานสี่อย่าง:
- แท็กที่มีคำอธิบายประกอบซึ่งชี้ไปที่คอมมิต
- คอมมิตซึ่งชี้ไปที่แผนผังไดเร็กทอรีรูทของโปรเจ็กต์ของคุณ
- ต้นไม้ซึ่งเป็นไดเร็กทอรีและไดเร็กทอรีย่อย
- Blobs ซึ่งเป็นไฟล์
แต่ละออบเจ็กต์เหล่านี้มี ID แฮช sha1 ของตัวเองเนื่องจาก Linus Torvalds ออกแบบ Git ให้เหมือนกับระบบไฟล์ที่ระบุแอดเดรสได้กล่าวคือไฟล์สามารถเรียกดูได้ตามเนื้อหา (sha1 IDs สร้างขึ้นจากเนื้อหาไฟล์) หนังสือ Pro Git แสดงแผนภาพตัวอย่างนี้ :
คำสั่ง Git จำนวนมากสามารถยอมรับตัวระบุพิเศษสำหรับคอมมิตและโครงสร้างไดเร็กทอรี (ย่อย):
"Commit-ish" คือตัวระบุที่นำไปสู่อ็อบเจ็กต์คอมมิตในที่สุด ตัวอย่างเช่น,
tag -> commit
"Tree-ish" คือตัวระบุที่นำไปสู่อ็อบเจ็กต์ tree (เช่นไดเร็กทอรี) ในที่สุด
tag -> commit -> project-root-directory
เนื่องจากอ็อบเจ็กต์คอมมิตชี้ไปที่อ็อบเจ็กต์ไดเร็กทอรีทรีเสมอ (ไดเร็กทอรีรูทของโปรเจ็กต์ของคุณ) ตัวระบุใด ๆ ที่เป็น "คอมมิต - ish" ตามนิยามและ "tree-ish" ด้วย ในคำอื่น ๆระบุใด ๆ ที่นำไปสู่การกระทำวัตถุนอกจากนี้ยังสามารถนำมาใช้เพื่อนำไปสู่การ (ย่อย) วัตถุต้นไม้ไดเรกทอรี
แต่เนื่องจากออบเจ็กต์แผนผังไดเร็กทอรีไม่เคยชี้ไปที่คอมมิตในระบบการกำหนดเวอร์ชันของ Git จึงไม่สามารถใช้ตัวระบุทุกตัวที่ชี้ไปที่โครงสร้างไดเร็กทอรี (ย่อย) เพื่อชี้ไปที่คอมมิตได้ กล่าวอีกนัยหนึ่งชุดของตัวระบุ "คอมมิต" คือชุดย่อยที่เข้มงวดของชุดตัวระบุ "tree-ish"
ตามที่อธิบายไว้ในเอกสาร ( ขอบคุณ Trebor ที่ช่วยฉันค้นหา ):
<tree>
ระบุชื่อวัตถุต้นไม้
<commit>
ระบุชื่ออ็อบเจ็กต์คอมมิต
<tree-ish>
ระบุต้นไม้คอมมิตหรือแท็กชื่ออ็อบเจ็กต์ คำสั่งที่รับ<tree-ish>
อาร์กิวเมนต์ในที่สุดต้องการดำเนินการกับ<tree>
อ็อบเจ็กต์ แต่ dereferences โดยอัตโนมัติ<commit>
และ<tag>
อ็อบเจ็กต์ที่ชี้ไปที่ a <tree>
.
<commit-ish>
ระบุชื่ออ็อบเจ็กต์คอมมิตหรือแท็ก คำสั่งที่ใช้<commit-ish>
อาร์กิวเมนต์ในท้ายที่สุดต้องการที่จะทำงานบน<commit>
วัตถุโดยอัตโนมัติ แต่ dereferences วัตถุจุดที่ว่า<tag>
<commit>
ชุดของตัวระบุ tree-ish ที่ไม่สามารถใช้เป็น comm-ishได้
<rev>:<path>
ซึ่งนำไปสู่ไดเร็กทอรีทรีโดยตรงไม่คอมมิตอ็อบเจ็กต์ ตัวอย่างเช่นHEAD:subdirectory
.
ตัวระบุ Sha1 ของวัตถุแผนผังไดเรกทอรี
master:foo
เป็นต้นไม้-ish แต่คุณใช้ดีกว่าที่ฉันmaster foo
<tree-ish> <path>