핵심은 단순한 Key-value 형태의 데이터 저장소우리가 사용하는 git 명령어(고수준 명령어) git init git add git commit을 사용할 때 실제 GIT의 내부에서 실행되는 명령어를 저수준 명령어라고 한다
이러한 저수준 명령어는 GIT의 기본적인 데이터 구조와 알고리즘에 직접 접근할 수 있게 해주며, 일반적으로 고수준 명령어에 의해 호출된다.
사용자가 git init을 입력하면 새로운 저장소를
초기화할 때 objects(개체 데이터 베이스) 디레토리를 생성하고 하위에 pack 디렉토리와 info 디렉토리를 생성된다.
사용자가 git add를 입력하게 되면 저수준 명령어인 git hash-object가 GIT 내부에서 실행되면서 파일의 내용을 해싱하여 Blob 개체를 만들고, .git /objects 디렉토리에 저장한다.
GIT 내부에서 저수준 명령어인 git update-index명령어가 실행되면서 생성된 Blob개체를 인덱스(스테이징 영역)에 추가한다.
사용자가 git commit을 입력하게 되면 저수준 명령어인 git write-tree가 실행되면서 현재 인덱스(스테이징 영역)을 기반으로 Tree개체를 생성한다. Tree개체 역시 .git/objects 디렉토리에 저장한다.
git commit-tree명령어가 실행되면서 생성된 Tree개체를 기반으로 Commit개체를 생성한다.
해당 개체도 마찬가지로 .git/objects 디렉토리에 저장한다.
Blob은 유닉스의 Inode나 일반 파일에 대응된다.
git hash-obejct 명령어를 통해 생성된다.
파일의 내용을 기반으로 SHA-1 해시 알고리즘을 통해 나온 해시 값을 key로 사용한다.
같은 내용의 파일은 항상 같은 해시 값을 가진다.
40자 길이의 해시로 처음 2 글자를 따서 디렉토리 이름으로 사용하고 나머지 38글자는 파일 이름에 사용한다.
파일의 내용이 변경될 때마다 새로운 Blob 개체가 생성이 되며, 새로운 해시 값이 반환된다.
Tree는 유닉스의 디렉토리에 대응된다.
Tree개체를 저장할 때는 git write-tree 명령어를 사용한다.
Tree개체는 항목을 여러개 가질 수 있다.
항목: Blob 하위 트리 개체를 가리키는 SHA-1 포인터 파일 모드 개체 타입 파일 이름
GIT은 일반적으로 INDEX(스테이징 영역)의 상태대로 Tree 개체를 만들고 기록한다. 그렇기 때문에 Tree개체를 만들기 위해서는 INDEX(스테이징 영역)에 파일을 추가해야한다.
commit 객체는 프로젝트의 특정시점의 트리 상태를 저장하는 개체이다.
commit-tree 명령어를 통해 commit개체가 생성된다. 해당 명령에는 Tree개체의 SHA-1값 하나를 넘긴다.
이때 -p 옵션을 통해서 부모 커밋을 지정할 수 있으며 이를 통해서 GIT 히스토리를 만들 수 있다.
commit개체의 형식: 최상단 Tree Author / Committer의 정보 시간 정보 commit message