[add, commit, status의 원리]


오브젝트 id란, 40개의 숫자의 영문자의 조합으로 이루어진 것으로 커밑 당시의 폴더구조와 파일내용의 전체 상태를 가르키는 참조값이다.


1. git add의 원리

・git add practice.txt를 하면 git의 target이 됨. 

add된 대상을 tracked라고 하고, 그렇지 않은 대상을 untracked라고함

・git의 object 폴더의 하위폴더78번(고유파일이름 98oxxail13k2k...)에 practice.txt의 내용을 담음

・index에 practice.txt의 파일이름을 담음


・git add practice2.txt를 하면 git의 target이 됨

・git의 object 폴더의 하위폴더80번에 practice2.txt의 내용을 담음

・index에 practice2.txt의 파일이름을 담음


・만약에 practice.txt파일을 복사해서 practice3.txt로 이름만 바꾸고 내용은 그대로라면?

・practice3.txt와 practice.txt의 내용이 동일할 경우, 내용은 이미 하위폴더78(고유파일이름 98oxxail13k2k...)에 담겨잇으므로 practice3.txt에 있어서는 패스를 참조만 시킴

・index 파일에는 practice3.txt의 이름을 담음


・정리하면 add를 하게되면 git 내부에서는 2가지의 일이 발생하는데,


-첫번째로, 파일의 내용을 담기위해 파일 내용을 특정한 규칙에 의해 40개의 영문자 조합으로 바꾼 값을 파일명(이것을 오브젝트id라고함)으로 지정하고, 또 그때의 파일내용을 생성된 오브젝트 id로 된 이름의 파일명 안에 내용물(바이너리)로 저장함(이때의 파일은 .git/objects 폴더 아래에 담김)


-두번째로, 파일의 이름을 index파일(바이너리)에 담음(이때의 파일은 .git/index 파일에 담김)


-add 할때 생성되는 오브젝트 아이디는 하나하나 파일명과 그 파일 내용만을 담지만,

commit할때 생성되는 오브젝트 아이디는 커밑할 당시의 모든 디렉토리와 파일에 대한 내용을 담는다.


-이때,내용이 같은 경우 파일의 내용을 참조하는 참조값(파일명)을 새롭게 생성하지 않고

같은 내용을 가진 오브젝트를 재활용하여 참조시키며, 새롭게 add한 파일이름만 index에 담음


・그런데 내용을 기반으로 해서 같은 파일이름을 만드는 원리는 어떻게 되는 것일까?

www.sha1・online.com을 참조해 hash 함수를 실행시켜볼것

・git은 파일의 내용을 hash 알고리즘을 통과시켜서, 그 결과 나온 해쉬값을 도출한다.

해쉬값의 맨앞 2글자를 object 하위의 폴더로 만들고, 그 밑에 나머지 해쉬값을 파일이름으로 저장한다.

・예)a를 입력하면 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 해쉬값 도출

.git(폴더) ・ object(폴더) ・ 86(폴더) ・ f7e437faa5a7fce15d1ddcb9eaeaea377667b8(파일)

・> 실제로 확인해 볼 것.

・실제 git은 입력한 정보와 git만의 고유 부가 정보를 합쳐 해쉬코드를 도출해낸다.







(.git 디렉토리를 열어본 모습, 실제로 index파일과 참조값(파일명)이 쌓이는 objects폴더가 존재함을 볼 수 있다)


2.git commit의 원리

・커밋을 시행할시 주요정보가 2개 만들어진다. 

-첫번째는 커밑의 오브젝트 id를 생선하는데, 커밑의 오브젝트 id는 "커밋이 일어난 시점"에 작업 디렉토리에 있는 모든 디렉토리와 파일정보(파일명,내용)을 담고있음. 

-두번째는 이전 커밋된 내용을 담는 parent 값이 생성되고,

-add 할때 생성되는 오브젝트 아이디는 하나하나 파일명과 그 파일 내용만을 담지만,

commit할때 생성되는 오브젝트 아이디는 커밑할 당시의 모든 디렉토리와 파일에 대한 내용을 담는다.


・각각의 커밋버전마다 서로다른 트리 이름을 참조하고 있고, 그 트리에는 당시 커밋 시점의 파일 이름과 내용의 참조값(파일명)을 가지게된다.


*git commit --amend : 커밑에서 내용누락시 오브젝트id는 그대로고 내용만 수정가능





・이러한 원리를 스냅샷을 찍었다고 부른다.


・object의 3형태

파일의 내용을 담고 있는 object참조값(파일명)을 가지는 blob

파일명과 내용을 담고 있는 object참조값(파일명)을 가지는 blob의 집합을 담고 있는 tree

마지막으로 commit



(tree에 blob의 집합 , blob에 파일내용을 참조하는 참조값(파일명)과 파일이름이 격납되어 있음을 알 수 있다.)



3.git status의 원리

index 파일에 담긴 값과 최후의 commit의 tree에 담긴 값들을 비교하여 알아낸다.





출처 : https://opentutorials.org/course/2708/15241

+ Recent posts