본문 바로가기

Git

[Git] Gistory를 통해 git add 의 원리를 이해해보자

반응형

Git을 사용하면서도 Git의 원리에 대해서는 생각해보지 못했었다. git add, git commit 등등.. 명령어만 날릴 줄 알았지 명령어를 날리는 순간 내부적으로 어떤 일이 발생하는지 생각도 짐작도 하지 못했다. 그런데 몇 년 전에, 이고잉님이 이와 관련된 주제로 강의를 올리셨었다. 그래서 해당 강의를 듣고 내가 생각조차 못했던 git의 원리를 이해한 내용을 기록해보고자 한다. 우선 git의 동작원리를 분석하기 위해서는 이고잉님께서 직접 만드신 GUI 웹 브라우저 툴인 Gistory를 다운로드 받아야 하는데, 이에 대해서는 여기를 참고하자.

 

Git의 원리를 파헤쳐보자

 

이번 포스팅에서는 git add 명령어를 날리는 순간 대체 무슨일이 일어나는지에 대해 살펴보자. 우선 로컬에 빈 디렉토리를 만들고 git init 명령어로 git 레포지토리를 생성해보고 그 때의 Gistory 화면을 살펴보자.

 

 

위와 같이 .git 디렉토리에는 오른쪽 화면과 같은 여러 파일들이 기본적으로 내장되어 들어있다. 이제 그럼 work1.txt 파일이라는 것을 만들어 git add 를 시켜보고 난 Gistory 화면을 살펴보자.

 

 

index, objects 라는 것들이 생겼다. index를 클릭해보니 옆에와 같이 방금 add 한 파일 명이 들어있고 긴 해쉬값이 매핑되어 있다. 그렇다면 저 해쉬값은 무엇을 의미할까? 잘 살펴보니 밑에 objects/ 뒤에 있는 긴 문자열과 똑같다. 그러면 objects/ 탭을 클릭해보자.

 

 

 

objects 안을 살펴보니 'work1'이라는 work1.txt 파일 내에 존재하는 텍스트임을 알 수 있다. git은 add하는 파일의 내용을 입력으로 삼아 해쉬함수를 넣어준 후 도출되는 긴 문자열의 해쉬값을 objects 뒤의 경로파일로 설정해준다. 그러므로 git이 의미하는 objects 는 add하는 파일들에 대한 내용을 담고 있다. 그리고 index는 add한 파일의 이름과 그에 매핑되는 해쉬값 objects 경로를 알려주고 있다.

 

그렇다면 파일명을 다르게 하고 내용만 똑같은 work2.txt 를 add시켜보자.

 

 

그리고 난뒤 index 탭을 클릭해보니 파일명은 work1.txt, work2.txt로 다르니 따로 되어있지만 자세히 살펴보면 매핑되는 objects 경로는 똑같음을 알 수 있다! 결국 파일명은 달라도 파일 내용이 같다면 object 해쉬값은 동일하게 매핑시켜줌을 알 수 있다! 그러면 objects 탭에서는 어떻게 표출되는지 살펴보자.

 

 

보다시피 파일내용은 work1으로 같고 파일 이름만 work1.txt, work2.txt 로 나타내어지는 것을 볼 수 있다.

반응형