Git 내부: 작동 원리와 .git 폴더의 역할
Source: Dev.to

대부분의 개발자는 git init, git add, git commit 같은 명령어를 매일 사용하지만, 실제로 Git이 내부에서 이러한 커밋을 어떻게 처리하는지는 잘 모릅니다.
이 블로그에서는 Git 내부를 살펴보고, Git이 내부적으로 어떻게 작동하는지 확인한 뒤, .git 폴더의 중요한 역할을 탐구해 보겠습니다.
Git이란? (간단 요약)
Git은 개발자들이 변경 사항을 추적하고, 협업하며, 프로젝트 히스토리를 효율적으로 관리할 수 있게 해주는 버전 관리 시스템입니다.
Git에 대해 더 알고 싶다면, 이 블로그도 읽어보세요. 👇
Git 작동 방식 (내부 보기)
Git은 세 가지 주요 영역에서 작동합니다:
- Working Directory – 실제 프로젝트 파일입니다.
- Staging Area – 변경 사항을 준비하는 곳입니다.
- Repository – Git이 스냅샷을 영구적으로 저장하는 곳입니다.
커밋을 할 때마다 Git은:
- 추적된 모든 파일의 스냅샷을 찍습니다.
- 이를
.git디렉터리 안에 안전하게 저장합니다. - 커밋들을 서로 연결합니다.

Source: …
Git의 핵심: .git 폴더
git init 명령을 실행하면:
git init
Git은 프로젝트 루트 안에 숨김 폴더를 생성합니다. 실제로 존재하지만 파일 탐색기에서는 보이지 않습니다.
👉 이 폴더는 Git 전체의 두뇌와 같습니다.
삭제하면 프로젝트는 더 이상 Git 저장소가 아닙니다.
.git 폴더 안에는 무엇이 있을까?
명령줄에서도 확인할 수 있습니다:
cd .git
ls -la
objects/ – 모든 데이터가 저장되는 곳
이 디렉터리에는 커밋, 파일, 디렉터리 구조 등 모든 Git 데이터가 들어 있습니다.

- Commit objects – 특정 시점의 저장소 스냅샷.
- Tree objects – 디렉터리 계층 구조를 나타냅니다.
- Blob objects – 파일 내용을 저장합니다.
Note:
git log는 커밋 객체만 보여 주지만,.git/objects에는 트리와 블롭도 포함되어 있어 커밋보다 더 많은 디렉터리를 볼 수 있습니다.
refs/ – 브랜치와 태그 포인터
이 폴더는 브랜치와 태그에 대한 참조를 보관합니다.

- Branches (
refs/heads) – 각 브랜치의 최신 커밋을 가리킵니다. - Tags (
refs/tags) – 특정 커밋을 표시합니다.
각 브랜치는 단순히 커밋 해시를 가리키는 포인터일 뿐입니다.

HEAD – 현재 위치를 알려 줍니다
HEAD 파일은 Git에게 다음을 알려 줍니다:
- 현재 체크아웃된 브랜치.
- 현재 체크아웃된 커밋.

index – 스테이징 영역
index(또는 스테이징 영역)는 다음을 저장합니다:
git add로 추가한 파일들.- 다음 커밋이 될 정확한 스냅샷.
작업 디렉터리와 저장소 사이의 다리 역할을 합니다.
config – 저장소 설정
config 파일에는 다음이 포함됩니다:
- 원격 URL.
- 사용자 설정(이름, 이메일).
- 저장소 전용 설정.

TL;DR
- Git은 모든 것을 숨겨진
.git디렉터리에 저장합니다. objects/는 원시 데이터(커밋, 트리, 블롭)를 보관합니다.refs/는 브랜치와 태그를 추적합니다.HEAD는 현재 브랜치/커밋을 가리킵니다.index는 스테이징 영역입니다.config는 저장소 설정을 담고 있습니다.
이 구성 요소들을 이해하면 Git이 변경 사항을 추적하는 방식과 git commit, git checkout, git push 같은 작업이 작동하는 원리를 알 수 있습니다. 즐거운 커밋 되세요! 🚀
기본 워크플로우
# Initialize a git repository
git init
# Stage changes
git add .
# Commit the staged changes
git commit -m "message"
Git이 수행하는 작업
- 리포지토리 초기화는
.git디렉터리를 생성합니다. git add는 스테이징된 파일들을.git/objects/안에 blob 객체로 저장합니다.git commit -m "message"는 디렉터리 구조를 나타내는 tree 객체를 생성합니다.- 그 후 Git은 다음을 포함하는 commit 객체를 만듭니다:
- 루트 트리에 대한 포인터.
- 부모 커밋에 대한 포인터(있는 경우).
- 작성자와 커밋터 정보.
- 타임스탬프.
- 커밋 메시지.

이미지 출처: freeCodeCamp
최종 생각
Git은 겉보기에는 단순해 보이지만, 내부적으로는 강력한 데이터베이스입니다.
.git 폴더는 단순한 설정 폴더가 아니라; 프로젝트의 전체 히스토리와 구조를 포함하고 있습니다.
읽어 주셔서 감사합니다! 이 글이 마음에 드셨다면 아래 주제들을 더 읽어볼 수 있습니다:
