Git Diff — 커밋 전에 반드시 확인하는 습관
이 토픽을 마치면
git diff로 변경사항을 확인하는 습관이 왜 중요한지, 그리고 어떤 옵션이 어떤 상태를 보여주는지 구분할 수 있게 됩니다.
커밋하고 나서 "어?" 하는 순간
코드를 고치고 git add . → git commit 했습니다. 그런데 push하고 나서 보니 디버깅용 console.log가 3개 남아 있었습니다. .env 파일도 같이 올라갔습니다. API 키가 GitHub에 공개됐습니다.
이런 사고의 공통점은 커밋 전에 뭘 올리는지 확인하지 않았다는 겁니다. git diff는 이 확인을 해주는 명령어입니다.
git diff — 아직 스테이징 안 된 변경사항
git diff이 명령어는 작업 디렉토리에서 수정했지만 아직 git add하지 않은 변경사항을 보여줍니다.
- const API_URL = "https://api.example.com";
+ const API_URL = "https://api.production.com";빨간색 -줄은 이전 내용, 초록색 +줄은 새로운 내용입니다. 어떤 파일에서 어떤 줄이 바뀌었는지 한눈에 보입니다.
git diff --staged — 스테이징된 변경사항
git diff --stagedgit add로 스테이징한 변경사항만 보여줍니다. 지금 커밋하면 정확히 뭐가 들어가는지 확인하는 명령어입니다.
이걸 이해하려면 Git의 3가지 영역을 알아야 합니다:
작업 디렉토리 → 스테이징 영역 → 커밋 기록
(수정) (git add) (git commit)
git diff git diff --staged
↑ 여기 ↑ 여기git diff는 작업 디렉토리 ↔ 스테이징 사이를 보고, git diff --staged는 스테이징 ↔ 마지막 커밋 사이를 봅니다.
커밋 간 비교
특정 커밋끼리 비교도 됩니다:
git diff HEAD~3..HEAD최근 3개 커밋에서 뭐가 바뀌었는지 전체를 보여줍니다.
git diff main..feature-branchmain 브랜치와 feature-branch 사이의 차이를 보여줍니다. PR(Pull Request)을 올리기 전에 이걸로 확인하면 리뷰어가 볼 내용을 미리 점검할 수 있습니다.
파일 단위로 보기
전체 diff가 너무 길면 특정 파일만 볼 수 있습니다:
git diff src/api/handler.jsgit diff --staged package.json--stat 옵션을 붙이면 어떤 파일이 바뀌었는지 요약만 보여줍니다:
git diff --statsrc/api/handler.js | 12 ++++++------
src/utils/format.js | 3 ++-
package.json | 1 +
3 files changed, 9 insertions(+), 7 deletions(-)파일 목록과 변경 규모를 빠르게 파악할 수 있습니다. 전체를 다 읽기 전에 이걸로 범위부터 확인하는 게 좋습니다.
실무 습관: 커밋 전 3단계
숙련된 개발자들은 커밋 전에 이 순서를 밟습니다:
git status # 1. 어떤 파일이 바뀌었는지 확인git diff # 2. 스테이징 전 변경사항 확인git add <파일들> # 3. 필요한 것만 선택적으로 스테이징git diff --staged # 4. 커밋에 들어갈 내용 최종 확인git commit # 5. 커밋git add .로 전부 올리는 게 아니라 파일을 하나씩 확인하면서 올리는 것이 핵심입니다. 디버깅 코드, 테스트용 하드코딩 값, .env 같은 민감한 파일이 실수로 포함되는 걸 막을 수 있습니다.
GUI 도구의 diff
VS Code의 Source Control 패널, GitKraken, GitHub Desktop 같은 GUI 도구들도 내부적으로 git diff를 실행합니다. 화면에서 변경사항을 색상으로 보여주고, 줄 단위로 스테이징/언스테이징할 수 있습니다.
어떤 도구를 쓰든 원리는 같습니다: 커밋하기 전에 무엇이 들어가는지 눈으로 확인하는 것.
핵심
git diff는 커밋 전에 변경사항을 확인하는 명령어입니다.git diff는 미스테이징 변경,git diff --staged는 스테이징된 변경을 보여줍니다. "확인 없이 커밋"하는 습관이.env유출과 디버깅 코드 잔류의 원인입니다.