오늘 저는 이 문서를 온라인으로 읽으며 몇 가지 기본적인 Git 지식을 배웠습니다.
http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi
git log --pretty=format:" "
이번 장에서는 내 선호에 따라 로그 정보를 표시하는 방법을 알아보겠습니다 .
%H
그런데 형식 시트에서 for Commit Hash
, %P
for Parent Hash
및 %T
for 두 가지 유사한 옵션을 보았습니다 Tree Hash
.
명령줄에서 실험한 결과 길이는 모두 같지만 값이 다른 해시라는 것을 발견했습니다.
나는 검색하고 stackoverflowed했지만 지금까지는 확실한 힌트가 없습니다.
나는 이것에 대해 뭔가를 알고 있습니다 Hash value
. 그것은 git 커밋의 체크섬입니다.
그러나 그 역할 Parent Hash
과 Tree 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입니다. 커밋 해시와 상위 해시는 동일하지만 상위 해시에 하위 항목이 있다는 점만 다릅니다. 트리 해시는 트리 개체를 나타냅니다. 커밋 해시와 상위 해시는 커밋 개체를 나타냅니다.
인용하다:
답변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
...
다시 말하지만, 부모를 보면 이것이 커밋이라는 것을 알 수 있습니다. rev
is 와 같은 커밋 내부 트리의 약어입니다 rev^{tree}
. 따라서 이전 명령을 작성할 수 있습니다 git cat-file -p HEAD^{tree}
. rev^
대리자의 부모 rev
. 부모가 여럿인 경우 rev^1
등 rev^2
자세한 내용은 다음에서 확인할 수 있습니다.git rev-parse 매뉴얼 페이지.
답변3
"CommitHash"는 현재 커밋의 해시입니다. 항목과 관련된 커밋입니다.
"상위 해시"는 커밋이 발생한 상위 브랜치의 해시입니다.
"트리 해시"는 커밋에 있는 현재 디렉터리의 해시입니다. 이 해시는 를 사용하여 상위 디렉터리에서 볼 경우 디렉터리의 해시와 동일합니다 git ls-files --stage --abbrev
.
인용하다: