git add의 원리
- git add를 하면 .git/index에는 add한 파일들의 이름이 저장되고, .git/objects에는 add한 파일들의 내용이 저장된다.
- f1.txt를 복사한 f3.txt를 add 하면 .git/objects에는 f1.txt의 내용이 있던 파일에 시간만 바껴 있고, .git/index에는 f3.txt의 이름이 추가 됐다.
- git은 파일의 이름이 달라도 내용이 같으면 같은 objects 파일을 가리킨다.
objects 파일명의 원리
- 파일의 내용을 sha1 hash로 넘겨서 나오는 값의 첫 번째, 두 번째 글자가 objects 아래의 폴더명이다. 그 폴더 아래 세 번째 글자부터 시작해서 끝까지의 이름을 가진 파일이 생성된다.
- ex) 'hi' 내용의 파일명은 objects/c2/2b5f...a42
- git은 파일의 내용 뿐만 아니라 부가적인 정보도 같이 저장되기 때문에 최종적인 hash 값이 다를지언정 mechanism은 동일하다.
- objects 파일은
- blob : 내용을 담고 있다.
- tree : 내용과 파일명을 담고 있다.
- commit : commit 했을 때 message와 그 전 버전들의 내용을 담고 있다.
commit의 원리
- commit message도 add 했을 때 objects에 생긴 폴더에 저장된다.
- tree는 우리가 작성한 버전의 내용과 파일 이름이 저장되어 있다.
- 두 번째 버전부터는 parent에 전 버전이 저장되어 있다.
- 각각의 버전은 그 때 만들어진 스냅샷을 트리라는 정보구조를 통해 가지고 있다.
status의 원리
- index 파일과 최근 commit한 파일이 똑같다면 commit 할 게 없다고 인식한다.
- 내용을 수정한다면 수정한 내용의 hash 값과 최근 commit한 파일의 내용 hash 값이 다르기 때문에 파일이 수정됐다고 인식할 수 있다.
- git add를 하면 index에 있는 파일 내용과 local 파일의 내용이 일치하기 때문에 commmit 대기 상태라고 알 수 있다.
- index에 있는 파일의 내용과 최근 commit한 파일의 내용이 다르면 commit 대기 상태라고 알 수 있다.
git add, git commit
- working directory -- (git add) --> index, staging area -- (git commit) --> repository
출처 : 생활코딩 - 지옥에서 온 git
https://opentutorials.org/course/2708/15212