티스토리 뷰

Git 공부

Git add의 원리

on1ystar 2019. 3. 9. 18:05
728x90
반응형

본 내용은 생활코딩 - 지옥에서 온 git을 보고 공부했습니다. 조언은 언제든지 감사합니다 !


.git이라는 디렉토리에는 git이 수행하는 버전 관리 내용들이 담겨있다.


그 중 add를 했을 때 .git에서 일어나는 변화는 index와 objects에서 일어난다.


index

add한 파일의 이름이 담겨있다.

다른 정보들은 암호화처럼 되어 있어서 알 수 없지만 test1.txt나 test2.txt같은 파일의 이름은 확인할 수 있다.


objects

add한 파일의 내용이 담겨있다.

겉으로 보기에는 저게 파일의 내용인지 알 수 없지만 이는 sha1 hash 알고리즘 때문이다.


위의 내용들을 gistory라는 오픈소스 프로그램을 사용하면 보기 쉽게 분석할 수 있다. https://github.com/egoing/gistory


분석한 내용을 정리해보면 git은 파일의 내용 압축한 뒤 sha1과 다른 부가적인 알고리즘과 함께 해쉬화 하여 관리한다. 때문에 만약 파일의 내용이 같다면 이 해쉬화 한 정보(문자열)도 같게 된다.

이 hash를 통과한 내용이 바로 objects 안에 만들어지는 디렉토리+파일 명 이다.

예를 들어 위에서 objects/10/d1266...b77이라는 디렉토리와 파일이 있다. 여기서 objects 뒤에 /를 뺀 10d1266...b77이 sha1 hash 알고리즘을 통과한 파일의 내용이 된다.

그리고 이 hash된 내용이 index에 파일 명과 같이 놓이게 된다.


여기서 중요한 점이 바로 내용이 같으면 hash 값도 같아지게 된다는 것이고, 만약 어떤 파일의 내용을 복사한 다른 이름의 파일을 만들 경우 두 파일의 내용은 같아지기 때문에 hash 값도 당연히 같아지고 objects 디렉토리에는 복사한 파일의 내용이 만들어지지 않는다.

index에는 복사한 파일의 이름은 만들어지지만 그 파일이 가리키는 내용은 복사된 파일의 내용과 같기 때문에 같은 objects의 디렉토리를 가리키게 된다.

이는 유사하게 코딩에서의 객체 참조 개념인 것 같다. 파일의 이름은 객체를 참조하는 변수인 것이고 파일의 내용은 객체가 되겠다.

python으로 표현하면 

test1.txt = test2.txt = 123

이 되어 123이라는 객체가 메모리에 2개가 만들어 지는 것이 아니라 1개가 만들어 지고 두 변수가 동시에 그 메모리를 참조하는 것 같은 개념이지 않을까 싶다.

따라서 디렉토리 이름도 objects = 객체 로 만든 것 같다.


이러한 알고리즘 덕에 git은 중복되는 데이터들을 효율적으로 저장할 수 있게 된다.

728x90
반응형

'Git 공부' 카테고리의 다른 글

Git branch  (0) 2019.03.10
Git commit의 원리, 저장소 관계  (1) 2019.03.09
Git 변경사항 확인 git log -p, git diff  (0) 2019.03.09
Git stage area  (0) 2019.03.08
Git 버전 생성  (0) 2019.03.08
댓글