새로운 저장소 생성
깃을 통해 버전 관리를 시작하기 위해서는 디렉토리를 깃 저장소로 초기화 해야한다.
git init
- git init을 통해 현재 디렉토리를 저장소로 초기화한다.
- .git 폴더가 생성되어 이를 통해 버전 관리가 이루어 진다.
git add를 해보자
이 명령어는 깃에게 파일을 추적하라고 이야기 하는 것과 같다.
$ git add "파일명"
- 버전관리 목록에 추가 하여 깃이 파일들을 지켜보게 한다. (커밋 대기상태(stage area))
- 버전관리가 되고 있는 파일이 수정되면 다시 add를 해야한다.
- 이 명령이 저장소에 새 파일들을 추가하진 않는다.
git add 명령어 실행 결과 objects 디렉토리에 서브디렉토리 78이 생성되고 981922613b2afb6025042ff6bd878ac1994e85라는 이름을 가진 파일과 index파일이 생성되었다.
$ vim f1.txt // vi 에디터로 파일 생성
$ git add f1.txt // git add 명령어로 ‘추적됨’(tracked) 상태로 변경
objects/78/981922613b2afb6025042ff6bd878ac1994e85
- [blob] 78981922613b2afb6025042ff6bd878ac1994e85
- 생성된 981922613b2afb6025042ff6bd878ac1994e85은 파일의 내용이 저장된다.
- 파일의 이름은 파일의 내용에 적혀 있지 않다.
index
- 파일의 이름은 index안에 적혀 있다.
- git ls-files --stage를 통해 index의 내용을 볼 수 있다.
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
- f1.txt라는 파일의 내용은 78981922613b2afb6025042ff6bd878ac1994e85 에 담겨 있다.(z)
- 즉 파일의 이름은 index, 내용은 objects라는 디렉토리에 담겨 있다.
두번째 add
git add 명령어 실행 결과 objects 디렉토리에 서브디렉토리 b6이 생성되고 8025345d5301abad4d9ec9166f455243a0d746 라는 이름을 가진 파일이 생성되었다.
$ vim f2.txt // vi 에디터로 파일 생성
$ git add f2.txt // git add 명령어로 ‘추적됨’(tracked) 상태로 변경
objects/b6/8025345d5301abad4d9ec9166f455243a0d746
- [blob] b68025345d5301abad4d9ec9166f455243a0d746
index
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
100644 b68025345d5301abad4d9ec9166f455243a0d746 0 f2.txt
- add된 각각의 파일명과 그 파일명에 해당되는 정보가 index에 추가된 것을 볼 수 있다.
f1.txt를 복사한 f3.txt를 add
git add 명령어 실행 결과 objects 디렉토리에 새로운 파일이 생성되지 않았다..
$ cp f1.txt f3.txt// cp 명령어로 파일 복사
$ git add f3.txt // git add 명령어로 ‘추적됨’(tracked) 상태로 변경
index
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
100644 b68025345d5301abad4d9ec9166f455243a0d746 0 f2.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f3.txt
- f1.txt.와 f3.txt가 같은 오브젝트를 가리키고 있다는 것을 알 수 있다.
- git은 파일을 저장할 때 이름이 달라도 파일의 내용이 같다면 같은 오브젝트를 가르키기 때문이다.
- 따라서 새로운 오브젝트 파일이 생성되지 않는다(중복 제거).
내용을 기반으로 오브젝트의 이름이 결정되어 내용이 같다면 같은 오브젝트를 가리킨다는 것을 알 수 있다.
그렇다면 이름을 결정하는 메커니즘은 무엇을 사용할까?
- git add를 한다면 add한 파일의 내용과 부과적인 정보를 추가해서 압축한다.
- 압축한 결과를 SHA-1라는 해시 알고리즘을 통해 파일의 이름을 도출한다.(해시값)
EX) hello -> aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
- 도출 된 이름의 앞 두글자를 따서 objects 디렉토리에 새로운 디렉토리를 생성한다.
objects/aa
- 앞 두글자를 제외한 나머지 이름을 가진 정보가 저장될 파일을 생성하여 정보를 저장한다.
objects/aa/f4c61ddcc5e8a2dabede0f3b482cd9aea9434d
- 그리고 index에 파일의 이름과 파일의 내용에 관한 정보(오브젝트)가 저장된다.
100644 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d 0 file.txt
깃은 일종의 Key-Value Store로 객체들을 관리한다. Key를 사용하면 언제든지 객체의 내용(Value)에 액세스할 수 있게 된다. Key는 객체의 내용에 대한 SHA-1 해시 값으로 만들어지고 Value는 객체의 내용이다.
- 객체의 내용을 SHA-1 해시화한 값을 Key로 한다.
- 객체를 압축 한 후 .git/objects/아래에 Key 이름으로 파일로 저장한다.
- 검색 효율성을 위해 Key의 처음 2자로 서브디렉토리를 자른다.
'Git' 카테고리의 다른 글
[Git] 커밋 취소/되돌리기/덮어쓰기(reset / revert / amend) (0) | 2024.06.04 |
---|---|
[Git] 태그(tag)의 기초와 사용법 (0) | 2024.06.02 |
[Git] 깃(Git)의 원리(2, commit)와 깃 객체(Git Object) (0) | 2024.06.02 |
[Git] 깃(Git)의 원리(2, commit)와 깃 객체(Git Object) (0) | 2024.05.28 |
[GIT] 버전 관리 시스템 깃(Git)이란? (0) | 2024.03.20 |