형상관리 - Git

HeeJune KIM·2024년 7월 31일

Git의 내부 구조 및 개체 모델


1. Git의 Content-addressable 파일 시스템

Git은 Content-addressable 파일 시스템입니다. 이는 Git의 핵심이 단순한 Key-Value 데이터 저장소로, 어떤 형식의 데이터라도 저장하고 그 데이터를 유일한 키로 식별할 수 있다는 것을 의미합니다. 이 키는 데이터에 접근할 수 있는 해시 값입니다.

2. Git 개체의 유형

Git 개체는 Blob, Tree, Commit, Tag 네 가지 주요 유형으로 나뉩니다.

  1. Blob (Binary Large Object)

    • 파일의 내용 자체를 저장합니다.
    • 메타데이터(이름, 권한 등)는 저장하지 않습니다.
    • 파일의 내용이 변경될 때마다 새로운 해시를 생성합니다.
  2. Tree

    • 디렉토리 구조와 파일 이름을 저장합니다.
    • 다른 Tree 개체나 Blob 개체를 포함할 수 있습니다.
    • 유닉스 파일 시스템과 유사하게 디렉토리와 파일을 관리합니다.
  3. Commit

    • 저장소의 특정 시점의 스냅샷을 가리킵니다.
    • 부모 커밋, 작성자, 타임스탬프 등의 메타데이터를 포함합니다.
    • 각 커밋은 하나의 Tree 개체를 가리키며, 해당 시점의 전체 프로젝트 구조를 나타냅니다.
  4. Tag

    • 특정 커밋에 대한 참조를 만듭니다.
    • 주로 릴리즈 버전을 표시하는 데 사용됩니다.
    • Annotated Tag는 서명, 메타데이터 등을 포함할 수 있습니다.

3. Git 명령어와 내부 동작 원리

Git 명령어는 Git 개체와 상호 작용하여 파일의 버전을 관리하고 저장소를 조작합니다. 몇 가지 주요 명령어와 그 내부 동작 원리를 살펴보겠습니다.

  1. git init

    • 새로운 Git 저장소를 초기화합니다.
    • .git 디렉토리를 생성하고 초기 구조를 설정합니다.
  2. git add

    • 파일을 스테이지 영역에 추가합니다.
    • 파일의 현재 상태를 Blob 개체로 저장하고, 인덱스에 추가합니다.
  3. git commit

    • 스테이지된 변경 사항을 커밋합니다.
    • 새로운 커밋 개체를 생성하고, 스냅샷을 저장소에 기록합니다.
    • 커밋 메시지와 함께 작성자 정보, 타임스탬프 등을 포함합니다.
  4. git log

    • 저장소의 커밋 기록을 표시합니다.
    • 각 커밋의 해시, 작성자, 날짜, 메시지 등을 보여줍니다.
  5. git status

    • 현재 작업 디렉토리와 인덱스의 상태를 표시합니다.
    • 스테이지된 파일과 변경된 파일, 추적되지 않은 파일 등을 보여줍니다.

4. Git의 데이터 무결성

Git은 SHA-1 해시를 사용하여 모든 데이터의 무결성을 보장합니다. 각 개체(Blob, Tree, Commit, Tag)는 SHA-1 해시로 식별되며, 데이터가 변경되면 해시도 변경됩니다. 이를 통해 Git은 데이터 손상이나 변조를 방지하고, 데이터의 일관성을 유지할 수 있습니다.

5. Git의 주요 원리

Git의 작동 원리는 데이터의 스냅샷을 지속적으로 저장하고 추적하는 것입니다. 각 커밋은 파일 시스템의 전체 스냅샷을 저장하지만, 효율성을 위해 실제로는 변경된 부분만 저장합니다. 이를 통해 Git은 매우 빠르고 효율적으로 동작할 수 있습니다.

Git 개체 모델 예제

Blob 개체 생성

$ git init test
$ cd test
$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4
  • git hash-object 명령은 데이터를 저장하고 접근할 수 있는 키(SHA-1 해시)를 반환합니다.
  • Blob 개체는 파일의 내용만 저장하며, 메타데이터는 포함하지 않습니다.

Tree 개체 생성

Tree 개체는 여러 Blob 개체나 다른 Tree 개체를 참조합니다. 디렉토리 구조와 파일 이름을 저장합니다.

$ echo 'version 1' > test.txt
$ git update-index --add --cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt
$ git write-tree
d8329fc1cc938780ffdd9f94e0d364e0ea74f579
  • git update-index 명령은 파일을 인위적으로 스테이징 영역에 추가합니다.
  • git write-tree 명령은 스테이징 영역의 상태를 Tree 개체로 저장합니다.

Commit 개체 생성

Commit 개체는 특정 시점의 Tree 개체를 가리키고, 변경 사항의 메타데이터를 저장합니다.

$ echo 'first commit' | git commit-tree d8329f
fdf4fc3344e67ab068f836878b6c4951e3b15f3d
  • git commit-tree 명령은 커밋 메시지와 Tree 개체를 받아 새로운 커밋 개체를 생성합니다.
  • 커밋 개체는 부모 커밋, 작성자, 타임스탬프, 커밋 메시지를 포함합니다.
인용

Git의 내부 - Git 개체

git 간편 안내서

The git object model

0개의 댓글