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>

트리, 커밋 또는 태그 개체 이름을 나타냅니다. 소요 명령 <tree-ish>
인수는 궁극적으로 작동하도록하려는 <tree>목적되지만 자동으로 역 참조 <commit><tag>에서 그 점을 객체 <tree>.

<commit-ish>

커밋 또는 태그 개체 이름을 나타냅니다. <commit-ish>
인수를받는 명령은 궁극적으로 <commit>객체 에서 작동하기를 원 하지만를 가리키는 <tag>객체를 자동으로 역 참조 합니다 <commit>.

문서가 충분히 명확하지 않습니다.

위의 문서에서 “커밋”과 “트리”가 무엇인지 정의하고 있지만 여전히 너무 모호하고 불분명합니다.

“commit-ish”와 “tree-ish”의 구체적인 예는 무엇이며 서로 어떻게 다른가요?



답변

짧은 답변 (TL; DR)

다음은 commit-ish 및 tree-ish 식별자의 전체 목록입니다 ( Git 개정 문서 ).

----------------------------------------------------------------------
|    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는 모두 “커밋 방식”입니다. 모두 커밋으로 이어지지 만 커밋도 디렉토리 트리를 가리 키기 때문에 모두 궁극적으로 (하위) 디렉터리 트리 개체로 이어 지므로 “트리로도 사용할 수 있습니다.” -ish “.

# 15는 (하위) 디렉토리를 참조 할 때 tree-ish로 사용할 수도 있지만 특정 파일을 식별하는데도 사용할 수 있습니다. 파일을 참조 할 때 여전히 “트리 다운”으로 간주되는지 또는 “blob-ish”와 비슷하게 작동하는지 확실하지 않습니다 (Git는 파일을 “blobs”라고 함).

긴 답변

Git의 커밋 및 디렉터리 트리

가장 낮은 수준에서 Git은 네 가지 기본 개체를 사용하여 소스 코드를 추적합니다.

  1. 커밋을 가리키는 주석이 달린 태그.
  2. 프로젝트의 루트 디렉토리 트리를 가리키는 커밋.
  3. 디렉터리 및 하위 디렉터리 인 트리.
  4. 파일 인 Blob.

Linus Torvalds가 콘텐츠 주소 지정이 가능한 파일 시스템 처럼 Git을 설계했기 때문에 이러한 각 개체에는 자체 sha1 해시 ID 가 있습니다. 즉, 콘텐츠를 기반으로 파일을 검색 할 수 있습니다 (sha1 ID는 파일 콘텐츠에서 생성됨). Pro Git 책은 다음 예제 다이어그램을 제공 합니다 .

Commit-ish vs Tree-ish

많은 Git 명령은 커밋 및 (하위) 디렉터리 트리에 대한 특수 식별자를 허용 할 수 있습니다.

  • “Commit-ish”는 궁극적으로 커밋 객체로 연결되는 식별자입니다. 예를 들면

    tag -> commit

  • “Tree-ish”는 궁극적으로 트리 (즉, 디렉토리) 객체로 이어지는 식별자입니다.

    tag -> commit -> project-root-directory

커밋 객체는 항상 디렉토리 트리 객체 (프로젝트의 루트 디렉토리)를 가리 키기 때문에 “commit-ish”식별자는 정의상 “tree-ish”이기도합니다. 즉, 커밋 객체로 연결되는 모든 식별자는 (하위) 디렉토리 트리 객체로 연결되는데도 사용될 수 있습니다 .

그러나 디렉토리 트리 객체는 Git의 버전 관리 시스템에서 커밋을 가리 키지 않기 때문에 (하위) 디렉토리 트리를 가리키는 모든 식별자를 커밋을 가리키는 데 사용할 수는 없습니다. 다시 말해, “커밋 방식”식별자 집합은 “트리 방식”식별자 집합의 엄격한 하위 집합입니다.

커밋 방식으로 사용할 수없는 트리 방식 식별자 집합은 다음과 같습니다.

  1. <rev>:<path>, 이는 커밋 객체가 아닌 디렉토리 트리 로 직접 연결 됩니다 . 예 : HEAD:subdirectory.

  2. 디렉터리 트리 개체 의 Sha1 식별자 .


답변

비 원어민 영어 [sic!] 사용자를위한 참고 사항 : “-ish”는 “다음과 같은 자질이 있음”또는 “약간”을 나타 내기 위해 형용사에 적용 할 수있는 접미사입니다 . http://chambers.co.uk 참조 / search /? query = ish & title = 21st

따라서 “나무처럼”- “나무”처럼 …. “커밋처럼”- “커밋”처럼

예 : “화성은 붉은 별처럼 보입니다”( “d”는 두 배입니다!); “접시에있는 음식은 뜨겁지 않고 따뜻했다”

나는 이것이 언어 사용법을 설명한다는 점에서 “무엇이 …”인지 더 잘 설명하는 데 도움이된다고 생각합니다.