git에서 "커밋 해시", "부모 해시" 및 "트리 해시"의 차이점은 무엇입니까?

git에서 "커밋 해시", "부모 해시" 및 "트리 해시"의 차이점은 무엇입니까?

오늘 저는 이 문서를 온라인으로 읽으며 몇 가지 기본적인 Git 지식을 배웠습니다.

http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi

git log --pretty=format:" "이번 장에서는 내 선호에 따라 로그 정보를 표시하는 방법을 알아보겠습니다 .

%H그런데 형식 시트에서 for Commit Hash, %Pfor Parent Hash%Tfor 두 가지 유사한 옵션을 보았습니다 Tree Hash.

명령줄에서 실험한 결과 길이는 모두 같지만 값이 다른 해시라는 것을 발견했습니다.

나는 검색하고 stackoverflowed했지만 지금까지는 확실한 힌트가 없습니다.

나는 이것에 대해 뭔가를 알고 있습니다 Hash value. 그것은 git 커밋의 체크섬입니다.

그러나 그 역할 Parent HashTree hash기능은 무엇입니까?

  • 추신: 아, 이제 몇 가지 생각이 들었습니다. 이것이 Parent Hash지점의 직접적인 출처에 대한 해시를 의미합니까?

답변1

상위 해시:

$ git log --graph
*   commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\  Merge: 79e6924 3113760
| | Author: linjie <[email protected]>
| | Date:   Mon Mar 14 16:02:09 2016 +0800
| |
| |     commit5
| |
| |     Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <[email protected]>
| | Date:   Mon Mar 14 16:01:26 2016 +0800
| |
| |     commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/  Author: linjie <[email protected]>
|   Date:   Mon Mar 14 16:01:59 2016 +0800
|
|       commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <[email protected]>
| Date:   Mon Mar 14 16:01:00 2016 +0800
|
|     commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
  Author: linjie <[email protected]>
  Date:   Mon Mar 14 16:00:34 2016 +0800

     commit1

$ git log --pretty=format:'%<(82)%P %s'
79e69240ccd218d49d78a72f33002fd6bc62f407 31137606f85d8960fa1640d0881682a081ffa9d0  commit5
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit4
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit3
316dd3fb3c7b501bc9974676adcf558a18508dd4                                           commit2
                                                                                   commit1

너는 볼 수있어4개 제출그리고3개 제출응 부모야5개 제출,2개 제출응 부모야3개 제출그리고4개 제출,1개 제출응 부모야2개 제출.

트리 해시:

$ git log --pretty=format:'%T %s'
f3c7cee96f33938631a9b023ccf5d8743b00db0e commit5
e0ecb42ae45ddc91c947289f928ea5085c70b208 commit4
d466aea17dc07516c449c58a73b2dc3faa9d11a1 commit3
b39f2e707050e0c5bbb3b48680f416ef05b179ba commit2
5706ec2b32605e27fa04cbef37d582325d14dda9 commit1

$ git cat-file -p f3c7ce
100644 blob 8bb2e871e94c486a867f5cfcbc6f30d004f6a9e5    dev
100644 blob 47f16c8e00adba77ec5c176876e99c8e9f05d69b    master

$ git cat-file -p 5706ec
100644 blob fc0bfde0d44bb4d6c7d27b6e587ebedd34ba5911    master

<object>이 명령의 역할: 유형에 따라 내용을 예쁘게 인쇄합니다.

git cat-file -p 

git에서는 모든 것이 트리 및 blob 개체로 저장됩니다. 여기서 트리는 UNIX 디렉터리 항목에 해당하고 blob은 inode 또는 파일 내용에 어느 정도 해당합니다. 단일 트리 개체에는 하나 이상의 트리 항목이 포함되어 있으며 각 항목에는 Blob 또는 하위 트리에 대한 SHA-1 포인터와 관련 스키마, 유형 및 파일 이름이 포함되어 있습니다. Git은 일반적으로 스테이징 영역이나 인덱스의 상태를 가져와서 거기에서 일련의 트리 개체를 작성하여 트리를 만듭니다. 커밋 개체에는 트리 개체를 저장한 사람, 언제 저장했는지, 왜 저장했는지에 대한 정보가 포함되어 있습니다. 이는 제출 개체가 저장하는 기본 정보입니다.

결론적으로:

커밋 해시, 상위 해시 및 트리 해시는 모두 SHA-1입니다. 커밋 해시와 상위 해시는 동일하지만 상위 해시에 하위 항목이 있다는 점만 다릅니다. 트리 해시는 트리 개체를 나타냅니다. 커밋 해시와 상위 해시는 커밋 개체를 나타냅니다.

인용하다:

  1. Git 내부 - Git 객체

  2. git-cat-file - 저장소 객체에 대한 콘텐츠 또는 유형 및 크기 정보를 제공합니다.

답변2

나무기록의 특정 지점과 연결되지 않은 파일 및 디렉터리의 계층적 모음입니다. 예를 들어, 파일을 생성한 다음 삭제하면(다른 중간 커밋 없이) 시작했을 때와 동일한 트리가 생성됩니다.

범죄프로젝트 기록의 한 지점입니다. 커밋은 트리를 지정하지만 작성자/커미터 및 시간, 커밋 메시지(작성자가 변경된 내용을 설명하는 위치), 가장 중요하게는 저장소의 이전 상태인 0개 이상의 부모와 같은 기타 정보도 포함합니다. (첫 번째 커밋에는 부모가 없습니다. 그 이후 대부분의 커밋에는 선형 개발 중에 부모가 하나 있거나 병합하는 경우 부모가 여러 개 있습니다.)

git cat-file -p유형에 관계없이 특정 해시의 내용을 인쇄하는 이 명령을 사용하면 어떻게 작동하는지 확인할 수 있습니다 . 예를 들어 HEAD 커밋을 보려면 다음을 실행하면 됩니다.

$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <[email protected]> 1436468108 -0700
committer Mislav MarohniÄ <[email protected]> 1436468108 -0700

Merge pull request #951 from github/global-args

Avoid depending on a hardcoded list of git global flags

해당 커밋 내의 트리를 보려면 cat-file -p해당 트리를 보면 됩니다.

$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5        .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03        .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278        CONTRIBUTING.md
...

다시 말하지만, 부모를 보면 이것이 커밋이라는 것을 알 수 있습니다. revis 와 같은 커밋 내부 트리의 약어입니다 rev^{tree}. 따라서 이전 명령을 작성할 수 있습니다 git cat-file -p HEAD^{tree}. rev^대리자의 부모 rev. 부모가 여럿인 경우 rev^1rev^2자세한 내용은 다음에서 확인할 수 있습니다.git rev-parse 매뉴얼 페이지.

답변3

"CommitHash"는 현재 커밋의 해시입니다. 항목과 관련된 커밋입니다.

"상위 해시"는 커밋이 발생한 상위 브랜치의 해시입니다.

"트리 해시"는 커밋에 있는 현재 디렉터리의 해시입니다. 이 해시는 를 사용하여 상위 디렉터리에서 볼 경우 디렉터리의 해시와 동일합니다 git ls-files --stage --abbrev.

인용하다:

관련 정보