Git 내부 정리 Part 2: .git 디렉토리 구조 및 참조 시스템

JunHyeok Seo·2025년 4월 30일
0

git

목록 보기
2/3

1. .git 디렉토리 구조 개요

git init을 실행하면 .git/ 내부에 다양한 파일과 디렉토리가 생성된다. Git은 이 내부 구조를 기반으로 버전 관리, 브랜치, 커밋 이력 등을 추적한다.

.git/
├── HEAD
├── config
├── description
├── hooks/
├── info/
├── objects/
├── refs/

2. 주요 구성 요소 설명

경로설명
.git/HEAD현재 체크아웃된 브랜치를 가리킴 (ref: refs/heads/main)
.git/config저장소 단위 설정 (user, core, remote 등)
.git/descriptionbare 저장소용 설명 (로컬에서는 무시됨)
.git/hooks/Git 이벤트 발생 시 실행되는 스크립트 모음
.git/info/exclude개인용 .gitignore 설정 파일
.git/objects/실제 Git 객체(blob, tree, commit, tag 등) 저장 공간
.git/refs/브랜치와 태그의 참조 정보 저장

3. HEAD의 역할

  • HEAD는 현재 작업 중인 커밋 혹은 브랜치를 가리키는 포인터
  • 보통 ref: refs/heads/<브랜치명> 형태
  • Detached HEAD 상태일 경우 직접 커밋 해시를 가리킴

▶ 관련 질문 요약

Q: HEAD가 무엇을 의미하나?

HEAD는 현재 작업 중인 브랜치 또는 커밋을 참조하는 포인터다. 대부분 브랜치를 참조하지만, checkout으로 특정 커밋을 가리킬 수도 있다.


4. refs 시스템: 브랜치와 태그의 실체

Git에서 브랜치나 태그는 단순한 텍스트 파일이며, 내부에는 특정 커밋의 SHA-1 해시가 들어 있다.

  • refs/heads/ → 로컬 브랜치
  • refs/remotes/origin/ → 원격 브랜치
  • refs/tags/ → 태그 참조

예시:

cat .git/refs/heads/main
5198337ce609698b6783fc67c22c22e2fbcf1887

▶ 관련 질문 요약

Q: refs/heads/mainrefs/remotes/origin/main의 차이는?

  • refs/heads/main: 내 로컬 브랜치
  • refs/remotes/origin/main: fetch 시 받아온 원격 저장소 상태 (읽기 전용)

Q: logs/refs/heads/mainlogs/HEAD 차이는?

  • logs/HEAD: HEAD의 이동 기록
  • logs/refs/heads/main: main 브랜치가 어떤 커밋을 가리켰는지의 이력

Q: origin 외 다른 remote가 생길 수 있나?

✅ 가능하다. git remote add <name> <url> 혹은 git clone -o <name> <url>로 추가하면 refs/remotes/<name>/ 디렉토리가 생성된다.


5. .git/index: 스테이징 영역

  • Git에서 커밋 전 파일을 잠시 보관하는 공간 (staging area)
  • git add 하면 파일의 blob 해시가 index에 기록됨
  • git commit은 index의 상태를 기반으로 tree 객체를 생성함
git ls-files --stage

▶ 관련 질문 요약

Q: index는 언제 생기고, 어떻게 동작하나?

  • 저장소 생성 시 파일로 존재하지만, 실질적인 데이터는 git add 시 기록됨
  • index는 파일 경로 → blob 해시 매핑을 담고 있음

Q: commit하면 index는 초기화되나?

❌ 아니다. index는 그대로 유지되며 HEAD와 동기화된 상태가 된다.

Q: reset 명령은 index에도 영향을 미치나?

git reset --mixed, --hard는 index를 과거 커밋 상태로 되돌린다. --soft는 HEAD만 이동시키고 index는 그대로다.


0개의 댓글