리눅스/리눅스 응용

Git의 작업 메커니즘

easyfly 2025. 6. 26. 16:30
반응형

Git의 작업 메커니즘

Git이 정교하고 복잡한 작업(예: 브랜치 간 차이 비교, 변경 추적, 되돌리기 등)을 수행할 수 있는 이유는, Git 내부에 데이터를 저장하고 비교하는 독특한 메커니즘이 존재하기 때문입니다. 그 핵심 메커니즘을 이해하면 Git의 능력이 왜 탁월한지 쉽게 이해할 수 있습니다.

Git diff를 이용한 브랜치 비교


✅ Git이 복잡한 작업을 가능하게 하는 핵심 메커니즘

1. 🔐 스냅샷 기반 저장 (Snapshot Model)

  • Git은 변경 내용을 기록할 때, 파일 전체의 스냅샷을 저장합니다.
  • 매 커밋마다 전체 프로젝트의 상태를 저장하지만, 변경되지 않은 파일은 이전 스냅샷을 참조하므로 저장 공간을 효율적으로 사용합니다.
  • 즉, **차이(diff)**가 아니라, **그 순간의 전체 상태(스냅샷)**가 기록됩니다.
커밋 A → 커밋 B → 커밋 C
   ↓         ↓         ↓
스냅샷 A  스냅샷 B  스냅샷 C

2. 🧬 SHA-1 해시 기반의 데이터 구조

  • Git의 모든 객체(커밋, 트리, 블롭 등)는 고유한 SHA-1 해시로 식별됩니다.
  • 이 해시는 내용 기반이므로 내용이 바뀌지 않으면 해시도 바뀌지 않습니다.
  • 이를 통해 Git은 정확하고 빠르게 변경 여부를 감지할 수 있습니다.

예:

git hash-object file.txt

이 명령으로 파일의 해시를 직접 확인할 수 있습니다.


3. 🌲 트리(Tree)와 블롭(Blob) 구조

  • Git 내부는 리눅스의 파일시스템처럼 동작합니다:
    • 블롭 (blob) = 파일의 실제 내용
    • 트리 (tree) = 폴더와 파일의 목록 및 구조
    • 커밋 (commit) = 하나의 트리를 가리키고, 메시지·작성자·이전 커밋 등을 포함
commit
 └── tree
      ├── file1 (blob)
      ├── file2 (blob)
      └── subdir (tree)
              └── file3 (blob)

4. 🧠 브랜치와 머지 (Branch & Merge) 전략

  • 브랜치는 단순히 커밋의 포인터입니다.
  • Git은 브랜치를 새로 만들거나, 병합(merge)하는 것이 매우 가볍고 빠릅니다.
  • git diff는 두 커밋 간 트리 구조를 비교하여 차이를 계산합니다.
git diff branch1..branch2

→ branch1이 가리키는 트리 vs. branch2가 가리키는 트리를 비교


5. 🕹️ 변경 이력 추적과 되돌리기 (Reflog, Reset, Revert)

  • Git은 HEAD의 이동 이력까지 추적합니다 (git reflog).
  • 실수로 브랜치나 커밋을 되돌려도 되살릴 수 있는 구조가 내장되어 있습니다.

✅ 정리: Git이 가능한 이유

요소 기능
스냅샷 저장 파일의 상태를 전체 저장하여 비교와 복구가 쉬움
SHA-1 해시 내용 추적 및 변경 감지를 정확하게 처리
트리/블롭 구조 폴더 및 파일 구조를 효율적으로 관리
브랜치 = 포인터 빠르고 가벼운 브랜치 관리 가능
이력 추적 실수도 되돌릴 수 있는 강력한 복구 기능

📌 비유

Git은 “파일 백업기”가 아니라,
파일 시스템 전체의 시간 여행 머신”이라고 보면 됩니다.