Git에서 commit-ish와 tree-ish는 무엇입니까?
질문
Git에서 commit-ish 및 tree-ish의 구체적인 예는 무엇입니까?
스택 오버플로 질문 "git에서 tree-ish는 무엇을 의미합니까?" 나무 흉내를 다루고 특히,하지만 난에 대해 자세히 이해하려면 모두를 .
배경
문서에서의 사용
Git 문서 는 "commit-ish"및 "tree-ish"에 대한 여러 참조를 작성 합니다. 예를 들어 Git 소스 코드를 검토 하는 경우 :
$ 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
과
$ 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
정의
Git 문서 는 "commit-ish"및 "tree-ish"가 무엇인지 정의합니다 .
<tree>트리 개체 이름을 나타냅니다.
<commit>커밋 개체 이름을 나타냅니다.
<tree-ish>Indicates a tree, commit or tag object name. A command that takes a
<tree-ish>argument ultimately wants to operate on a<tree>object but automatically dereferences<commit>and<tag>objects that point at a<tree>.<commit-ish>Indicates a commit or tag object name. A command that takes a
<commit-ish>argument ultimately wants to operate on a<commit>object but automatically dereferences<tag>objects that point at a<commit>.
The Documentation isn't Clear Enough
Even though the documentation above defines what "commit-ish" and "tree-ish" are, I still find it to be too vague and unclear.
What are specific examples of "commit-ish" and "tree-ish", and how are they different from each other?
The Short Answer (TL;DR)
Here's a complete list of commit-ish and tree-ish identifiers (from the Git revisions documentation):
----------------------------------------------------------------------
| 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
----------------------------------------------------------------------
Identifiers #1-14 are all "commit-ish", because they all lead to commits, but because commits also point to directory trees, they all ultimately lead to (sub)directory tree objects, and can therefore also be used as "tree-ish".
#15 can also be used as tree-ish when it refers to a (sub)directory, but it can also be used to identify specific files. When it refers to files, I'm not sure if it's still considered "tree-ish", or if acts more like "blob-ish" (Git refers to files as "blobs").
The Long Answer
Commits and Directory Trees in Git
At its lowest levels, Git keeps track of source code using four fundamental objects:
- Annotated tags, which point to commits.
- Commits, which point to the root directory tree of your project.
- Trees, which are directories and subdirectories.
- Blobs, which are files.
Each of these objects has its own sha1 hash ID, since Linus Torvalds designed Git like an content- addressable filesystem, i.e. files can be retrieved based on their content (sha1 IDs are generated from file content). The Pro Git book gives this example diagram:

Commit-ish vs Tree-ish
Many Git commands can accept special identifiers for commits and (sub)directory trees:
"Commit-ish" are identifiers that ultimately lead to a commit object. For example,
tag -> commit"Tree-ish" are identifiers that ultimately lead to tree (i.e. directory) objects.
tag -> commit -> project-root-directory
Because commit objects always point to a directory tree object (the root directory of your project), any identifier that is "commit-ish" is, by definition, also "tree-ish". In other words, any identifier that leads to a commit object can also be used to lead to a (sub)directory tree object.
But since directory tree objects never point to commits in Git's versioning system, not every identifier that points to a (sub)directory tree can also be used to point to a commit. In other words, the set of "commit-ish" identifiers is a strict subset of the set of "tree-ish" identifiers.
The set of tree-ish identifiers that cannot be used as commit-ish are
<rev>:<path>, which leads directly to directory trees, not commit objects. For example,HEAD:subdirectory.Sha1 identifiers of directory tree objects.
Note for non-native English [sic!] speakers: "-ish" is a suffix that can be applied to an adjective in order to indicate "having qualities like" or "slightly" - see http://chambers.co.uk/search/?query=ish&title=21st
Hence "tree-ish" - like a "tree" .... "commit-ish" - like a "commit"
eg "Mars appears like a reddish star" ("d" is doubled !); "the food on the plate was not hot, but warmish"
I believe that this helps explain "what are ..." better, in that it explains the language usage.
참고URL : https://stackoverflow.com/questions/23303549/what-are-commit-ish-and-tree-ish-in-git
'IT박스' 카테고리의 다른 글
| image.onload 이벤트 및 브라우저 캐시 (0) | 2020.08.22 |
|---|---|
| Android 작업 선호도 설명 (0) | 2020.08.22 |
| new와 without를 사용하여 객체를 인스턴스화하는 것의 차이점은 무엇입니까? (0) | 2020.08.22 |
| CI 서버의 .NET 4.0 빌드 문제 (0) | 2020.08.22 |
| ggplot2에서 기본 글꼴 크기를 변경하는 방법 (0) | 2020.08.22 |