.git
디렉토리 구조 개요git init
을 실행하면 .git/
내부에 다양한 파일과 디렉토리가 생성된다. Git은 이 내부 구조를 기반으로 버전 관리, 브랜치, 커밋 이력 등을 추적한다.
.git/
├── HEAD
├── config
├── description
├── hooks/
├── info/
├── objects/
├── refs/
경로 | 설명 |
---|---|
.git/HEAD | 현재 체크아웃된 브랜치를 가리킴 (ref: refs/heads/main ) |
.git/config | 저장소 단위 설정 (user, core, remote 등) |
.git/description | bare 저장소용 설명 (로컬에서는 무시됨) |
.git/hooks/ | Git 이벤트 발생 시 실행되는 스크립트 모음 |
.git/info/exclude | 개인용 .gitignore 설정 파일 |
.git/objects/ | 실제 Git 객체(blob, tree, commit, tag 등) 저장 공간 |
.git/refs/ | 브랜치와 태그의 참조 정보 저장 |
ref: refs/heads/<브랜치명>
형태Detached HEAD
상태일 경우 직접 커밋 해시를 가리킴Q: HEAD가 무엇을 의미하나?
HEAD는 현재 작업 중인 브랜치 또는 커밋을 참조하는 포인터다. 대부분 브랜치를 참조하지만, checkout으로 특정 커밋을 가리킬 수도 있다.
Git에서 브랜치나 태그는 단순한 텍스트 파일이며, 내부에는 특정 커밋의 SHA-1 해시가 들어 있다.
refs/heads/
→ 로컬 브랜치refs/remotes/origin/
→ 원격 브랜치refs/tags/
→ 태그 참조cat .git/refs/heads/main
5198337ce609698b6783fc67c22c22e2fbcf1887
Q:
refs/heads/main
과refs/remotes/origin/main
의 차이는?
refs/heads/main
: 내 로컬 브랜치refs/remotes/origin/main
: fetch 시 받아온 원격 저장소 상태 (읽기 전용)Q:
logs/refs/heads/main
과logs/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>/
디렉토리가 생성된다.
.git/index
: 스테이징 영역git add
하면 파일의 blob 해시가 index에 기록됨git commit
은 index의 상태를 기반으로 tree 객체를 생성함git ls-files --stage
Q: index는 언제 생기고, 어떻게 동작하나?
git add
시 기록됨Q: commit하면 index는 초기화되나?
❌ 아니다. index는 그대로 유지되며 HEAD와 동기화된 상태가 된다.
Q: reset 명령은 index에도 영향을 미치나?
✅ git reset --mixed
, --hard
는 index를 과거 커밋 상태로 되돌린다. --soft
는 HEAD만 이동시키고 index는 그대로다.