Git diff 읽기: 실제 변경 줄과 문맥을 구분하는 법
Git diff는 변경한 파일 전체를 다시 보여 주는 대신 두 상태 사이의 차이를 보여 줍니다. 빨간 줄과 초록 줄만 따라가면 수정 의도는 보이지만 비교 대상이나 주변 코드와의 관계를 놓칠 수 있습니다. 먼저 무엇과 무엇을 비교하는지 정한 다음 파일 단위, 변경 블록 단위, 코드 동작 순서로 읽으면 이해하기 쉽습니다.

이 글의 명령과 출력은 설명용 예입니다. 독자의 저장소에 실제로 실행하거나 파일을 수정한 기록이 아닙니다. Git 공식 문서의 일반적인 패치 형식을 기준으로 설명하며 도구, 설정, 병합 상황에 따라 출력 모습이 달라질 수 있습니다. 줄 수가 적다는 이유만으로 영향이 작거나 검증이 끝났다고 판단하지 않습니다.
Git diff에서 의미 있는 변경 읽기
1 → 비교 대상과 작업 상태 확인
2 → 파일 머리말과 변경 종류 읽기
3 → 변경 블록의 범위·문맥 구분
4 → 추가·삭제 줄을 입력과 결과에 연결
5 → 관련 검사와 남은 질문 기록
1. 비교 대상부터 고르기
기본 git diff는 작업 폴더와 스테이징 영역 사이의 차이를 확인하는 데 사용합니다. git diff --staged는 스테이징 영역과 마지막 커밋의 차이를 확인하는 데 사용합니다. 공식 Git 책이 설명하듯 기본 diff가 비어 있다고 마지막 커밋 이후의 모든 변경이 없다는 뜻은 아닙니다.
| 질문 | 명령 예 | 읽는 범위 |
| 아직 스테이징하지 않은 변경은? | git diff | 스테이징 영역과 작업 폴더 |
| 스테이징한 변경은? | git diff --staged | 마지막 커밋과 스테이징 영역 |
| 현재 파일과 HEAD의 차이는? | git diff HEAD | HEAD와 현재 작업 내용 |
| 특정 파일에 집중하려면? | git diff -- src/label.py | 해당 경로의 기본 비교 |
예를 들어 파일을 수정하고 스테이징한 다음 다시 수정했다면 같은 파일의 변경이 두 범위에 나뉘어 있을 수 있습니다. 커밋할 내용을 검토하려면 스테이징한 쪽을, 아직 반영하지 않은 편집을 보려면 기본 diff를 읽습니다. 질문과 비교 대상이 다르면 올바른 출력도 잘못 해석할 수 있습니다.
실행 전에 저장소의 작업 폴더와 대상 경로를 확인합니다. 경로 예시의 파일이 실제 프로젝트에 없다면 해당 이름으로 새 파일을 만들 필요가 없습니다. 자신의 파일 경로로 바꾸고 출력에서 어떤 비교가 이루어졌는지 읽으세요. 다른 저장소의 예제 결과를 현재 상태의 증거로 사용하지 않습니다.
2. 파일 머리말은 변경 줄과 구분해서 읽기
패치에는 파일 경로와 변경 전후의 파일을 나타내는 머리말이 있습니다. 일반적인 형식의 ---와 +++는 파일 정보이며 세 글자의 빼기와 더하기를 코드 줄의 표시와 혼동하지 않습니다. 보통 a와 b 접두사는 비교하는 두 쪽을 구별합니다. 경로 이동이나 설정에 따라 모습은 달라질 수 있습니다.
파일 이름 변경, 새 파일, 삭제 파일은 단순한 내용 수정과 다른 의미를 가집니다. 파일 머리말을 먼저 보면 어느 파일의 어느 쪽을 읽는지 확인할 수 있습니다. 같은 함수 이름이 여러 파일에 있을 때에는 파일 경로를 놓치지 않아야 합니다. 줄만 복사한 설명에서는 이 정보가 빠지기 쉽습니다.
설명용 패치를 메모할 때에는 명령, 비교 대상, 파일 경로를 함께 적습니다. “return 줄을 바꿨다”라는 기록보다 “현재 작업 폴더의 label.py에서 HEAD와 비교한 변경”이 검토 범위를 명확히 합니다. 실제 출력에 없는 커밋 식별자를 임의로 추가하면 다른 상태의 변경처럼 읽힐 수 있습니다.
3. 변경 블록의 시작 줄과 줄 수 해석하기
아래는 이름 문자열의 앞뒤 공백을 처리하도록 바꾸는 가상 패치입니다. 변경 블록 머리의 @@ -5,3 +5,4 @@는 이 예에서 변경 전 쪽의 5번 줄부터 3줄, 변경 후 쪽의 5번 줄부터 4줄을 다루는 블록임을 나타냅니다. 함수 앞의 코드 네 줄은 예시에서 생략한 것으로 가정합니다.
--- a/src/label.py
+++ b/src/label.py
@@ -5,3 +5,4 @@
def label(name):
- return name
+ cleaned = name.strip()
+ return cleaned
# formatting helper
여기서 실제로 제거되는 내용은 return name 한 줄이고 추가되는 내용은 두 줄입니다. 함수 정의와 마지막 주석은 블록을 이해하기 위한 문맥입니다. 블록에 표시된 모든 줄이 수정된 것은 아닙니다. 변경 전과 변경 후의 줄 수에는 각 쪽에 해당하는 문맥도 포함됩니다.
블록 시작 줄이 달라지는 것도 별도의 의미를 확인해야 합니다. 앞쪽 변경으로 뒤쪽 코드의 위치가 이동하면 같은 논리적 위치가 다른 줄 번호로 보일 수 있습니다. 줄 번호 차이를 곧바로 다른 기능 변경으로 읽지 말고 해당 함수와 주변 조건을 함께 확인하세요. 빈 줄이 문맥으로 포함되는 경우도 있습니다.
4. 더하기·빼기·문맥을 실제 동작으로 연결하기
위 패치에서는 기존의 문자열을 그대로 돌려주는 동작에서 앞뒤 공백을 정리한 문자열을 돌려주는 동작으로 바뀝니다. 변경 줄을 읽은 다음 “어떤 입력에서 결과가 달라지는가”를 질문하면 검토가 구체적이 됩니다. 공백 없는 이름은 같은 결과일 수 있지만 양끝 공백이 있는 입력은 달라지는 구조입니다.
그렇다고 이 변경이 무조건 좋은 것은 아닙니다. 입력에 있는 공백을 보존해야 하는 분야라면 요구 사항과 맞지 않을 수 있습니다. 또 함수가 문자열 이외의 입력도 받는다면 그 조건을 확인해야 합니다. diff는 의도를 보여 주는 자료이고 실제 요구를 정하는 문서는 아닙니다.
| 설명용 입력 조건 | 검토 질문 | 필요한 근거 |
| 앞뒤 공백 없음 | 기존 결과가 유지되는가? | 정상 입력 비교 |
| 앞뒤 공백 있음 | 제거하는 것이 요구 사항인가? | 입력 규칙과 기대 결과 |
| 빈 문자열 | 빈 값의 동작을 유지하는가? | 경계 입력 확인 |
| 문자열이 아닌 값 | 허용하거나 거부하는가? | 호출 조건과 입력 계약 |

표의 답은 실제 프로젝트에서 채워야 합니다. 코드 한 줄을 눈으로 읽었다는 사실과 프로그램을 실행해서 결과를 확인했다는 사실은 다릅니다. 검토 메모에는 코드에서 예상한 영향과 실제 검사로 확인한 영향을 나누어 적으면 다른 사람이 증거 범위를 이해하기 쉽습니다.
5. 먼저 목록을 보고 중요한 파일부터 읽기
변경이 많으면 git diff --stat로 파일별 개요를 확인하거나 git diff --name-only로 파일 이름을 확인할 수 있습니다. 이 출력은 검토할 파일을 고르는 안내이며 함수 동작을 설명하는 전체 패치를 대신하지 않습니다. 요약에서 빠진 세부 내용은 해당 파일의 diff로 확인합니다.
가상의 변경 묶음에는 입력 처리 파일, 검사 파일, 문서 파일이 있다고 합시다. 먼저 동작을 바꾸는 입력 처리 파일을 읽고 그 동작을 확인하는 검사 파일을 대조합니다. 문서가 같은 규칙을 설명하는지 마지막으로 확인할 수 있습니다. 이름만 바뀐 파일과 실행 경로를 바꾼 파일을 같은 영향으로 세지 않습니다.
스테이징 내용을 검토한다면 목록 명령에도 같은 비교 조건을 붙여야 합니다. 기본 범위의 목록과 스테이징 범위의 패치를 섞으면 다른 변경을 연결하게 될 수 있습니다. 한 검토 기록 안에서 비교 기준을 유지하는 것이 파일 수를 줄이는 것보다 중요합니다.
6. 빈 출력과 너무 큰 출력의 이유 찾기
출력이 없으면 먼저 비교 대상을 확인합니다. 스테이징한 변경만 남았다면 기본 diff가 비어 있을 수 있습니다. 새로 만든 미추적 파일도 기본 diff의 변경만 보고 전부 확인했다고 가정하지 않습니다. 작업 상태와 경로를 함께 살펴 무엇이 비교에 포함됐는지 확인하세요.
반대로 파일 전체가 바뀐 것처럼 보이면 실제 로직 수정인지 서식이나 줄 끝의 차이인지 살펴봅니다. 이때 “보기 불편하니 모두 무시”라고 처리하면 의미 있는 공백 변경까지 놓칠 수 있습니다. 확인하려는 문제가 표시 차이인지 기능 차이인지 나누고, 최종 검토에는 필요한 원본 변경 내용을 남깁니다.
바이너리 파일이나 병합의 복합 diff는 일반적인 한 쪽의 더하기·빼기 형식만으로 모두 해석할 수 없습니다. 익숙한 예시와 모양이 다르면 공식 문서의 해당 출력 형식을 확인하세요. 이미지 파일의 내용을 텍스트 패치처럼 읽거나 여러 부모의 변경을 단일 비교로 단정하지 않습니다.
7. 검토 결과를 수정 요청으로 바꾸기
수정이 필요하다면 파일과 변경 블록, 영향을 받는 입력, 기대하는 규칙을 함께 제시합니다. “이 부분이 이상하다”보다 “공백을 보존해야 하는 입력에도 strip이 적용되므로 해당 조건을 구분해야 한다”가 구체적입니다. 코드에서 읽은 후보인지 실제 실패를 확인한 문제인지도 밝혀야 합니다.
검사 파일이 함께 바뀌었다면 기대 값을 바꿔 검사를 통과시킨 것인지 실제 요구 변경을 반영한 것인지 살펴봅니다. 실패한 검사를 제거했다면 그 조건이 더 이상 필요 없는 이유가 있는지도 확인하세요. 검사 줄이 추가됐다는 사실만으로 수정의 올바름이 보장되는 것은 아닙니다.
검토가 끝나면 비교 대상, 확인한 파일, 핵심 동작 변경, 실제 검증 범위, 남은 질문을 짧게 기록합니다. 같은 diff를 다시 읽는 사람이 무엇을 확인해야 하는지 알 수 있는 정보가 목표입니다. 변경을 되돌리거나 커밋하기 전에 사용자의 다른 편집이 포함되어 있는지도 대조합니다.
8. 독자가 바로 사용하는 읽기 순서
처음에는 명령이 비교하는 두 상태를 적고 파일 목록을 봅니다. 파일 머리말로 대상과 종류를 확인한 다음 변경 블록의 범위를 읽습니다. 더하기와 빼기의 내용에서 입력·출력·부작용이 어떻게 달라지는지 생각하고, 문맥에서 호출 조건을 확인합니다. 마지막에 관련 검증 근거를 대조하세요.
이 순서는 패치를 이해하는 방법이며 실행 성공이나 배포 승인을 뜻하지 않습니다. 한 줄의 변경도 여러 호출 지점에 영향을 줄 수 있고 큰 서식 변경은 동작이 그대로일 수 있습니다. 파일 수나 줄 수보다 요구 사항과 실제 결과의 연결을 기준으로 검토하면 Git diff를 유용한 판단 자료로 사용할 수 있습니다.
공식 출처와 작성 기준
자료 확인일: 2026-10-06. 실제로 연 공식 자료를 바탕으로 AI가 작성한 설명입니다. 별도 표시한 계산·코드·점검 사례는 설명용이며 사용자 환경을 직접 시험하거나 실측한 결과가 아닙니다. 발행 준비 단계에서 기능과 공식 자료의 변경 여부를 다시 확인했습니다.
본문의 이해를 돕기 위해 제작한 설명용 삽화입니다.
티스토리 원문 ↗