Git 내부: 객체와 해싱

Git은 데이터를 저장하는 방식 덕분에 빠르고 신뢰할 수 있습니다. Git을 마스터하려면 .git 디렉토리를 이해해야 합니다. 이 숨겨진 폴더에는 Git이 프로젝트를 추적하는 데 필요한 모든 것이 들어 있습니다.

Git은 작업을 관리하기 위해 네 가지 주요 객체 유형을 사용합니다:

  • Blobs: 파일 내용을 저장합니다.
  • Trees: 디렉토리 구조와 파일 이름을 저장합니다.
  • Commits: 프로젝트의 스냅샷과 메타데이터를 저장합니다.
  • Tags: 특정 버전에 대한 참조를 저장합니다.

Git은 해싱을 사용하여 모든 것을 식별합니다. SHA-1 알고리즘을 사용하여 데이터를 고유한 ID로 변환합니다. 이 ID는 지문 역할을 합니다. 파일에서 문자 하나만 바꿔도 해시는 완전히 달라집니다.

Git이 스냅샷을 생성하는 방식:

파일을 커밋하면 Git은 객체 체인을 생성합니다.

  1. Blob은 파일의 실제 텍스트나 데이터를 저장합니다.
  2. Tree는 해당 blob을 특정 파일 이름 및 폴더 경로에 매핑합니다.
  3. Commit은 tree를 작성자, 타임스탬프 및 메시지와 연결합니다.

Git은 변경 사항이나 "deltas"를 저장하지 않습니다. 대신 스냅샷을 저장합니다. 커밋할 때마다 Git은 새로운 객체를 생성합니다. 이 덕분에 히스토리는 불변(immutable)하며 복구가 용이합니다.

이러한 구조를 이해하면 오류를 수정하고, 손실된 데이터를 복구하며, 복잡한 브랜치를 관리하는 데 도움이 됩니다.

실제로 어떻게 작동하는지 확인하기 위해 이 미니 프로젝트를 시도해 보세요:

  1. 저장소 초기화: mkdir git-lab cd git-lab git init

  2. 파일 생성 및 해시 찾기: echo 'Hello Git' > hello.txt git hash-object hello.txt

  3. 파일을 blob으로 저장: git hash-object -w hello.txt

  4. 객체 유형 및 내용 확인: git cat-file -t [YOUR_HASH] git cat-file -p [YOUR_HASH]

  5. 커밋 생성 및 tree 확인: git add hello.txt git commit -m 'Initial commit' git ls-tree HEAD

내부를 들여다보면 Git이 단순한 버전 관리 도구 그 이상임을 알 수 있습니다. Git은 콘텐츠 주소 지정(content-addressed) 객체로 구성된 매우 체계적인 데이터베이스입니다.

출처: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc

선택 사항 학습 커뮤니티: https://t.me/GyaanSetuAi