반응형

Git이란?

Git은 빠르고(Fast) 확장 가능한(Scalable) 분산형(Distributed) 버전 관리 시스템입니다.

 

Git은 무엇을 저장할까?

Git과 여타 다른 VCS 시스템들의 가장 큰 차이점은 데이터를 다루는 방법에 있습니다. 큰 틀에서 봤을 때 대부분의 VCS 시스템은 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리합니다.(이를 보통 델타 기반 버전관리 시스템이라 합니다.)

 

그림 1. 각 파일에 대한 변화를 저장하는 시스템들

Git은 이런 식으로 데이터를 저장하지도, 취급하지도 않습니다. 대신 Git은 데이터를 파일 시스템의 스냅샷의 연속으로 취급하고 크기가 아주 작습니다. Git은 커밋하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여깁니다. 파일이 달라지지 않았으면 Git은 성능을 위해서 파일을 새로 저장하지 않습니다. 단지 이전 상태의 파일에 대한 링크만 저장합니다.

Git은 데이터를 스냅샷의 스트림처럼 취급합니다.

 

그림 2. 시간순으로 프로젝트의 스냅샷을 저장하는 Git

 

이것이 Git이 다른 VCS와 구분되는 점입니다. Git은 강력한 도구를 지원하는 작은 파일시스템입니다.

 

Git의 무결성

Git은 데이터를 저장하기 전에 항상 체크섬을 구하고 그 체크섬으로 데이터를 관리합니다. 그래서 체크섬을 이해하는 Git 없이는 어떠한 파일이나 디렉토리도 변경할 수 없습니다. 체크섬은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학입니다. Git 없이는 체크섬을 다룰 수 없어서 파일의 상태도 알 수 없고 심지어 데이터를 잃어버릴 수도 없습니다.

 

Git은 SHA-1 해시를 사용하여 체크섬을 만듭니다. 만든 체크섬은 40자 길이의 16진수 문자열입니다. 파일의 내용이나 디렉토리 구조를 이용하여 체크섬을 구합니다.

 

체크섬의 예시는 아래와 같습니다.

24b9da6552252987aa493b52f8696cd6d3b00373

 

Git은 모든 것을 해시로 식별하기 때문에 이런 값은 여기저기서 보입니다.

실제로 Git은 파일을 이름으로 저장하지 않고 해당 파일의 해시로 저장합니다.

 

Git은 데이터를 추가할 뿐

Git으로 무얼 하든 Git 데이터베이스에 데이터가 추가됩니다. 되돌리거나 데이터를 삭제할 방법이 없습니다. 물론 다른 VCS처럼 Git도 커밋하지 않으면 변경사항을 잃어버릴 수 있습니다. 그러나 일단 스냅샷을 커밋하고 나면 데이터를 잃어버리기 어렵습니다.

 

Git은 파일을 다음 3 가지 상태로 관리합니다.

  1. Modified : 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 의미
  2. Staged : 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미
  3. Committed : 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 의미

그림 3. 워킹 트리, Staging Area, Git 저장소

  • .git directory 는 Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말합니다. 이 Git 디렉토리가 Git의 핵심입니다. 원격 저장소에 있는 저장소를 clone 할 때 Git 디렉토리가 만들어집니다.
  • Working Directory(워킹 트리) 는 프로젝트의 특정 버전을 checkout 한 것입니다. Git 디렉토리는 지금 작업하는 디스크에 있고, 그 디렉토리 안에 압축된 데이터베이스에서 파일을 가져와서 워킹 트리를 만듭니다.
  • Staging Area 는 Git 디렉토리에 있습니다. 단순한 파일이고, 곧 커밋할 파일에 대한 정보를 저장합니다. Git에서는 기술용어로 "Index"라고 하지만, "Staging Area" 라는 용어를 써도 무방합니다.

Git이 하는 일은 기본적으로 아래와 같습니다.

  1. 워킹 트리에서 파일을 수정한다.
  2. Staging Area에 파일을 Stage 해서 커밋할 스냅샷을 만든다. 모든 파일을 추가할 수도 있고 선택하여 추가할 수도 있다.
  3. Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장한다.

Git 디렉토리에 있는 파일들은 committed 상태입니다. 파일을 수정하고 Staging Area에 추가했다면 staged 입니다. 그리고 checkout 하고 나서 수정했지만 아직 Staging Area 에 추가하지 않았으면 modified 상태 입니다.

 


출처 - 저서 ProGit

반응형
반응형