본문 바로가기

Git+Github

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해야할 파일이 있다고 파악하는 것이다.

반응형