[Git-지옥에서 온 git] 2일차 - git의 원리

2022. 8. 3. 23:47개발공부 기강잡자/Git

- git의 내부 분석 : .git 디렉토리에 어떠한 변화가 생기는가?! 

 

[분석도구 gistory]

gistory : .git 디렉토리의 내용을 볼 수 있는 도구

- 변경되거나 추가된 파일이 제일 위로 올라옴

- git 명령어가 .git 디렉토리에 어떻게 영향을 주었는지 볼 수 있음

 

gistory 모듈 설치하는 법

1. Python 설치 (3.8 버전 이하)

2. cmd 창에서 gistory 라이브러리 설치하기 pip install gistory (Windows)

3. Git bash에서 .git 디렉토리가 있는 폴더에서 gistory 명령어 실행

4. 웹브라우저에서 실행해서 나온 포트번호로 웹사이트 접속

http://localhost:8805

[git add]

vim f1.txt 명령어를 통해 파일 추가를 해도 .git 디렉토리에는 변화가 없다.

> git add를 해야 변화가 발생한다.

 

git add 명령어를 통해 .git 디렉토리에서 수정된 파일

 

1. objects

: 파일의 내용이 기록된 디렉토리

objects/00/0000000000000000000000000000000000 

: objects 디렉토리에 수정한 파일의 내용이 기록되어있음

 

2. index 파일

: 파일의 이름이 담긴 파일

- f1.txt 파일은 7898~~ 파일에 적혀있다 라고 기록되어있음

 

cp f1.txt f3.txt

→ index를 확인해보면 f1.txtf3.txt 의 인덱스가 동일하다

= git은 파일의 이름이 달라도 같은 내용이면 같은 object 파일을 가리킨다. (굉장히 중요한 원리!)

☞ 아무리 많은 파일이 있다고 하더라도, 내용이 같다면  똑같은 오브젝트 파일을 가리키기 때문에 중복을 제거한다.

 

[objects 파일명의 원리]

❗❗ 내용이 같으면 가리키는 object이 같다 ❗❗

> Git은 add 된 파일의 내용을 SHA1 해시 알고리즘을 사용하여 파일의 이름(해시값)을 도출

> 해시값의 맨 앞 두글자로 된 디렉토리를 만들고, 나머지 해시값은 하위 파일에 생성하여 내용을 저장함

sha1-online.com

☞ hello 라는 내용을 저장하는 경우, git의 objects/aa/f4c61ddcc5e8a2dabede0f3b482cd9aea9434d 에 hello라는 내용이 저장된다!

(아마 실제 git은 add 된 파일 내용에 추가적인 정보를 담아 sha1 해시 알고리즘을 사용할 것이다.)

[commit의 원리]

git commit을 하게 되면 .git의  objects 파일이 수정됨
: commit 메세지 정보가 objects 디렉토리 아래에 저장됨  = 버전도 objects 로 저장된다는 것

 

objects의 내용

- (parent), tree, author, commiter
> tree {sha1해시값} : 해시값이 가리키는 objects 파일에는 commit 된 파일의 인덱스 정보가 저장되어 있음

 

✔ commit을 하면 commit에 대한 정보(tree, author. committer) 정보가 objects 파일로 저장이 되고

✔ objects 파일에 저장된 tree의 값에 해당하는 object 파일에는 commit 된 파일의 정보 (인덱스)가 저장되어 있다!

 

commit 의 중요 정보

- parent : 이전 커밋이 무엇인가

- tree : commit이 일어난 시점의 파일의 이름, 이름이 가리키는 내용의 정보

> 각각의 버전마다 다른 tree를 가리킴 

> 버전의 tree를 이용하여 버전이 만들어진 시점의 프로젝트 폴더에 대한 상태를 얻을 수 있다.

= SNAPSHOT : 각각의 버전은 tree를 통해서 SNAPSHOT을 가진다!

 

object 파일 세가지 유형

1. 파일의 내용을 담거나 = blob

2. 디렉토리의 파일명과 파일의 내용(blob)을 담거나 = tree

3. commit에 대한 정보

[status의 원리]

just 짐작 ~

 

f2.txt 파일의 내용을 수정했을 때,

1. vim f2.txt

: 수정 직후, git status 명령어를 실행하면 .git에 기록되어있는 f2.txt의 objects와 수정된 f2.txt 의 내용을 비교하여 다르다면 modified 파일인지 판단할 것이다.

 

2. git add
: add 한 후에는 파일의 objects 파일과 그 파일을 가리키는 index 파일에 기록되어있는 f2.txt의 인덱스(해시값)이 바뀐다

git status 명령어를 수행하면 objects의 해시값과 현재 파일 내용의 해시값을 비교하면 일치하니, 파일이 add 되었음을 알 수 있을 것이다.

 또한, 가장 마지막으로 실행된 commit의 tree가 가리키는 f2.txt 의 내용과 다르다면 현재의 f2.txt는 add가 되어서 commit 대기 상태로 판단할 것이다.

 

3. git commit

: 가장 마지막으로 실행된 commit의 tree가 가리키는 f2.txt의 내용과 현재 파일의 내용이 일치하기 때문에 해당 파일은 commit된 상태로, 더이상 commit할 것이 없다고 판단할 것이다.

 

[Flow]

Working Directory에서 작업

add

index( = staging area = 커밋대기 상태)에 등록 

commit

index  파일에 등록된 내용이 local repository에 object(commit, tree, blob)로 저장

push

remote repository

 

 

 

참고 : 지옥에서 온 git - 이고잉 님