Câu trả lời ngắn (TL; DR)
"Tree-ish" là một thuật ngữ đề cập đến bất kỳ số nhận dạng nào (như được chỉ định trong tài liệu sửa đổi Git ) cuối cùng dẫn đến một cây thư mục (con) (Git đề cập đến các thư mục là "cây" và "đối tượng cây").
Trong trường hợp của người đăng ban đầu, foo
là một thư mục mà anh ta muốn chỉ định. Cách chính xác để chỉ định thư mục (con) trong Git là sử dụng cú pháp "tree-ish" (mục # 15 từ tài liệu sửa đổi Git ):
<rev>:<path>
, Ví dụ như HEAD:README
, :README
,master:./README
Một hậu tố được :
theo sau bởi một đường dẫn đặt tên cho đốm màu hoặc cây tại đường dẫn đã cho trong đối tượng tree-ish được đặt tên bởi phần trước dấu hai chấm.
Vì vậy, nói cách khác, master:foo
là cú pháp chính xác, không phải master/foo
.
"Tree-ish" khác (Plus Cam kết)
Dưới đây là danh sách đầy đủ các định danh cam kết và cây-ish (từ tài liệu sửa đổi Git , cảm ơn LopSae đã chỉ ra ):
----------------------------------------------------------------------
| 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
----------------------------------------------------------------------
Các mã định danh # 1-14 đều là "commit-ish", vì tất cả chúng đều dẫn đến các cam kết, nhưng vì các cam kết cũng trỏ đến cây thư mục, cuối cùng tất cả chúng đều dẫn đến các đối tượng cây thư mục (con) và do đó cũng có thể được sử dụng như "cây -nói ”.
# 15 cũng có thể được sử dụng dưới dạng tree-ish khi nó tham chiếu đến một thư mục (con), nhưng nó cũng có thể được sử dụng để xác định các tệp cụ thể. Khi nó đề cập đến các tệp, tôi không chắc liệu nó có còn được coi là "tree-ish" hay không, hay nó hoạt động giống "blob-ish" hơn (Git đề cập đến các tệp là "blobs").
Câu trả lời dài
Ở các cấp thấp nhất, Git theo dõi mã nguồn bằng bốn đối tượng cơ bản:
- Các thẻ được chú thích, trỏ đến các cam kết.
- Cam kết, trỏ đến cây thư mục gốc của dự án của bạn.
- Cây, là thư mục và thư mục con.
- Blobs, là các tập tin.
Mỗi đối tượng này đều có ID băm sha1 của riêng nó, vì Linus Torvalds đã thiết kế Git giống như một hệ thống tệp có địa chỉ nội dung , tức là các tệp có thể được truy xuất dựa trên nội dung của chúng (ID sha1 được tạo từ nội dung tệp). Sách Pro Git đưa ra sơ đồ ví dụ này :
Nhiều lệnh Git có thể chấp nhận các số nhận dạng đặc biệt cho các cam kết và cây thư mục (con):
"Commit-ish" là các định danh cuối cùng dẫn đến một đối tượng cam kết. Ví dụ,
tag -> commit
"Tree-ish" là các định danh cuối cùng dẫn đến các đối tượng cây (tức là thư mục).
tag -> commit -> project-root-directory
Bởi vì các đối tượng cam kết luôn trỏ đến một đối tượng cây thư mục (thư mục gốc của dự án của bạn), bất kỳ số nhận dạng nào là "commit-ish", theo định nghĩa, cũng là "tree-ish". Nói cách khác, bất kỳ mã định danh nào dẫn đến đối tượng cam kết cũng có thể được sử dụng để dẫn đến đối tượng cây thư mục (con) .
Nhưng vì các đối tượng cây thư mục không bao giờ trỏ đến các cam kết trong hệ thống lập phiên bản của Git, nên không phải mọi mã định danh trỏ đến một cây thư mục (con) cũng có thể được sử dụng để trỏ đến một cam kết. Nói cách khác, tập hợp các số nhận dạng "commit-ish" là một tập hợp con nghiêm ngặt của bộ số nhận dạng "tree-ish".
Như đã giải thích trong tài liệu ( cảm ơn Trebor đã giúp tôi tìm nó ):
<tree>
Cho biết tên đối tượng cây.
<commit>
Cho biết tên đối tượng cam kết.
<tree-ish>
Chỉ ra một cây, cam kết hoặc gắn thẻ tên đối tượng. Một lệnh nhận <tree-ish>
đối số cuối cùng muốn hoạt động trên một <tree>
đối tượng nhưng tự động bỏ tham chiếu <commit>
và <tag>
các đối tượng trỏ đến a <tree>
.
<commit-ish>
Cho biết tên đối tượng cam kết hoặc thẻ. Một lệnh có <commit-ish>
đối số cuối cùng muốn hoạt động trên một <commit>
đối tượng nhưng tự động bỏ tham chiếu đến <tag>
các đối tượng trỏ đến a <commit>
.
Bộ định danh cây-ish không thể được sử dụng làm cam kết là
<rev>:<path>
, dẫn trực tiếp đến cây thư mục, không phải đối tượng cam kết. Ví dụ HEAD:subdirectory
,.
Định danh Sha1 của các đối tượng cây thư mục .
master:foo
là tree-ish, nhưng tốt hơn bạn nên sử dụngmaster foo
như tôi<tree-ish> <path>
.