Git에서 commit-ish와 tree-ish는 무엇입니까?


117

질문

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"의 구체적인 예는 무엇이며 서로 어떻게 다른가요?

답변:


156

짧은 답변 (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 책은 다음 예제 다이어그램을 제공 합니다 .

Pro Git 책의 그림 9-3

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 식별자 .


3
잊지 마세요 stash@{0}. 이 모든 것이 어디에 적합한 지 알고 싶습니다. 숨김 ( my-thing@{0}) 과 같은 다른 것이 있습니까? 은신처는 그냥 <refname>?
Nate

tree-ish 식별자 가 commit-ish 식별자보다 더 구체적인 식별자 인 것 같다는 것은 명확하게 밝혀지지 않았습니다 . 어쩌면 내가 이상한거야하지만 IMO 그것을 설명 할 수있는 유일한 합리적인 방법
스티븐 루

29

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

따라서 "나무처럼"- "나무"처럼 .... "커밋처럼"- "커밋"처럼

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

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


나는 항상 "트리 다운"과 "커밋 다운"을 "스웨덴어"또는 "영어"를 말하는 것과 유사하게 해석했습니다. "ish"의 형태는 형용사를 생성하기 때문에 당신이 설명하는 용법은 저에게 덜 의미가 있습니다. 그러나 rev는 트리 나 커밋과 "같은" 것이 아니라 트리 또는 커밋입니다. 반면에 "ish"를 언어 접미사로 생각하면 명령 줄에서 명사로 더 의미가 있습니다. 여기서 "tree-ish"는 명사를 구성하는 언어입니다. 저자의 의도가 어떤 해석인지는 모르겠지만 항상 그렇게 보았습니다.
jmt

나는 당신의 요점을 알지만, 나는 단지 영어 원어민으로서 내가 가진 인상을주고 있었다!
MikeW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.