1단원 — 시작하기
버전 관리 없이 코드를 수정하면 "최최최최종.zip"처럼 파일이 쌓이는 경험을 누구나 해 봤을 것입니다. Git은 변경 이력을 스냅샷으로 저장해 언제든 과거로 돌아갈 수 있게 해 주는 도구이며, GitHub는 이 이력을 인터넷에 올려 여러 사람이 함께 작업할 수 있게 해 주는 플랫폼입니다.
이 강의에서 배우는 것
- 1Git을 설치하고 `user.name`·`user.email`을 전역으로 설정할 수 있다.
- 2`git init`으로 새 저장소를 만들고 첫 번째 커밋을 남길 수 있다.
- 3`git status`·`git log`·`git show`로 저장소 상태를 확인할 수 있다.
- 4GitHub 계정을 만들고 원격 저장소를 생성하는 흐름을 이해한다.
왜 Git인가
코드는 시간이 지나면서 계속 바뀝니다. Git은 "무엇을, 언제, 왜 바꿨는지"를 커밋 단위로 기록하기 때문에 실수를 되돌리거나 두 가지 아이디어를 동시에 실험하는 일이 쉬워집니다.
핵심 개념
1) Git 설치
Windows 설치 파일
| 도구 | 파일명 | 설명 | 공식 다운로드 |
|---|---|---|---|
| Git for Windows | `Git-2.52.0-64-bit.exe` | Git 명령줄 도구 + Git Bash 포함. Windows에서 git 명령을 실행하려면 반드시 설치해야 합니다. | git-scm.com/install/windows |
| TortoiseGit | `TortoiseGit-2.18.0.1-64bit.msi` | 윈도우 탐색기에 Git 기능을 통합하는 GUI 클라이언트. 커밋·로그·diff를 마우스로 다룰 수 있어 명령줄에 익숙하지 않을 때 유용합니다. Git for Windows 설치 후 사용하세요. | tortoisegit.org/download |
설치 순서 (Windows): Git for Windows → TortoiseGit 순서로 설치하세요. TortoiseGit은 Git for Windows를 백엔드로 사용하기 때문에 Git이 먼저 설치되어 있어야 합니다.
macOS / Linux
# macOS
brew install git
# Ubuntu / Debian
sudo apt update && sudo apt install git설치 후 버전 확인:
git --version
# git version 2.44.02) 전역 사용자 설정
모든 커밋에 남는 작성자 정보를 설정합니다.
git config --global user.name "홍길동"
git config --global user.email "gildong@example.com"
# 확인
git config --list --global| 옵션 | 범위 |
|---|---|
| `--global` | 현재 사용자의 모든 저장소 |
| `--local` | 현재 저장소만 (`.git/config`) |
| `--system` | 시스템 전체 |
3) 저장소 초기화 (`git init`)
mkdir my-project
cd my-project
git init
# Initialized empty Git repository in .../my-project/.git/`.git/` 폴더가 생기면 Git이 이 디렉토리를 관리하기 시작합니다.
4) 첫 번째 커밋
워킹 디렉토리 → (git add) → 스테이징 영역 → (git commit) → 저장소echo "# My Project" > README.md
git add README.md
git commit -m "docs: add README"5) 세 가지 영역
| 영역 | 설명 |
|---|---|
| 워킹 디렉토리 | 실제 파일이 있는 곳 |
| 스테이징 영역 | 커밋할 변경을 모아두는 임시 공간 |
| 저장소(`.git`) | 커밋 스냅샷이 영구 저장되는 곳 |
예제로 보기
예제 1 — `ex01_setup.sh` : Git 버전 확인 및 사용자 설정 출력
#!/usr/bin/env bash
set -euo pipefail
echo "=== Git 버전 확인 ==="
git --version
echo ""
echo "=== 현재 전역 사용자 설정 ==="
git config --global user.name || echo "(user.name 미설정)"
git config --global user.email || echo "(user.email 미설정)"**실행 결과**
=== Git 버전 확인 ===
git version 2.44.0
=== 현재 전역 사용자 설정 ===
홍길동
gildong@example.com핵심: `git config --global`로 저장된 값을 언제든 조회할 수 있다.
예제 2 — `ex02_init.sh` : 임시 디렉토리에서 저장소 초기화 후 첫 커밋
#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
echo "작업 디렉토리: $REPO"
cd "$REPO"
git init
git config user.name "실습용"
git config user.email "demo@example.com"
echo "# Hello Git" > README.md
git add README.md
git commit -m "chore: initial commit"
echo ""
echo "=== 커밋 목록 ==="
git log --oneline**실행 결과**
작업 디렉토리: /tmp/tmp.XyZ123
Initialized empty Git repository in /tmp/tmp.XyZ123/.git/
[main (root-commit) a1b2c3d] chore: initial commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
=== 커밋 목록 ===
a1b2c3d chore: initial commit핵심: `git init` → `git add` → `git commit` 세 단계가 Git의 기본 사이클이다.
예제 3 — `ex03_status.sh` : 워킹 디렉토리·스테이징·커밋 상태 관찰
#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
cd "$REPO"
git init -q
git config user.name "실습용" && git config user.email "demo@example.com"
echo "파일1" > a.txt
echo "[1] 파일 추가 후 status"
git status
git add a.txt
echo ""
echo "[2] git add 후 status"
git status
git commit -q -m "add a.txt"
echo ""
echo "[3] 커밋 후 status"
git status**실행 결과**
[1] 파일 추가 후 status
On branch main
Untracked files:
a.txt
[2] git add 후 status
On branch main
Changes to be committed:
new file: a.txt
[3] 커밋 후 status
On branch main
nothing to commit, working tree clean핵심: `git status`는 세 영역 중 파일이 어디에 있는지 알려 준다.
예제 4 — `ex04_inspect.sh` : 커밋 로그와 내용 확인
#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
cd "$REPO"
git init -q
git config user.name "실습용" && git config user.email "demo@example.com"
echo "첫 번째 내용" > file.txt
git add file.txt && git commit -q -m "feat: first file"
echo "두 번째 줄 추가" >> file.txt
git add file.txt && git commit -q -m "feat: add second line"
echo "=== git log --oneline ==="
git log --oneline
echo ""
echo "=== git show HEAD ==="
git show HEAD**실행 결과**
=== git log --oneline ===
b2c3d4e feat: add second line
a1b2c3d feat: first file
=== git show HEAD ===
commit b2c3d4e...
Author: 실습용 <demo@example.com>
Date: ...
feat: add second line
diff --git a/file.txt b/file.txt
...
+두 번째 줄 추가핵심: `git log`는 역순 커밋 목록, `git show HEAD`는 최신 커밋의 diff를 보여 준다.
다른 시각으로 보기
| Git 개념 | 일상 비유 |
|---|---|
| 저장소 | 사진첩 |
| 커밋 | 한 장의 사진 |
| 스테이징 영역 | 인화 대기 트레이 |
| `git add` | 트레이에 사진 올리기 |
| `git commit` | 사진첩에 붙이기 |
자주 하는 실수
- **`git add` 없이 `git commit`** — 스테이징에 아무것도 없어 "nothing to commit" 오류가 난다.
- **user.name/email 미설정** — 커밋 시 "Please tell me who you are" 오류가 발생한다.
- **`git init`을 홈 디렉토리에서 실행** — 모든 파일이 추적 대상이 되어 `.git`이 거대해진다.
- **커밋 메시지를 비워두기** — `-m` 없이 실행하면 에디터가 열리고 빈 메시지로 저장 시 커밋이 취소된다.
- **`--global`과 `--local` 혼동** — 회사 PC에서 개인 이메일로 커밋되는 문제가 생길 수 있다.
정리
- `git config --global user.name/email` 로 작성자를 등록한다.
- `git init` → `git add` → `git commit` 이 기본 사이클이다.
- `git status`로 세 영역의 상태를, `git log`로 커밋 이력을 확인한다.
- `git show <커밋>` 으로 특정 커밋의 변경 내용을 볼 수 있다.
직접 해 보기
cd 01_시작하기/src
chmod +x ex01_*.sh ex02_*.sh ex03_*.sh ex04_*.sh
./ex01_setup.sh
./ex02_init.sh
./ex03_status.sh
./ex04_inspect.sh응용:
- `git config --global core.editor "vim"` 으로 에디터를 변경해 보세요.
- `git log --oneline --graph --all` 옵션을 추가해 그래프 형태로 출력해 보세요.
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제입니다.
#!/usr/bin/env bash
set -euo pipefail
echo "=== Git 버전 확인 ==="
git --version
echo ""
echo "=== 현재 전역 사용자 설정 ==="
NAME=$(git config --global user.name 2>/dev/null || true)
EMAIL=$(git config --global user.email 2>/dev/null || true)
if [ -z "$NAME" ]; then
echo "user.name: (미설정)"
else
echo "user.name: $NAME"
fi
if [ -z "$EMAIL" ]; then
echo "user.email: (미설정)"
else
echo "user.email: $EMAIL"
fi
echo ""
echo "=== 설정 방법 안내 ==="
echo " git config --global user.name \"홍길동\""
echo " git config --global user.email \"gildong@example.com\""
=== Git 버전 확인 ===
git version 2.44.0
=== 현재 전역 사용자 설정 ===
홍길동
gildong@example.com#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
echo "작업 디렉토리: $REPO"
cd "$REPO"
git init -b main
git config user.name "실습용"
git config user.email "demo@example.com"
git config commit.gpgsign false
echo "# Hello Git" > README.md
git add README.md
git commit -m "chore: initial commit"
echo ""
echo "=== 커밋 목록 ==="
git log --oneline
echo ""
echo "=== .git 내부 구조 ==="
ls .git/
# 정리
rm -rf "$REPO"
echo ""
echo "임시 디렉토리 삭제 완료"
작업 디렉토리: /tmp/tmp.XyZ123
Initialized empty Git repository in /tmp/tmp.XyZ123/.git/
[main (root-commit) a1b2c3d] chore: initial commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
=== 커밋 목록 ===
a1b2c3d chore: initial commit#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
cd "$REPO"
git init -q -b main
git config user.name "실습용"
git config user.email "demo@example.com"
git config commit.gpgsign false
echo "파일1" > a.txt
echo "[1] 파일 추가 후 status (Untracked)"
git status
git add a.txt
echo ""
echo "[2] git add 후 status (Staged)"
git status
git commit -q -m "add a.txt"
echo ""
echo "[3] 커밋 후 status (Clean)"
git status
echo "수정된 내용" >> a.txt
echo ""
echo "[4] 파일 수정 후 status (Modified)"
git status
rm -rf "$REPO"
[1] 파일 추가 후 status
On branch main
Untracked files:
a.txt
[2] git add 후 status
On branch main
Changes to be committed:
new file: a.txt
[3] 커밋 후 status
On branch main
nothing to commit, working tree clean#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
cd "$REPO"
git init -q -b main
git config user.name "실습용"
git config user.email "demo@example.com"
git config commit.gpgsign false
echo "첫 번째 내용" > file.txt
git add file.txt && git commit -q -m "feat: first file"
echo "두 번째 줄 추가" >> file.txt
git add file.txt && git commit -q -m "feat: add second line"
echo "=== git log --oneline ==="
git log --oneline
echo ""
echo "=== git log --stat ==="
git log --stat --oneline
echo ""
echo "=== git show HEAD ==="
git show HEAD
echo ""
echo "=== git show HEAD~1 (이전 커밋) ==="
git show HEAD~1 --stat
rm -rf "$REPO"
=== git log --oneline ===
b2c3d4e feat: add second line
a1b2c3d feat: first file
=== git show HEAD ===
commit b2c3d4e...
Author: 실습용 <demo@example.com>
Date: ...
feat: add second line
diff --git a/file.txt b/file.txt
...
+두 번째 줄 추가📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
문제 1 (hw01.sh)
목표: 터미널에서 자신의 이름과 이메일을 Git 전역 설정으로 저장하고, 설정이 올바르게 저장되었는지 확인하는 스크립트를 작성하세요.
- 파일명: hw01.sh
# 예상 출력 (이름·이메일은 본인 것으로)
user.name=홍길동
user.email=gildong@example.com▶정답 코드 펼치기 / 접기
#!/usr/bin/env bash
set -euo pipefail
# 전역 user.name · user.email 설정 후 확인
git config --global user.name "홍길동"
git config --global user.email "gildong@example.com"
echo "=== 전역 Git 설정 확인 ==="
git config --list --global | grep -E "^user\."
# 예상 출력 (이름·이메일은 본인 것으로)
user.name=홍길동
user.email=gildong@example.com문제 2 (hw02.sh)
목표: 임시 디렉토리에 새 Git 저장소를 만들고, `README.md` 파일을 작성한 뒤 첫 번째 커밋을 남기고 `git log`로 확인하는 스크립트를 작성하세요.
- 파일명: hw02.sh
# 예상 출력
Initialized empty Git repository in /tmp/tmp.XXXXX/.git/
a1b2c3d docs: initial README▶정답 코드 펼치기 / 접기
#!/usr/bin/env bash
set -euo pipefail
REPO=$(mktemp -d)
echo "저장소 위치: $REPO"
cd "$REPO"
git init -b main
git config user.name "홍길동"
git config user.email "gildong@example.com"
git config commit.gpgsign false
echo "# 나의 첫 번째 저장소" > README.md
git add README.md
git commit -m "docs: initial README"
echo ""
echo "=== 커밋 로그 ==="
git log --oneline
rm -rf "$REPO"
echo "정리 완료"
# 예상 출력
Initialized empty Git repository in /tmp/tmp.XXXXX/.git/
a1b2c3d docs: initial README