Git의 원리] 1. git add (index, object, blob)
1. 테스트 프로젝트 생성
git을 test할 폴더를 선택하고 git init을 하여 git을 사용할 수 있도록 한다.
폴더 하위에 .git directory가 생성된다.
- object directory : all the content of your database
- refs directory : pointers into commit objects in that data (branches)
- HEAD file : 현재 check out된 branch
- git add시 생성되는 Index file : staging area information
2. 프로젝트 폴더에 'a'를 입력한 f1.txt 파일을 저장해보자.
3. f1.txt 파일을 git add하자.
$ git add f1.txt
.git\objects 경로에 2e라는 폴더가 생기고 그 안에 txt파일(65efe2a145dda7ee51d1741299f848e5bf752e.txt)이 생성되었고, .git폴더 하위에 index파일이 생성되었다.
4. index 내용을 확인해보자.
$ git ls-files --stage
100644 2e65efe2a145dda7ee51d1741299f848e5bf752e 0 f1.txt
100644 : 일반파일
2e65efe2a145dda7ee51d1741299f848e5bf752e : object name(object 폴더의 2e폴더 하위에 65efe2a145dda7ee51d1741299f848e5bf752e 파일을 가리킨다.)
0 : stage number
f1.txt : 파일 이름
git hash-object command로 해당 파일 contents의 hash id를 확인할 수 있다.
$ git hash-object f1.txt
2e65efe2a145dda7ee51d1741299f848e5bf752e
5. object 내용을 확인해보자.
object에는 f1.txt파일의 내용이 담겨있다. 파일명은 없다. 파일명은 index파일에 있다.
$ git cat-file -p 2e65efe2a145dda7ee51d1741299f848e5bf752e
a
-p 옵션을 주면 파일 내용이 출력된다.
2e65efe2a145dda7ee51d1741299f848e5bf752e object에는 파일내용만 저장되어 있다. 이런 종류의 object를 blob이라고 한다. -t 옵션을 주면 hash id로 object type을 확인할 수 있다.
$ git cat-file -t 2e65efe2a145dda7ee51d1741299f848e5bf752e
blob
6. 'z'를 입력한 f2.txt 파일을 생성하여 add하고 index를 확인해보자.
$ git add f2.txt
$ git ls-files --stage
100644 2e65efe2a145dda7ee51d1741299f848e5bf752e 0 f1.txt
100644 fa7af8bf5fdd704f73beb3adc5612682a98e1af5 0 f2.txt
fa로 시작하는 새로운 object가 생성되었음을 확인할 수 있다.
7. 이번에는 f1.txt파일을 복사하여 f3.txt파일을 create/add하고 index를 확인해보자.
$ git add f3.txt
$ git ls-files --stage
100644 2e65efe2a145dda7ee51d1741299f848e5bf752e 0 f1.txt
100644 fa7af8bf5fdd704f73beb3adc5612682a98e1af5 0 f2.txt
100644 2e65efe2a145dda7ee51d1741299f848e5bf752e 0 f3.txt
f1.txt, f3.txt가 동일한 object를 가리키는 것을 확인할 수 있다.
git은 파일을 저장할 때 파일의 이름이 달라고, 내용이 같으면 같은 object파일을 가리킨다. 아무리 많은 파일이라도 내용이 동일하면 index에는 파일명만 적혀있고 동일한 object파일을 가리킨다.
결론 : 파일의 이름은 index에 담겨있고, 파일의 내용은 object에 담겨있다!!!