Git 원리 번외 1편 (.git파일)
Git 원리
Git으로 관리되는 디렉토리에는 .git이라는 디렉토리(숨김 상태)가 생긴다.
이 디렉토리 안에는 git과 관련된 파일이 있다.
우리가 쓰는 명령(add, commit, .txt파일등)이 어떻게 관리되는지 확인해본다.
* add의 원리
- f1.txt를 생성하고 a라는 텍스트를 쓴 후 add해서 git이 관리하게 만들었을 경우
.git/objects 디렉토리안에 디렉토리를 만들고 그안에 파일로써 관리한다.
명확하게 설명하면 "a"라는 문자를 sha1이라는 해시 알고리즘으로 해시코드(40자리)를 만들고 그 중에 처음 2자리로는 해당 문자로 .git/object안에 디렉토리를 만들고 나머지 38자리로는 해당 문자로 이름을 갖는 파일을 만든다.
여기서 예로든 "a"라는 이름은 누가, 어떤 컴퓨터에서 만들든 같은 해시코드(40자리)를 갖는다.
=> 결론 : 누가 만들든 파일의 이름이 달라도 "내용"이 같으면 해시코드(인덱스 값)가 같음.
+ 여러 파일을 만들어도 같은 내용이면 하나로 관리된다. (.git/index파일)
* commit의 원리
commit도 .git/objects 안에 디렉토리안에 파일 즉, 일반적인 파일과 똑같이 관리된다.
author이런 것은 누가 작성했는지 이런 것이라 너무 당연하고
commit으로 생성된 파일(object)을 살펴보면 중요한 정보가 2가지가 있다.
1. parent : 해당 commit 바로 이전의 상위 commit id
2. tree : commit을 통해 관리된 파일들의 이름과 내용에 대한 구조
즉, tree를 통해서 파일, 디렉토리 구조등으로 나타내고 그 안의 정보도 볼 수 있다.
* 만약 git으로 관리되고 있는 프로젝트에 디렉토리를 만든다면 그 디렉토리는 어떻게 관리 될까?
- 디렉토리 역시 objects로 관리되고 타입이 tree다. (파일의 타입은 blob)
=>결론 : objects는 3가지로 구분된다. (1. 파일(blob) / 2. commit / 3. 디렉토리(tree))
* status의 원리
<출처 : http://blog.hjf.pe.kr/37>
.git 디렉토리 밑에 index라는 파일이 있다.
index파일에는 commit하기 위해 준비된 내용들 즉, staging area와 같은 의미로 저장이 되어있다.
working tree, workspace - index, staging area, cache - repository
이런 구조에서 만약 workspace에서 f1.txt파일의 변경이 일어났다면 index와 내용이 다르므로 git status 명령어를 입력했을 때 수정된 파일이 있다고 파악하는 것이고
commit한 데이터와 index파일이 다르면 commit해야할 파일이 있다고 파악하는 것이다.