이것을 이해하려면 먼저 SHA1 해시로 식별되는 모든 저장소 인 git 저장소를 이해해야합니다. 그것들은 커밋, 나무 및 얼룩입니다.
커밋은 커밋 메시지, 커미터, 날짜, 상위 커밋의 SHA1과 트리의 SHA1 (일부 추가 정보 포함)을 포함합니다.
트리는 디렉토리를 나타냅니다. 여기에는 포함 된 파일 및 디렉토리의 이름 (및 기타 메타 데이터)이 들어 있습니다. 각 파일에는 해당 blob의 SHA1도 포함되어 있으며 각 트리에는 다른 트리의 SHA1이 들어 있습니다.
Blob은 이름이나 기타 메타 데이터없이 파일의 내용을 나타냅니다. (일반적으로 최신 현재 지점에 커밋 HEAD
) 커밋 현재에 속하는
- 한 :
지금, git status
세 가지 나무를 비교합니다.
- 스테이징 영역에있는 하나. 여기서 파일은
git add
뒤에 있으며 실제로 커밋하기 전에 커밋을 준비하는 데 사용됩니다.
- 작업 트리. 이 디렉토리가 현재 디스크에서 어떻게 보이는지.
이 당신이 파일 (예를 들어, a.txt이), git add
를 편집하는 경우, 당신이 얻을 좀 더 편집하고 git status
를 사용하는 이유는이 같은 출력 : 이제
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
#
실제 질문 :
어디에서 해시를 찾을 수 있습니까? Repo 특정 항목에는 많은 해시가 있지만 각 파일의 등록 된 해시가 정확히 어디에 있습니까?
이들은 트리 개체에 저장됩니다.예를 커밋 (HEAD
를) 현재의 트리 객체를 참조하려면, git ls-tree HEAD
를 사용
$ git ls-tree HEAD
100644 blob 9c59e24b8393179a5d712de4f990178df5734d99 a.txt
당신은 REPO의 루트 디렉토리가 9c59e24b8393179a5d712de4f990178df5734d99의 SHA1으로해서 a.txt라는 하나 개의 파일 (blob
)이 포함되어 있음을 볼 수있다 .
동일한 명령을 사용하여 해당 하위 디렉토리의 하위 디렉토리 및 파일의 SHA1을 볼 수 있습니다. 자세한 내용은 명령의 설명서를 참조하십시오.
디스크의 일부 파일의 SHA1을 계산하려면 git hash-object
을 사용할 수 있습니다. 다음 명령 중 하나가
당신은 SHA1s이 객체의 내용을 기반으로 있음을 유의을 실행할 경우 이러한 해시와 어떻게됩니까
. 그리고 각 객체는 완전히 변경 불가능하므로 일부 객체의 SHA1은 절대로 변경되지 않습니다. 그러나 많은 연산은 새로운 객체를 생성 할 수 있으며, 예를 들어 어떤 분기 점이 어떤 객체로 변경 될 수 있습니다.
git add
스테이징 영역 트리 걸리는 명령의 파라미터에 따라 일부 파일을 추가하거나 변경하여 수정하고 다시 스테이징 영역에 변성 트리를 저장한다.
git commit
은 준비 영역에서 트리를 가져와 해당 트리를 가리키는 커밋을 만듭니다. 새로운 커밋에는 현재 날짜가 있고, 커미터로, 현재 커밋이 부모로 있습니다. 그런 다음 명령은 현재 분기를 새로운 커밋을 가리 키도록 변경합니다.
git commit -a
은 git add
에 대한 바로 가기이고 그 뒤에는 git commit
이옵니다.
git gc
은 저장소에있는 모든 개체를보고 연결할 수없는 개체를 삭제합니다. Reachable 객체는 모든 브랜치의 팁, 태그 또는 현재 커밋뿐만 아니라 반복적으로 참조하는 모든 객체입니다. 최근에 사용 된 커밋 (및 커밋 된 객체)은 reflog를 통해 접근 할 수 있기 때문에 삭제되지 않습니다.