01. Git이란 무엇인가 — 버전 관리의 기초
- "버전 관리"가 무엇이고 왜 필요한지 일상의 비유로 이해한다
- Git이 다른 버전 관리 도구와 무엇이 다른지 안다
- Git의 핵심 특징 4가지를 설명할 수 있다
1.1 버전(Version)이란 무엇일까요?
게임을 하다가 보스를 만나기 직전에 세이브를 해본 적 있나요? 보스에게 지면 마지막 세이브 지점으로 돌아갑니다. 만약 세이브가 없다면 게임을 처음부터 다시 해야겠죠.
버전 관리(Version Control)란 이 "세이브 포인트"를 코드에 적용하는 것입니다.
일상에서의 버전 관리
우리는 이미 일상에서 버전 관리를 하고 있습니다. 다음 파일 이름이 익숙하지 않나요?
졸업논문.docx 졸업논문_최종.docx 졸업논문_최종_진짜최종.docx 졸업논문_최종_교수님피드백반영_v3.docx 졸업논문_최종_이게진짜마지막.docx
😅 누구나 한 번쯤 해본 경험입니다. 이 방식의 문제는 다음과 같습니다.
| 수동 버전 관리의 문제 | 설명 |
|---|---|
| 무엇이 바뀌었는지 모른다 | v2와 v3의 차이를 일일이 비교해야 함 |
| 누가 바꿨는지 모른다 | 여러 명이 작업하면 추적 불가 |
| 언제 바꿨는지 모른다 | 파일 이름에 의존 |
| 되돌리기 어렵다 | 어떤 파일이 "그때 그 버전"인지 헷갈림 |
| 디스크 낭비 | 거의 같은 파일이 수십 개 |
Git은 이 모든 문제를 자동으로, 깔끔하게 해결합니다. 파일은 하나만 두고, "변경 이력"만 따로 차곡차곡 쌓아두는 방식이죠.
1.2 버전 관리 시스템(VCS)의 발전
버전 관리 도구는 세 단계로 발전해 왔습니다.
① 로컬 버전 관리 — 내 컴퓨터에만
초기에는 한 컴퓨터 안에서만 버전을 관리했습니다. 컴퓨터가 고장 나면 모든 이력이 사라지는 단점이 있었습니다.
② 중앙 집중식 버전 관리 (CVCS) — 서버 한 대에 몰아넣기
SVN(Subversion), CVS 같은 도구가 대표적입니다.
flowchart TD
S["🖥️ 중앙 서버<br/>(모든 이력이 여기에만)"]
A["👤 개발자 A<br/>(현재 버전만)"]
B["👤 개발자 B<br/>(현재 버전만)"]
C["👤 개발자 C<br/>(현재 버전만)"]
S --- A
S --- B
S --- C
classDef server fill:#fee2e2,stroke:#dc2626,color:#991b1b
classDef dev fill:#e0e7ff,stroke:#4f46e5,color:#3730a3
class S server
class A,B,C dev
- 장점: 모두가 한 곳을 바라보니 관리가 단순
- 단점: 중앙 서버가 죽으면 작업 불가, 인터넷 없으면 커밋 불가
③ 분산 버전 관리 (DVCS) — Git의 방식
flowchart TD
R["☁️ 원격 서버 (GitHub 등)"]
A["👤 개발자 A<br/>📚 전체 이력"]
B["👤 개발자 B<br/>📚 전체 이력"]
C["👤 개발자 C<br/>📚 전체 이력"]
R <--> A
R <--> B
R <--> C
classDef server fill:#dcfce7,stroke:#16a34a,color:#166534
classDef dev fill:#dbeafe,stroke:#2563eb,color:#1e40af
class R server
class A,B,C dev
Git은 모든 개발자가 전체 이력의 완전한 복사본을 가집니다. 이것이 Git의 가장 큰 특징입니다.
- 서버가 죽어도 누군가의 컴퓨터에 전체 이력이 그대로 있음 (자동 백업)
- 인터넷 없이도 커밋, 브랜치, 이력 조회 가능 (오프라인 작업)
- 매우 빠름 (대부분의 작업이 내 컴퓨터에서 일어남)
1.3 Git의 탄생 (짧은 역사)
Git은 2005년, 리눅스를 만든 리누스 토르발스(Linus Torvalds)가 리눅스 커널 개발을 관리하기 위해 만들었습니다. 기존 도구들이 느리고 불편해서 직접 만들어버린 것이죠. 2025년에 Git은 탄생 20주년을 맞이했고, 오늘날 전 세계에서 가장 널리 쓰이는 버전 관리 시스템이 되었습니다.
많은 입문자가 헷갈립니다.
- Git: 버전 관리 프로그램 (내 컴퓨터에서 동작)
- GitHub: Git 저장소를 온라인에 보관해주는 웹 서비스 (회사)
비유하자면 Git은 "워드 프로그램"이고, GitHub는 "구글 드라이브" 같은 저장 공간입니다. GitHub 외에도 GitLab, Bitbucket 등이 있습니다.
1.4 Git의 핵심 특징 4가지
특징 ① 스냅샷(Snapshot) 방식
대부분의 버전 관리 도구는 "무엇이 바뀌었는가(차이, delta)"를 저장합니다. 하지만 Git은 매 순간의 "전체 사진(스냅샷)"을 찍어 저장합니다.
일반 도구 (차이 저장): 파일1 → +3줄 → -1줄 → +5줄 ... Git (스냅샷 저장): 📸 → 📸 → 📸 → 📸 (각 순간의 전체 상태)
단, 바뀌지 않은 파일은 새로 저장하지 않고 이전 파일을 그대로 가리키기(링크)만 하므로 공간 낭비가 없습니다. 똑똑하죠.
특징 ② 무결성 보장 (체크섬)
Git은 모든 데이터를 저장하기 전에 체크섬(checksum)이라는 고유 지문을 계산합니다. 현재는 SHA-1 해시(40자리 16진수)를 사용합니다.
예: 24b9da6552252987aa493b52f8696cd6d3b00373
이 지문 덕분에 누군가 파일을 몰래 바꾸면 Git이 즉시 알아챕니다. 데이터가 절대 조용히 손상되지 않습니다.
특징 ③ 대부분의 작업이 로컬에서 일어남
커밋, 이력 조회, 브랜치 생성, 비교(diff) 등 거의 모든 작업이 내 컴퓨터 안에서 처리됩니다. 그래서 빠르고, 비행기 안에서도 작업할 수 있습니다.
특징 ④ 데이터를 거의 잃지 않는다
한번 커밋한 내용은 Git이 끈질기게 보관합니다. 실수로 지운 것 같아도 대부분 복구할 수 있습니다. (이 책의 "리셋/리버트" 장에서 배웁니다.)
1.5 Git의 세 가지 상태 (가장 중요한 개념!)
Git을 이해하는 핵심은 파일이 가질 수 있는 세 가지 상태를 이해하는 것입니다.
flowchart LR
M["✏️ 수정됨<br/>Modified<br/><small>워킹 디렉터리</small>"]
S["📦 스테이지됨<br/>Staged<br/><small>스테이지</small>"]
C["✅ 커밋됨<br/>Committed<br/><small>로컬 저장소</small>"]
M -- "git add" --> S
S -- "git commit" --> C
classDef m fill:#fef3c7,stroke:#d97706,color:#92400e
classDef s fill:#dbeafe,stroke:#2563eb,color:#1e40af
classDef c fill:#dcfce7,stroke:#16a34a,color:#166534
class M m
class S s
class C c
| 상태 | 영어 | 위치 | 의미 |
|---|---|---|---|
| 수정됨 | Modified | 워킹 디렉터리 | 파일을 고쳤지만 아직 Git에 알리지 않음 |
| 스테이지됨 | Staged | 스테이지(Index) | "이번에 이 변경을 커밋할게요" 라고 표시함 |
| 커밋됨 | Committed | 로컬 저장소 | 변경 이력이 영구히 저장됨 |
🍱 도시락 비유
- 워킹 디렉터리 = 부엌 (재료를 다듬는 곳, 자유롭게 수정)
- 스테이지 = 도시락통에 담기 (보낼 반찬을 골라 담음)
- 커밋 = 뚜껑 닫고 라벨 붙이기 (날짜·메뉴 기록하여 보관)
이 세 단계는 앞으로 계속 등장하니 꼭 기억하세요.
1.6 이 장에서 배운 것 (요약)
- 버전 관리는 코드의 "세이브 포인트"를 자동으로 관리하는 것이다.
- Git은 분산(Distributed) 버전 관리 시스템으로, 모든 개발자가 전체 이력을 가진다.
- Git ≠ GitHub: Git은 프로그램, GitHub는 저장 서비스다.
- Git의 4대 특징: 스냅샷 / 무결성(체크섬) / 로컬 작업 / 데이터 보존
- 파일은 수정됨 → 스테이지됨 → 커밋됨 세 상태를 거친다.
✍️ 확인 문제
- SVN과 Git의 가장 큰 구조적 차이는 무엇인가요?
- "졸업논문_진짜최종.docx" 방식이 가진 문제 3가지를 말해보세요.
- 파일의 세 가지 상태를 순서대로 나열해보세요.
다음 장에서는 실제로 Git을 설치하고 환경을 설정합니다. → 02_설치및환경설정.md