혼란스러운 부분은 다음과 같습니다.
Git은 그 파일들을 개별 파일로 본 적이 없습니다. Git은 모든 것을 전체 내용으로 생각합니다.
Git은 종종 자체 저장소에 객체 대신 160 비트 해시를 사용합니다. 파일 트리는 기본적으로 각 컨텐트 (메타 데이터)와 관련된 이름 및 해시 목록입니다.
그러나 160 비트 해시는 콘텐츠를 고유하게 식별합니다 (git 데이터베이스의 유니버스 내에서). 따라서 컨텐츠로 해시가있는 트리 에는 해당 상태 의 컨텐츠 가 포함됩니다 .
파일 내용의 상태를 변경하면 해시가 변경됩니다. 그러나 해시가 변경되면 파일 이름 내용과 관련된 해시도 변경됩니다. "디렉토리 트리"의 해시가 변경됩니다.
git 데이터베이스가 디렉토리 트리를 저장할 때, 그 디렉토리 트리는 모든 서브 디렉토리의 모든 내용과 그 안에있는 모든 파일을 포함하고 포함합니다 .
Blob 또는 다른 트리에 대한 (불변의, 재사용 가능한) 포인터로 트리 구조로 구성되지만 논리적으로 전체 트리의 전체 내용에 대한 단일 스냅 샷입니다. git 데이터베이스 의 표현 은 플랫 데이터 내용이 아니지만 논리적으로 모든 데이터이며 다른 것은 아닙니다.
트리를 파일 시스템으로 직렬화하고 모든 .git 폴더를 삭제하고 git에게 트리를 다시 데이터베이스에 추가하도록 지시하면 데이터베이스에 아무것도 추가하지 않아도됩니다. 요소는 이미 존재했을 것입니다.
git의 해시를 불변 데이터에 대한 참조 카운트 포인터로 생각하면 도움이 될 수 있습니다.
그 주위에 응용 프로그램을 빌드 한 경우 문서는 여러 페이지로 구성되며 레이어가 있고 그룹이 있고 개체가 있습니다.
객체를 변경하려면 완전히 새로운 그룹을 만들어야합니다. 그룹을 변경하려면 새 문서가 필요한 새 페이지가 필요한 새 레이어를 만들어야합니다.
단일 객체를 변경할 때마다 새 문서가 생성됩니다. 오래된 문서는 계속 존재합니다. 새 문서와 기존 문서는 대부분의 컨텐츠를 공유합니다. 동일한 페이지를 가지고 있습니다 (1 제외). 한 페이지에는 같은 레이어가 있습니다 (1 제외). 해당 계층은 동일한 그룹을 갖습니다 (1 제외). 해당 그룹은 동일한 객체를 갖습니다 (1 제외).
그리고 마찬가지로 논리적으로 사본을 의미하지만 구현 측면에서 볼 때 동일한 불변 객체에 대한 또 다른 참조 카운트 포인터입니다.
git repo는 그렇게 비슷합니다.
이것은 주어진 git changeset이 commit 메시지 (해시 코드)를 포함하고, 작업 트리를 포함하고, 부모 변경을 포함한다는 것을 의미합니다.
이러한 상위 변경 사항에는 상위 변경 사항이 포함됩니다.
히스토리 를 포함하는 git repo의 일부는 변경 체인입니다. "디렉토리"트리에서 "디렉토리"트리 위 의 레벨로 변경 체인을 변경하면 변경 세트와 변경 체인에 고유하게 접근 할 수 없습니다.
파일에 어떤 일이 발생하는지 확인하려면 변경 세트에서 해당 파일로 시작하십시오. 그 변경 세트에는 역사가 있습니다. 종종 그 역사에는 동일한 내용을 가진 동일한 이름의 파일이 존재합니다. 내용이 동일하면 파일이 변경되지 않은 것입니다. 다른 경우 변경 사항이 있으므로 정확히 무엇을 해결하기 위해 작업을 수행해야합니다.
때때로 파일이 사라졌습니다. 그러나 "디렉토리"트리에는 동일한 내용의 동일한 파일 (동일한 해시 코드)이있을 수 있으므로 해당 방식으로 추적 할 수 있습니다 (참고 : 커밋 대상과 별도로 파일을 이동하려는 커밋을 원하는 이유입니다) -편집하다). 또는 동일한 파일 이름이며 파일을 확인한 후 유사합니다.
git은 "파일 히스토리"를 함께 패치 워크 할 수 있습니다.
그러나이 파일 히스토리는 파일의 한 버전에서 다른 버전으로의 링크가 아닌 "전체 변경 세트"의 효율적인 구문 분석에서 비롯됩니다.