C
협업 & Git/Git기초/Lesson 02

Git 기초 — 명령어·gitignore·GitHub 한 번에

30분·theory

Git 기초 — 명령어·gitignore·GitHub 한 번에

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ Git 의 working / staging / repo 3영역
  • ✅ commit · branch · merge 기본 명령어
  • ✅ Conventional Commits 메시지 작성

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

일상 Git 워크플로우 6단계

1. 편집 — Working Directory 에서 코드 수정
2. git add — 변경 파일 → Staging Area
3. git commit -m — Staging → Local Repo. 메시지로 변경 요약
4. git push — Local → Remote (GitHub). 팀과 공유
5. git pull — Remote 변경 → Local. 동료 작업 동기화
6. branch / merge — 기능별 분기, 완성 후 main 에 합침

> 💡 핵심: 변경(Working) → 준비(Staging) → 저장(Repo) → 공유(Remote) 4 단계 모델.

💻 📌 필수 Git 명령어
# ============================================
# 이 명령이 하는 일: Git 기본 워크플로우 전체 흐름
# 실생활 비유: 문서 작업 → 검토 → 저장 → 공유 과정
# ============================================

# === 기본 워크플로우 ===
# 현재 작업 디렉터리 상태를 확인 (어떤 파일이 변경됐는지)
git status                    # 현재 상태 확인
# 특정 파일만 스테이징 (커밋 전 검토 구역에 올리기)
git add file.txt              # 특정 파일 스테이징
# 모든 변경된 파일을 한 번에 스테이징 구역에 올리기
git add .                     # 모든 변경 파일 스테이징
# -m 플래그 = 커밋 메시지를 인라인으로 작성 (없으면 vim 에디터 열림)
git commit -m "메시지"        # 커밋 생성
# 결과: [main abc1234] 메시지 / 1 file changed, 1 insertion(+)

# === 이력 확인 ===
# 전체 커밋 이력 확인 (작성자, 날짜, 메시지 포함)
git log                       # 커밋 이력 보기
# --oneline = 커밋 ID + 메시지만 한 줄로 요약 출력
git log --oneline             # 한 줄로 보기
# --graph = 브랜치 분기/합류를 ASCII 아트로 시각화
git log --graph               # 그래프로 보기
# 특정 커밋 ID 의 변경 내용(diff)과 메타데이터 상세 확인
git show abc123               # 특정 커밋 상세 보기

# === 원격 저장소 ===
# 연결된 원격 저장소 URL 목록 (fetch/push URL 구분 출력)
git remote -v                 # 원격 저장소 목록
# 로컬 커밋을 origin(원격)의 main 브랜치에 업로드
git push origin main          # 원격에 푸시
# 원격 변경사항을 가져와서 현재 브랜치에 자동 병합
git pull origin main          # 원격에서 가져오기
# 원격 정보만 받아오고 자동 병합은 하지 않음 (안전한 확인 후 병합 가능)
git fetch origin              # 원격 정보만 가져오기

# === 변경 취소 ===
# Working Directory 변경사항 버리기 (스테이징 전 상태로 복원)
git checkout -- file.txt      # 파일 변경 취소
# Staging Area 에서 빼고 Working Directory 로 되돌리기
git reset HEAD file.txt       # 스테이징 취소
# 마지막 커밋 메시지를 다시 작성 (커밋 안 푸시했을 때만 안전)
git commit --amend            # 마지막 커밋 수정

.gitignore — 절대 올리면 안 되는 것들

1. 새 프로젝트 — github.com/github/gitignore 템플릿 복붙 (Node·Python·Java 등)
2. 패턴 문법*.log (확장자) / node_modules/ (폴더) / !important.log (예외)
3. 점검git status 로 확인. 무시되어야 할 파일이 untracked 면 .gitignore 누락
4. 이미 커밋된 파일 — .gitignore 추가해도 추적 계속. git rm --cached <file> 로 추적 해제
5. 글로벌 .gitignore~/.gitignore_global (모든 프로젝트 공통, 예: .DS_Store)
6. CI 검사 — GitHub Actions 로 비밀 파일 스캔. truffleHog·git-secrets

> ⚠️ 흔한 실수: .env·.key·.pem·.aws/credentials 누락 → 시크릿 노출. 1 회 푸시 시 git 이력 영구 남음.

GitHub 핵심 기능 6가지

1. Repository — 프로젝트 저장소. public/private. README·LICENSE·.gitignore·.github/. fork·star·watch
2. Issues — 버그·기능 요청·토론. label·milestone·assignee. PR과 자동 연결(Closes #123)
3. Pull Request — fork·branch 에서 변경 후 원본에 머지 요청. 코드 리뷰·CI·승인 후 머지
4. Actions (CI/CD).github/workflows/*.yml — push·PR 시 자동 빌드·테스트·배포. public repo 무료
5. Codespaces — 브라우저 안 VS Code + 컨테이너. 로컬 셋업 X. PR 리뷰·기여 즉시
6. Copilot — AI 페어 프로그래머. 코드 자동완성·PR 요약·이슈 답변

> 🔗 GitHub 만든 사람들: 2008 Tom Preston-Werner·Chris Wanstrath·PJ Hyett·Scott Chacon → 2018 Microsoft 인수 → 2025 1억+ 개발자.

git reset · revert · cherry-pick · stash — *되돌리기 4총사*

git reset — 과거로 시간 여행

bash
git reset --soft  HEAD~1     # 커밋만 취소, 스테이지·작업 유지
git reset --mixed HEAD~1     # 커밋·스테이지 취소, 작업 유지 (기본)
git reset --hard  HEAD~1     # 모두 삭제 — *위험*

3가지 옵션 비교

옵션HEADIndex (Staged)Working Dir
--soft이동유지유지
--mixed (기본)이동리셋유지
--hard이동리셋리셋

가장 자주 쓰는 시나리오:

bash
# 마지막 커밋 메시지만 다시 작성하고 싶다
git reset --soft HEAD~1
# 같은 변경사항이 stage 된 상태 → git commit 다시

# 마지막 커밋을 통째로 취소하고 변경사항만 유지
git reset HEAD~1     # --mixed 기본
# 작업본은 그대로, stage 비워짐 → 다시 작업

# 정말 다 날리고 싶다 (CTRL+Z 의 끝판왕)
git reset --hard origin/main
# *원격이 안전한 출발점* 일 때만

⚠️ reset --hard 의 위험

  • 작업 중인 변경 사라짐 (커밋 안 한 것)
  • 이미 push 한 커밋을 reset 하면 — 다른 사람과 충돌 + force push 필요 + history 깨짐

공유 브랜치에는 reset 금지. 본인 로컬에서만.

git revert — 공개 브랜치의 안전한 되돌리기

bash
git revert <커밋해시>

"되돌리는 새 커밋" 을 추가. history 는 보존, 변경만 되돌림.

code
# revert 전:  A → B → C
# revert C:   A → B → C → C'  (C 의 반대 변경)

main 브랜치의 잘못된 커밋을 되돌릴 때 표준. 다른 사람의 git pull 도 자연스럽게 적용.

reset vs revert 한 줄

  • resethistory 를 다시 씀. 로컬에서만.
  • revert되돌리는 새 커밋 추가. 어디서나 안전.

git cherry-pick — 특정 커밋만 가져오기

bash
# feature 브랜치의 커밋 abc1234 만 main 으로
git checkout main
git cherry-pick abc1234

핫픽스를 stable 로 백포트 할 때 자주. 또는 큰 PR 의 일부만 먼저 머지.

bash
# 여러 개
git cherry-pick abc1234..def5678        # 범위
git cherry-pick abc1234 def5678 ghi9012  # 나열

git stash — 임시 저장

시나리오: 작업 중인데 갑자기 다른 브랜치로 가야 함.

bash
git stash             # 변경사항 임시 저장
git checkout other
# ... 다른 작업 ...
git checkout original
git stash pop          # 복원

커밋 안 하고 깔끔히 옮기는 표준 방법.

bash
git stash list             # 저장된 stash 목록
git stash apply stash@{2}  # 특정 stash 적용 (pop 은 적용+삭제)
git stash drop stash@{0}   # 특정 stash 삭제
git stash branch tmp       # stash 를 새 브랜치로 분리

.gitignore 실전 패턴

code
# 의존성
node_modules/
.venv/
__pycache__/
*.pyc

# 빌드 결과
dist/
build/
.next/
target/

# 환경변수·비밀
.env
.env.local
.env.*.local
*.pem
*.key

# IDE
.vscode/
.idea/
*.swp
.DS_Store

# 로그
*.log
logs/

# 캐시
.cache/
.parcel-cache/

프로젝트 시작할 때 즉시 작성. https://gitignore.io 에서 기술 스택별 자동 생성.

커밋 메시지 — bad/good

code
❌ "수정함"
✅ fix(auth): handle null user in login flow

❌ "기능 추가"
✅ feat(payment): add Stripe webhook handler

❌ "버그"
✅ fix(api): correct 500 error when user_id is missing

❌ "리팩토링"
✅ refactor(db): extract user query into repository

Conventional Commits 표준:

code
<type>(<scope>): <description>

types: feat, fix, docs, style, refactor, test, chore, perf

첫 줄 50자, 본문 72자 줄바꿈. 영어로 명령형 현재시제.

🤖 AI 에게 이렇게 요청해보세요

  • "마지막 커밋을 취소하고 변경사항만 stage 에 남기는 git 명령어 알려줘"
  • "이 변경사항을 Conventional Commits 메시지로 작성해줘"
  • "이 .gitignore 가 Node.js + Python + Java 환경에 충분한지 검토해줘"