git diff
Show changes between commits, commit and working tree, etc
— Git 공식 매뉴얼(man git-diff)
내가 짠 어설픈 코드와 동료의 대환장 코드의 민낯을 비교 대조하여 시시비비를 가려내는 솔로몬의 재판장. 분명 딱 한 글자 고쳤는데 왜 1500줄이 수정되었다고 뜨는 거지?(...)
1. 개요
서로 다른 두 지점의 코드 상태를 상호 대조하여 무엇이 추가되고 삭제되었는지 세부 변경 내역을 라인 단위로 조명하는 명령어다. 내가 로컬에서 수정한 코드의 분량을 확인하거나, 혹은 병합 직전에 원격 서버와의 충돌 가능성을 예측할 때 아주 결정적인 조언을 건넨다.
2. 공포의 공백 포매팅 테러
이 명령어를 실행할 때 개발자의 심장을 가눌 수 없게 만드는 치명적인 적이 있으니, 그것은 바로 인덴트(공백/탭) 자동 치환이다. 동료가 사용하는 IDE의 코드 포매터 설정이 나와 다른 상태에서 한 줄 수정을 저장하면, 전체 소스 코드의 빈 여백들이 싸그리 다 갈아엎어져 diff 창에는 사실상 소스 코드 전체가 물갈이된 것 같은 수천 줄의 아수라장 적색/녹색 페인트칠이 펼쳐진다. 이를 극복하려면 git diff -w (ignore-all-space) 구원 버튼을 기억해야 한다.1
3. 스테이징과의 대조: --staged 옵션
초보자들이 범하는 오류 중 하나는, git add를 마치고 나서 변경 내역을 점검하려 그냥 git diff를 입력하는 것이다. 안타깝게도 아무 결과도 나오지 않는다. 왜냐하면 그냥 diff는 아직 스테이징되지 않은 날것의 파일들과 작업 공간만 비교하기 때문이다. 이미 인덱스 무대에 올려둔 고귀한 초록색 코드들을 대조하려면 무조건 뒤에 --staged (또는 --cached) 라는 전용 마크를 붙여서 조회해야 한다.
4. 실제 사용 예시
아직 스테이징하지 않은 변경 사항을 확인하는 기본 명령이다. 커밋 전에 내가 정확히 무엇을 바꿨는지 확인하는 용도다.
# 작업 디렉터리와 스테이징 영역 비교
git diff
# 스테이징된 내용과 최신 커밋 비교
git diff --staged
브랜치나 커밋 사이의 차이를 볼 때도 많이 쓴다.
git diff main..feature/login
git diff HEAD~1 HEAD
git diff --name-only main..feature/login
5. 관련 밈 및 드립
5.1. No Diff, No Commit
실무에서 변경된 diff를 제눈으로 한 줄 한 줄 직접 단독 검증하지 않은 상태로 원격 서버에 날리는 행위를 '러시안 룰렛'에 빗대는 드립이다. 대개 디버깅용으로 박아둔 console.log('야이 바보야!')나 민감한 API Key 하드코딩이 그대로 유저용 라이브 환경으로 전송되어 회사 전체의 영혼을 털어버린다.
5.2. GUI 툴 예찬론
터미널의 git diff가 뿜어내는 가독성 극악의 날것 텍스트에 치를 떨고, 결국 유료 툴인 WebStorm이나 Beyond Compare 같은 찬란하고 컬러풀한 GUI 차이 대조 그래픽 창을 띄워 놓고 신선놀음을 즐기며 터미널 파이터들을 멀리서 비웃는 밈이다.
6. 여담
- 커밋 대조:
git diff commit1 commit2형태로 과거에 쌓인 머나먼 커밋들 간의 역학적 시공간 변화도 정밀 비교가 가능하다. - 파일명 전용: 소스 코드 내용물 말고 바뀐 파일 목록만 빠르게 속독하려면
git diff --name-only라는 멋진 윤활유를 바르면 된다. - 단어 단위 세분화:
--word-diff라는 아주 똑똑한 보석 같은 옵션을 붙이면 라인이 아닌 라인 내의 '단어'가 쪼개진 차이점만 하이라이트해 주어 피로감을 획기적으로 줄여 준다.
7. 관련 문서
각주
-
실제로 협업 전 팀원 간의
.editorconfig나 Prettier 설정을 통일하지 않으면, 매 PR마다 이 지옥 같은 포매팅 전쟁이 터져 머리채를 붙잡게 된다. ↩