DaleSchool

Git과 버전 관리

입문20분

학습 목표

  • 버전 관리 시스템이 필요한 이유를 설명할 수 있다
  • Git을 설치하고 초기 설정을 완료할 수 있다
  • git init으로 새 저장소를 만들 수 있다
  • git status 출력의 의미를 이해할 수 있다

동작하는 코드

예제 1: Git 설치 확인과 설정

Git이 설치되어 있는지 확인:

git --version

출력 예시:

git version 2.43.0

버전이 2.x 이상이면 됩니다. 없다면 설치:

# macOS
brew install git

# 확인
git --version

초기 설정 (처음 한 번만, 모든 프로젝트에 적용):

git config --global user.name "홍길동"
git config --global user.email "hong@example.com"

예제 2: 첫 저장소 만들기

mkdir my-project
cd my-project
git init

출력:

Initialized empty Git repository in /Users/dale/my-project/.git/

예제 3: git status로 상태 파악

git status

출력:

On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

파일을 만들고 다시 확인:

echo "# 나의 첫 프로젝트" > README.md
git status

출력:

On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md

nothing added to commit but untracked files present

Untracked files는 Git이 아직 추적하지 않는 파일입니다. 빨간색으로 표시됩니다.

직접 수정하기

git status 색상 의미

git status

출력 색상:

  • 빨간색: 추적 안 됨(Untracked) 또는 수정됐지만 스테이징 안 됨
  • 초록색: 스테이징된 파일 (커밋 대기 중)
# 파일 추가
echo "첫 번째 파일" > file1.txt
echo "두 번째 파일" > file2.txt
git status

출력:

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md
	file1.txt
	file2.txt
# 하나를 스테이징
git add README.md
git status

출력:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   README.md    ← 초록색

Untracked files:
	file1.txt                ← 빨간색
	file2.txt

HEAD란?

HEAD현재 내가 작업 중인 위치를 가리키는 포인터입니다.

커밋 A → 커밋 B → 커밋 C
                       ↑
                      HEAD (현재 위치)

지금은 커밋이 없으므로 HEAD가 가리킬 곳이 없습니다. 첫 커밋 후부터 사용됩니다.

"왜?" — 버전 관리가 없다면?

버전 관리 없이 개발하면 이런 일이 생깁니다:

  • project_final.zip, project_final_v2.zip, project_final_진짜최종.zip
  • "어제까지 잘 됐는데 오늘 갑자기 안 됨" → 무엇을 바꿨는지 모름
  • 팀원이 같은 파일을 수정해서 충돌 → 누군가의 작업이 사라짐

Git은 이 모든 문제를 해결합니다:

| 문제 | Git 해결책 | | ---------------------- | --------------------------- | | 파일 여러 버전 관리 | 커밋으로 스냅샷 저장 | | 무엇이 바뀌었나? | git diff로 변경 내역 확인 | | 이전 버전으로 되돌리기 | 커밋 히스토리에서 복원 | | 팀 협업 충돌 | 브랜치와 머지로 충돌 관리 |

Git의 세 가지 영역

작업 디렉토리 → (git add) → 스테이징 영역 → (git commit) → 저장소
(Working Dir)              (Staging Area)              (Repository)
  • 작업 디렉토리: 실제 파일이 있는 곳
  • 스테이징 영역: 다음 커밋에 포함할 변경사항을 모아두는 곳
  • 저장소(Repository): 커밋 히스토리가 저장된 곳 (.git 디렉토리)

흔한 실수

실수 1: git config 설정 잊기

git commit   # 설정 없이 시도
# Author identity unknown
# Please tell me who you are.

반드시 이름과 이메일을 먼저 설정하세요:

git config --global user.name "이름"
git config --global user.email "이메일"

실수 2: 프로젝트 안에서 git init을 중복으로 실행

cd ~/projects/myapp
git init

# 실수로 하위 디렉토리에서 또 실행
cd src
git init   # 저장소 안에 저장소가 생성됨 (중첩 저장소)

git init은 프로젝트 최상위 디렉토리에서 한 번만 실행하세요.

실수 3: .git 디렉토리 삭제

# 절대 하지 마세요!
rm -rf .git   # 모든 Git 히스토리가 사라짐

.git 디렉토리는 Git의 데이터베이스입니다. 삭제하면 복구가 불가능합니다.

심화 학습

git config 설정 확인 및 관리

설정한 내용은 ~/.gitconfig에 저장됩니다:

git config --list

출력:

user.name=홍길동
user.email=hong@example.com
core.editor=vim

항목별 확인:

git config user.name
# 홍길동

# 전역 설정 파일 직접 보기
cat ~/.gitconfig

프로젝트마다 다른 설정 (로컬 설정):

# 특정 프로젝트에서만 다른 이메일 사용
git config user.email "work@company.com"  # --global 없으면 프로젝트 전용
.git 디렉토리 내부 구조

git init.git 숨김 디렉토리를 만듭니다:

ls .git/

출력:

HEAD        config      description hooks/      info/       objects/    refs/

주요 파일:

  • HEAD: 현재 브랜치를 가리키는 포인터
  • config: 이 저장소의 설정
  • objects/: 실제 커밋, 파일, 트리 데이터 (SHA-1 해시로 저장)
  • refs/: 브랜치, 태그 포인터

이 구조를 이해하면 Git이 "어떻게" 동작하는지 알 수 있습니다.

기본 브랜치 이름 설정 (main vs master)

최근 Git은 기본 브랜치를 main으로 바꾸는 추세입니다:

# 새 저장소의 기본 브랜치를 main으로 설정
git config --global init.defaultBranch main

이미 master로 만들어진 저장소:

# master를 main으로 이름 변경
git branch -m master main
  1. 터미널에서 git --version으로 Git이 설치되어 있는지 확인하세요.
  2. git config --global user.name "이름"git config --global user.email "이메일"로 설정하세요.
  3. 새 디렉토리를 만들고 git init으로 저장소를 초기화하세요.
  4. README.md를 만든 후 git status로 상태를 확인하세요. 빨간색과 초록색 항목이 각각 무엇을 의미하는지 생각해보세요.
  5. git config --list로 현재 설정을 모두 확인하세요.

Q1. git status에서 빨간색 파일과 초록색 파일의 차이는?

  • A) 빨간색=삭제된 파일, 초록색=새 파일
  • B) 빨간색=스테이징 안 됨, 초록색=스테이징된 파일
  • C) 빨간색=충돌 파일, 초록색=정상 파일
  • D) 빨간색=바이너리 파일, 초록색=텍스트 파일