절 번호는 원본 문서의 것을 그대로 유지합니다. 1편이 1.3 상태 확인에서 끝났으니 이 편은 1.4부터 이어집니다.
1.4 커밋하기
git add file.txt # 특정 파일
git add src/ # 디렉토리
git add . # 현재 경로 이하 전부
git add -A # 저장소 전체 (삭제 포함)
git add -p # 대화형 — 파일 안의 일부 변경만 선택 ★
git commit -m "feat: 로그인 기능 추가"
git commit # 에디터로 여러 줄 메시지 작성
git commit -am "메시지" # 추적 중인 파일 add + commit 동시에 (새 파일 제외)git add -p는 꼭 익혀두세요. 파일 하나 안에서 "이 hunk는 커밋, 저 hunk는 나중에"를 고를 수 있습니다. 커밋을 깔끔하게 유지하는 가장 강력한 도구입니다.
Stage this hunk [y,n,q,a,d,s,e,?]?
y - 스테이징
n - 건너뛰기
s - 더 잘게 쪼개기
e - 직접 편집
q - 종료1.5 좋은 커밋 메시지 — Conventional Commits
<type>(<scope>): <subject>
<body>
<footer>feat(auth): OAuth2 구글 로그인 추가
기존 이메일/비밀번호 로그인에 더해 구글 소셜 로그인을 지원한다.
- NextAuth.js 도입
- 신규 유저 자동 생성 로직 포함
Closes #42| type | 의미 |
|---|---|
feat | 새로운 기능 |
fix | 버그 수정 |
docs | 문서만 변경 |
style | 포매팅, 세미콜론 등 (로직 변경 없음) |
refactor | 리팩토링 (기능 변경 없음) |
perf | 성능 개선 |
test | 테스트 추가/수정 |
build | 빌드 시스템, 의존성 |
ci | CI 설정 |
chore | 기타 잡일 |
revert | 이전 커밋 되돌리기 |
Conventional Commits 스펙이 직접 정의하는 타입은 feat과 fix 둘뿐이고, 나머지는 Angular 컨벤션과 이를 따르는 @commitlint/config-conventional에서 굳어진 관행입니다. revert는 스펙 FAQ가 "권장 방법 중 하나"로 언급하는 형태입니다.
작성 규칙:
- 제목은 50자 이내, 마침표 없이
- 명령형 현재 시제 — "추가함"이 아니라 "추가" (
Add, notAdded) - 제목과 본문 사이 빈 줄 1개
- 본문은 "무엇을"보다 "왜" 를 적기 (무엇은 diff를 보면 됨)
BREAKING CHANGE:를 footer에 쓰면 메이저 버전 변경 신호
이 규칙을 지키면 semantic-release 같은 도구가 커밋만 읽고 버전을 자동으로 올려줍니다. 9편의 릴리스 자동화에서 다룹니다.
1.6 히스토리 조회
git log # 전체
git log --oneline # 한 줄씩
git log --oneline --graph --all # 브랜치 구조를 그래프로 ★
git log -5 # 최근 5개
git log -p # 변경 내용(patch)까지
git log --stat # 파일별 변경 줄 수 요약
git log --author="Han" # 작성자 필터
git log --since="2 weeks ago" # 기간 필터
git log --grep="로그인" # 커밋 메시지 검색
git log -S "functionName" # 이 코드가 추가/삭제된 커밋 검색 ★★
git log -- src/app.ts # 특정 파일의 히스토리
git log main..feature # feature에만 있고 main에 없는 커밋 ★
git show <commit> # 특정 커밋 상세
git blame file.txt # 줄마다 누가 언제 바꿨는지git log -S(pickaxe)는 디버깅할 때 보물입니다. "이 함수 도대체 언제 누가 지웠지?"를 1초에 찾습니다.
보기 좋은 alias 하나 등록해두면 평생 씁니다.
git config --global alias.lg "log --graph --pretty=format:'%C(yellow)%h%Creset -%C(auto)%d%Creset %s %C(dim)(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 이후 git lg 로 사용1.7 .gitignore
# 의존성
node_modules/
vendor/
# 빌드 산출물
dist/
build/
.next/
*.log
# 환경변수 — 절대 커밋하면 안 됨 ★
.env
.env.local
*.pem
*.key
# OS / 에디터
.DS_Store
Thumbs.db
.idea/
.vscode/*
!.vscode/settings.json # 예외: 이 파일은 추적
# 예외 문법
*.log
!important.log주의 — 이미 추적 중인 파일은 .gitignore에 넣어도 무시되지 않습니다.
# 추적 목록에서만 제거 (로컬 파일은 유지) — 이 옵션이 핵심
git rm --cached .env
git rm -r --cached node_modules/
git commit -m "chore: .env 추적 해제"--cached 없이 git rm 하면 실제 파일이 삭제됩니다. 이 차이가 사고의 단골 원인입니다.
더 중요한 사실: 이미 커밋된
.env는.gitignore에 넣거나git rm --cached해도 과거 히스토리에는 그대로 남아 있습니다. 이미 push했다면 그 비밀키는 유출된 것으로 간주하고 즉시 재발급해야 합니다. 히스토리에서 지우는 방법은 7편에서 다루지만, 지우는 것보다 재발급이 먼저입니다.
프로젝트 유형별 .gitignore 템플릿은 github/gitignore 에서 가져오면 됩니다.