Git 내부 동작 원리와 용어 정리
Git 내부 동작 원리를 설명함에 앞서
먼저 용어 정리를 하겠다.
Local (Working tree) :
작업의 대상인 프로젝트의 소스 코드들의 디렉터리
Index (Staging Area, Cache) :
commit을 하기 전 git add 함수로 tracking이 된 파일들을 관리하는 영역이다.
index에서는 commit 되기 전 파일의 파일명과 해당 파일의 내용이 담긴 Blob 파일이 기록되어있다.
실제 위치는 프로젝트 폴더 하위에 있는 .git/index 이다.
Repository :
깃이 버전관리를 위해 소스 코드와 데이터들을 저장하는 영역이다. 버전관리를 시작한 시점부터
현재 시점까지 관리해온 여러 버전의 파일들의 내용이 Blob 파일로 저장되어 있다.
이곳에 저장된 파일들은 Object 파일이라 부르며 Blob 또한 한 종류이다.
repository는 컴퓨터 내에서 존재하는 local repository와 원격으로 관리가 가능한 remote repository로 나뉜다.
실제 위치는 프로젝트 폴더의 하위에 있는 .git/objects/ 폴더에 존재하는 파일이다.
Object 파일
Object 파일의 위치는 프로젝트 폴더의 하위에 있는 .git/objects/ 디렉터리에 있는 파일들이다.
Object 파일의 종류 (Blob, Commit, Tree, Tag)
Blob :
버전관리가 되어지는 파일들의 내용은 repository에서 Blob 파일의 형태로 저장된다.
파일의 내용에는 SHA1이라는 해싱 기법을 적용하며 그 결과로 이름이 정해져 내용이 같은
파일들은 모두 하나의 Blob 파일로 저장된다. 그러기에 Git은 여러 버전의 소스 코드들
사이에서 중복 없이 관리가 가능한 것이다.
Commit :
새로운 버전을 생성할 때 하나의 Commit 파일이 생성되는데, Commit 파일은
하나의 Tree 파일을 가리켜야 한다. (버전을 구분하기 위함) Commit 파일에는
가리키고 있는 Tree 파일의 주소(이름)와 직전 버전에 해당하는 Commit 파일의 주소(이름)가 기록된다.
Tree :
commit 시점의 파일들 각각에 대해 그 파일명과 해당 파일의 내용을 담고 있는
Blob 파일의 주소(이름)가 기록된다. 위에서 설명했던 인덱스 파일(.git/index)과 성격이 유사하다.
/** index는 commit 전 파일을 tracing 할 때의 시점 Tree는 commit 시점 **/
Tag :
Commit object 파일을 가리키며 태그명과 작성자, 주석을 담는다.
Branch :
한 프로젝트의 여러 개발 계획 중 한 노선이라 할 수 있다. 분산 버전관리의 핵심적인 컨셉이다.
branch라는 이름에서 알 수 있듯 하나의 줄기를 기준으로 하나 이상의 줄기로 뻗어나가는 이미지다.
repository를 만들면 기본적으로 main이라는 branch가 생기고, 이 main에서 프로젝트를 개발하다가
기존 기능에서 추가적인 기능을 만들려한다면 다른 branch를 만들어 기존의 main branch의 소스코드는
둔 채 안전하게 개발이 가능하다.
내부 동작 원리
Git의 기본적인 원리는 다음과 같은 도표로 한 눈에 알아볼 수 있다.
git.add 명령어를 통하여 workspace(local, working tree)의 파일과 데이터들을 지금부터 tracing하며
index 영역에 Blob파일로 그 내용을 저장한다.
이후 git.commit 명령어를 통하여 index에 저장된 정보를 바탕으로 local repository에 기록한다.
추가적으로 git.push 명령어를 통해 이렇게 기록된 정보를 remote repository에 기록하여 안전하게 다룰 수 있다.
본 글을 작성하는데 있어 아래 글을 참고하였습니다.