커밋 해시, 부모 해시 및 트리 해시의 차이점은 무엇입니까? “내 취향에 로그 정보를 보여주는

오늘 나는이 문서를 온라인으로 읽음으로써 기본적인 자식 지식을 배우고 있습니다 :

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

그리고 그 장에서, 나는 git log --pretty=format:" "내 취향에 로그 정보를 보여주는 사용법 을 배우기 시작합니다 .

그러나 형식 표에서 %Hfor Commit Hash, %Pfor Parent Hash%Tfor의 두 가지 유사한 옵션을 보았습니다 Tree Hash.

내 명령 줄에서 실험 해 보았습니다. 모두 다른 길이의 동일한 해시 값입니다.

나는 봤는데 지금까지 명백한 힌트가 없었다.

나는 이것 Hash value에 대해 알고있다 . 그것은 그 자식 커밋의 체크섬이다.

그러나 무엇을 Parent Hash하고 Tree hash하는가?

  • 추신 : 아, 이제 몇 가지 아이디어 Parent Hash가 있습니다. 지점의 직접 원점의 해시 값이 평균입니까?


답변

부모 해시 :

$ git log --graph
*   commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\  Merge: 79e6924 3113760
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:02:09 2016 +0800
| |
| |     commit5
| |
| |     Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:01:26 2016 +0800
| |
| |     commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/  Author: linjie <linjielig@gmail.com>
|   Date:   Mon Mar 14 16:01:59 2016 +0800
|
|       commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <linjielig@gmail.com>
| Date:   Mon Mar 14 16:01:00 2016 +0800
|
|     commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
  Author: linjie <linjielig@gmail.com>
  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

당신이 볼 수 commit4commit3이 의 부모 commit5 , commit2이 의 부모 commit3commit4 , commit1이 의 부모 commit2 .

트리 해시 :

$ 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 디렉토리 항목에 해당하는 트리와 inode 또는 파일 내용에 해당하는 blob이 있습니다. 단일 트리 개체에는 하나 이상의 트리 항목이 포함되어 있으며 각 트리 항목에는 관련 모드, 유형 및 파일 이름이있는 Blob 또는 하위 트리에 대한 SHA-1 포인터가 포함되어 있습니다. Git은 일반적으로 스테이징 영역 또는 인덱스의 상태를 가져와 일련의 트리 개체를 작성하여 트리를 만듭니다. 확약 오브젝트에는 트리 오브젝트를 저장 한 사람, 저장시기 또는 저장 이유에 대한 정보가 있습니다. 이것은 커미트 오브젝트가 저장하는 기본 정보입니다.

결론:

커밋 해시, 부모 해시, 트리 해시는 모두 SHA-1입니다. 커밋 해시와 부모 해시는 부모 해시에 자식이 있다는 점을 제외하면 동일합니다. 트리 해시는 트리 개체를 나타냅니다. 커밋 해시 및 부모 해시는 커밋 개체를 나타냅니다.

참고:

  1. 힘내 내부-힘내 개체

  2. git-cat-file-저장소 객체에 대한 내용 또는 유형 및 크기 정보 제공


답변

나무는 역사상 그 어느 특정 지점에 연결되지 파일 및 디렉토리의 계층 적 모음입니다. 예를 들어, 파일을 만든 다음 나중에 파일을 삭제하면 (다른 개입 커밋없이) 시작한 트리와 같은 결과가 나타납니다.

A는 커밋 프로젝트의 역사에서 포인트입니다. 커밋은 트리를 지정하지만 작성자 / 커미터 및 시간, 커밋 메시지 (작성자가 변경 내용을 설명하는 메시지) 및 가장 중요하게는 0 개 이상의 상위 (저장소의 이전 상태)와 같은 다른 정보도 포함합니다. (첫 번째 커밋에는 부모가 없습니다. 그 후 대부분의 커밋에는 선형 개발 중에 하나의 부모가 있고 병합하면 하나 이상이 있습니다.)

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

$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700
committer Mislav MarohniÄ <mislav.marohnic@gmail.com> 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
...

마찬가지로 부모를 보면 그도 커밋임을 알 수 있습니다. 커밋 내부의 트리에 대한 속기 rev는 is rev^{tree}입니다. 따라서 이전 명령을 쓸 수있었습니다 git cat-file -p HEAD^{tree}. rev^의 부모 를 나타냅니다 rev. 여러 부모가있을 때, rev^1, rev^2, 등의 자세한 정보는에서 사용할 자식 레브 – 구문 분석 man 페이지 .


답변

“커밋 해시”는 현재 커밋에 대한 해시입니다. 항목과 관련된 커밋.

“Parent Hash”는 커밋이 발생하는 모든 부모 분기에 대한 해시입니다.

“트리 해시”는 커밋에서 현재 디렉토리의 해시입니다. 해시는 상위 디렉토리에서 볼 경우 디렉토리에있는 해시와 같습니다 git ls-files --stage --abbrev.

참고:


답변