01-01 Git 개념과 동작 원리

Git이 무엇이고 내부적으로 어떻게 동작하는지 — 스냅샷 모델과 4개 영역을 이해하면 모든 명령이 쉬워진다.


Git이 무엇이고 내부적으로 어떻게 동작하는지 — 스냅샷 모델과 4개 영역을 이해하면 모든 명령이 쉬워진다.

목표: “지금 내 변경이 어느 영역에 있는지” 항상 머릿속에 그릴 수 있는 수준


🎯 Git이란

분산 버전 관리 시스템(DVCS, Distributed Version Control System). 모든 개발자가 전체 히스토리를 담은 저장소 복제본을 가진다.

graph TB
    subgraph "중앙집중식 (SVN)"
        CS["중앙 서버"] --- C1["작업본"]
        CS --- C2["작업본"]
    end
    subgraph "분산식 (Git)"
        R["원격"] --- L1["전체 복제본 + 히스토리"]
        R --- L2["전체 복제본 + 히스토리"]
    end
구분중앙집중식(SVN)분산식(Git)
히스토리서버에만모든 복제본
오프라인 작업제한적완전 가능
속도네트워크 의존로컬에서 빠름
브랜치무거움가볍고 빠름

📸 핵심: Git은 “스냅샷”을 저장한다

대부분의 VCS는 파일별 변경분(delta) 을 저장한다. Git은 다르다 — 매 커밋마다 프로젝트 전체의 스냅샷을 찍는다.

graph LR
    subgraph "커밋마다 스냅샷"
        C1["Commit 1<br/>A B C"] --> C2["Commit 2<br/>A B' C"]
        C2 --> C3["Commit 3<br/>A B' C'"]
    end
  • 바뀐 파일만 새로 저장하고, 안 바뀐 파일은 이전 스냅샷을 가리키는 포인터만 남긴다 → 공간 효율적
  • 그래서 브랜치 전환·히스토리 탐색이 매우 빠르다

🗂️ 4개의 영역

graph LR
    WD["💻 Working Directory<br/>(작업 디렉토리)"] -->|"git add"| STAGE["📋 Staging Area<br/>(Index)"]
    STAGE -->|"git commit"| REPO["📦 Local Repository<br/>(.git)"]
    REPO -->|"git push"| REMOTE["🌐 Remote"]
    REMOTE -->|"git fetch"| REPO
    REPO -->|"git checkout"| WD
영역의미확인
Working Directory실제 편집 중인 파일들git status
Staging Area (Index)다음 커밋에 담을 변경을 모아두는 곳git diff --staged
Local Repository커밋된 히스토리 (.git 폴더)git log
Remote원격 공유 저장소git remote -v

[!tip] Staging Area가 핵심 다른 VCS에 없는 Git만의 중간 단계. 작업한 변경 중 일부만 골라 커밋할 수 있게 해준다(git add -p). 커밋을 논리적 단위로 쪼개는 힘의 원천.


🔑 핵심 용어

용어설명
commit스냅샷 + 메타데이터(작성자/시간/메시지/부모). SHA-1 해시로 식별
HEAD현재 위치(보통 현재 브랜치의 최신 커밋)를 가리키는 포인터
branch특정 커밋을 가리키는 움직이는 포인터 (커밋하면 따라 이동)
tag특정 커밋을 가리키는 고정 포인터 (보통 릴리스 버전)
origin기본 원격 저장소의 관례적 이름
graph RL
    C1["C1"] --> C0["C0"]
    C2["C2"] --> C1
    C3["C3"] --> C2
    MAIN["main"] -.-> C3
    HEAD["HEAD"] -.-> MAIN
    FEAT["feature"] -.-> C2

각 커밋은 부모 커밋을 가리키며 사슬을 이룬다. 브랜치는 그 사슬 위의 한 지점을 가리키는 이름표일 뿐이다.


⚙️ 설치와 초기 설정

설치 확인

git --version

필수 설정 (커밋에 기록됨)

git config --global user.name "Jongmin"
git config --global user.email "you@example.com"

권장 설정

git config --global init.defaultBranch main     # 기본 브랜치명
git config --global core.editor "code --wait"   # 커밋 메시지 에디터
git config --global core.autocrlf true          # Windows 줄바꿈
git config --global core.autocrlf input         # mac/Linux 줄바꿈
git config --global pull.rebase true            # pull 시 rebase

설정 확인

git config --list --show-origin    # 각 설정의 출처 파일까지

설정 범위 우선순위: --local(저장소) > --global(사용자) > --system(전체)


📋 체크리스트

  • 분산 VCS의 의미와 장점 설명
  • “스냅샷 vs 변경분(delta)” 차이 이해
  • 4개 영역과 변경이 흐르는 방향
  • Staging Area의 존재 이유
  • commit/HEAD/branch/tag 관계 그리기
  • user.name/email 설정 완료
  • config 범위 우선순위 이해

🔗 관련 노트

  • 00-MOC-Git — Git 노트 지도
  • 01-02-기본-명령어와-워크플로우 — 다음: 실제 명령어
  • 03-01-Git-내부-객체-모델 — 심화: 스냅샷의 실제 저장 방식

마지막 업데이트: 2026-06-02