← posts/b.log()

blog92@web:~$ cat posts/github-02-commit-log-and-gitignore.md

GIT2 min read

GitHub 완전 정복 2편 — 커밋 만들기, 좋은 커밋 메시지, 히스토리 조회와 .gitignore

git add -p로 커밋을 의미 단위로 쪼개는 법, Conventional Commits 형식과 작성 규칙, log·show·blame으로 히스토리를 캐는 법, 그리고 .gitignore가 이미 추적 중인 파일에는 듣지 않는 이유와 대처를 다룹니다.

이전 편: 1편 — Git과 GitHub의 차이, 3가지 영역, 설치와 상태 확인

절 번호는 원본 문서의 것을 그대로 유지합니다. 1편이 1.3 상태 확인에서 끝났으니 이 편은 1.4부터 이어집니다.

1.4 커밋하기

bash
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는 나중에"를 고를 수 있습니다. 커밋을 깔끔하게 유지하는 가장 강력한 도구입니다.

text
Stage this hunk [y,n,q,a,d,s,e,?]?
  y - 스테이징
  n - 건너뛰기
  s - 더 잘게 쪼개기
  e - 직접 편집
  q - 종료

1.5 좋은 커밋 메시지 — Conventional Commits

text
<type>(<scope>): <subject>
 
<body>
 
<footer>
text
feat(auth): OAuth2 구글 로그인 추가
 
기존 이메일/비밀번호 로그인에 더해 구글 소셜 로그인을 지원한다.
- NextAuth.js 도입
- 신규 유저 자동 생성 로직 포함
 
Closes #42
type의미
feat새로운 기능
fix버그 수정
docs문서만 변경
style포매팅, 세미콜론 등 (로직 변경 없음)
refactor리팩토링 (기능 변경 없음)
perf성능 개선
test테스트 추가/수정
build빌드 시스템, 의존성
ciCI 설정
chore기타 잡일
revert이전 커밋 되돌리기

Conventional Commits 스펙이 직접 정의하는 타입은 feat과 fix 둘뿐이고, 나머지는 Angular 컨벤션과 이를 따르는 @commitlint/config-conventional에서 굳어진 관행입니다. revert는 스펙 FAQ가 "권장 방법 중 하나"로 언급하는 형태입니다.

작성 규칙:

  • 제목은 50자 이내, 마침표 없이
  • 명령형 현재 시제 — "추가함"이 아니라 "추가" (Add, not Added)
  • 제목과 본문 사이 빈 줄 1개
  • 본문은 "무엇을"보다 "왜" 를 적기 (무엇은 diff를 보면 됨)
  • BREAKING CHANGE: 를 footer에 쓰면 메이저 버전 변경 신호

이 규칙을 지키면 semantic-release 같은 도구가 커밋만 읽고 버전을 자동으로 올려줍니다. 9편의 릴리스 자동화에서 다룹니다.

1.6 히스토리 조회

bash
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 하나 등록해두면 평생 씁니다.

bash
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

text
# 의존성
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에 넣어도 무시되지 않습니다.

bash
# 추적 목록에서만 제거 (로컬 파일은 유지) — 이 옵션이 핵심
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 에서 가져오면 됩니다.

COMMENTS (…)

댓글을 불러오는 중이에요.

NEW COMMENT0 / 1000
⌘↵ 전송

blog92@web:~$ cd ..