Git은 기본적으로 Content-addressable 파일 시스템이고 그 위에 VCS 사용자 인터페이스가 있는 구조다.
우선 Content-addressable 파일 시스템은 정말 대단한 것이므로 먼저 다룬다. 그리고 나서 데이터 전송 원리를 배우고 마지막에는 저장소를 관리하는 법까지 배운다.
Git은 content-addressable storate이다.
따라서 이 용어에 대한 것들을 공부해본다.
저장소에는 데이터가 저장된다. 이때 중요한 것은 이 데이터에 어떻게 접근할 것인지이다.
보통의 경우에는 데이터가 위치한 공간의 물리적인 주소를 통해서 데이터에 접근한다.
그러나 CAS는 해당 데이터의 값을 가지고 해싱한 결과를 주소로 삼는다. 즉, 데이터의 상태를 기준으로 데이터에 접근한다.
이 방식은 접근 속도가 빠르다는 것이 장점이다.
만약에 데이터의 위치를 기반으로 데이터에 접근했다면, 최소 데이터의 주소 목록을 선형탐색해야 한다.
그러나 해시함수가 정의되어 있다면, 이 함수가 결과를 뱉어내기만 하면 바로 접근할 수 있기 때문에 접근속도가 빠르다. 해시함수는 특징으로 처리 속도가 빠르다.(사실 그래서 무차별 대입 공격에 취약하다.)
따라서 접근 속도가 빠르다.
이 방식은 데이터의 값이 자주 바뀐다면 좋지 않다.
왜냐하면 바뀔 때마다 해시 값을 계산해줘야 하기 때문이다.
데이터마다 중복되지 않는 하나의 주소를 갖는다.
저수준의 명령어.(Git 시스템 명령어)
Git의 내부구조에 접근할 수 있음.
Plumbing 명령어는 직접 커맨드라인에서 실행하기보다 새로운 도구를 만들거나 각자 필요한 스크립트를 작성할 때 사용함.
사용자용 명령어.
Plumbing 명령어로 구성되어 있음.
새로 만든 디렉토리나 이미 파일이 있는 디렉토리에서 git init
명령을 실행하면 Git은 데이터를 저장하고 관리하는 .git
디렉토리를 만듦.
이 디렉토리를 복사하기만 해도 저장소가 백업됨.
$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/
config
파일에는 해당 프로젝트에만 적용되는 설정 옵션이 들어 있다.description
파일은 기본적으로 GitWeb 프로그램에서만 사용하기 때문에 이 파일은 신경쓰지 않아도 된다.info
디렉토리는 .gitignore
파일처럼 무시할 파일의 패턴을 적어 두는 곳이다. 하지만 .gitignore
파일과는 달리 Git으로 관리되지 않는다.hooks
디렉토리에는 클라이언트 훅이나 서버 훅이 위치한다. 관련 내용은 Git Hooks 에서 설명한다.objects
디렉토리는 모든 컨텐트를 저장하는 데이터베이스이다.refs
디렉토리에는 커밋 개체의 포인터(브랜치, 태그, 리모트 등)를 저장한다.HEAD
파일은 현재 Checkout 한 브랜치를 가리킨다.index
파일은 Staging Area의 정보를 저장한다.HEAD
파일, index
파일, objects
디렉토리, refs
디렉토리 이 네 항목이 Git의 핵심이다.