생활코딩 git 02 - git의 원리 (gistory, objects, working stage)
02 Apr 2017 | git생활코딩-git 수업을 듣고 중요 내용을 정리합니다.
수업소개
본 수업의 하위 수업에서는 지금까지 배운 기능들이 내부적으로는 어떻게 동작하는가를 알아보면서 git의 원리를 살펴보겠습니다. 원리가 중요한 이유를 저는 크게 3가지로 구분해봤습니다.
원리에 대한 궁금증은 인간의 본능이라고 생각합니다. 종종 어떤 원리들은 그것이 원리이기 때문에 어려울 것이라고 오해를 받습니다. 하지만 많은 원리들이 실제로는 어렵지 않습니다. 또 어떤 공부들은 원리를 모르면 공부하는데 10시간이 걸리는데 조금 지나면 잊어버리는 것이 있습니다. 반면에, 1시간동안 원리를 배우면 공부하는데 3시간 밖에 걸리지 않고, 훨씬 오래 기억되기도 합니다. 지금부터 배울 원리는 이런 것입니다. git이 동작하는 원리를 알면 우리도 git과 같은 것을 배울 수 있습니다. git의 명령어만 배우면 단지 git의 사용자가 될 뿐입니다. 하지만 원리를 배우면 우리도 무엇인가를 만드는데 큰 영감을 얻을 수 있습니다. 물론, 이 수업은 필수가 아니기 때문에 어렵게 느껴지신다면 원리를 건너뛰고 공부하시길 권합니다.
gistory
gistory는 git을 분석하기 위한 도구입니다. 명령을 내렸을 때 git의 내부에서는 어떤 일이 일어나는가를 분석하면서 git이 어떻게 동작하는가를 스스로 공부하는데 도움을 드리기 위해서 고안된 도구입니다.
- .git 에 어떠한 변화가 생기는지를 살펴보면서 git의 원리에 대해서 이해한다.
설치 (mac)
#python3
pip3 install gistory #python3 사용시
objects 파일명의 원리
git은 파일의 내용 기반으로 object 파일의 이름을 만듭니다. 이것 덕분에 git은 매우 효율적으로 중복 데이터를 저장할 수 있습니다. 여기는 그 원리인 sha1 hash에 대해서 알아봅니다.
- 내용이 같으면 .git에서의 파일 이름(오브젝트)이 같다
- git은 어떤 파일을 저장할 때 파일 이름이 달라도 파일 내용이 같다면,
같은 오브젝트
를 가르킨다. - .git/index에서 다른 파일명을 확인할 수 있지만, 내용이 같으면 모두 같은 오브젝트를 가르킨다. (중복의 제거)
git에서 object는 크게 3가지의 형태를 가진다
- 파일의 내용을 담는 (blob)
- 디렉토리의 파일명과 내용에 해당되는 블락의 정보 (tree)
- 커밋정보 (commit)
sha-1
- sha-1 : 헤쉬 알고리즘을 통과하면 같은 단어는 같은 값(헤쉬값)을 가진다. 참고
- git은 sha1의 매커니즘을 활용하기 때문에 어떤 파일에 대해서 git add를 하면 git은 (대략적으로) 다음과 같은 과정을 거친다.
- add 한 파일의 내용 본다.
- 해당 내용과 부가적인 결과 합해서 압축한다.
- 압축한 내용을 sha1이라는 방법으로 해쉬를 통과시켜서 해쉬값을 얻는다.
- 해당 값을 활용하여 디렉토리명과 파일명(오브젝트명)을 만든다.
commit의 원리
commit을 했을 때 내부적으로는 어떤 일이 일어나는가를 알아봅니다.
- git commit을 진행하면 commit 결과(버전) 은 오브젝트 파일로 저장되고,
해당 오브젝트에는 상세 commit 파일의 버전과 이름이 링크가 되어 있다.
commit이 가진 주요정보 2가지
- 이전 커밋이 누구인가 (parent)
- 커밋이 일어난 시점에 작업 디렉토리의 파일의 이름과, 이름이 담고 있는 내용 사이의 정보 (tree)
- 각각의 버전마다 다른 tree를 가르킨다. 버전에 적혀있는 tree를 통해서 해당 시점의 프로젝트 상태를 각각 얻을 수 있다. (snapshot)
git status의 원리
- git status 명령
- workspace의 파일 내용과
- index (stage) 파일의 내용과
- 최신 커밋 오브젝트 사이의 차이를 비교해서 add, commit할게 있는지 없는지를 확인한다.