git log, show, diff를 사용하여 Git 히스토리 보기


월요일 아침에 weather-app을 열었는데 금요일에 배포한 것이 정확히 무엇인지 기억나지 않는다고 해봅시다. 또는 팀원이 지난주 온도 변환이 왜 변경되었는지 묻고, 추측 대신 실제 답변을 원합니다. 커밋 루프는 커밋이 어떻게 저장되는지 설명합니다. 이 장에서는 그 히스토리를 다시 읽는 방법을 설명합니다: 무엇이 일어났는지, 누가 했는지, 언제 했는지. 그 명령은 git log이며, 작은 프로젝트가 출력하는 모든 것이 여기 있습니다:
$ git log
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: 박민지 <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
섭씨-화씨 온도 변환 공식 수정
commit 5f3d8b21a90e7c6d5b4a3f2e1d0c9b8a7f6e5d4c
Author: 이준호 <[email protected]m>
Date: Mon Jul 13 16:45:22 2026 +0100
대시보드에 5일 예보 추가
commit 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
Author: 이준호 <[email protected]m>
Date: Mon Jul 13 11:03:47 2026 +0100
프로젝트 구조 설정한 명령으로 프로젝트의 전체 이야기가 바로 여기 있습니다: 세 개의 커밋, 가장 최신것부터, 각각 누가 작성했는지, 언제, 왜 했는지가 기록되어 있습니다.
git log로 로그 읽기
git log는 현재 위치에서 도달할 수 있는 모든 커밋을 거슬러 올라가며, 가장 최신것부터 표시합니다. 각 항목은 네 가지를 보여줍니다: 해시(그 정확한 커밋을 식별하는 문자와 숫자의 긴 문자열), 저자, 날짜, 저자가 작성한 메시지입니다.
**커밋**은 이 네 가지 모든 것을 함께 묶은 것입니다: 그 순간의 모든 추적 파일의 스냅샷, 변경사항을 설명하는 메시지, 누가 만들었는지, 바로 전에 나온 커밋인 부모 커밋으로의 링크. 이 부모 링크가 분리된 스냅샷들의 더미를 실제 타임라인으로 바꿔줍니다. 위에서 아래로 git log를 읽으면 그 타임라인을 역순으로, 지금에서 시작으로 읽는 것입니다.
해시는 처음에는 위협적으로 보이지만, 전체가 필요한 경우는 거의 없습니다. 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c과 4f2a1c9는 같은 커밋을 가리킵니다. Git은 리포지토리의 다른 모든 커밋과 구별하기 위해 충분한 해시만 필요하며, 처음 7개 정도의 문자는 거의 항상 충분합니다. 이 장의 나머지 명령을 포함하여 어디에서나 짧은 형식을 보게 될 것입니다.
git log는 모든 커밋을 나열하며, 가장 최신것부터 해시, 저자, 날짜, 메시지와 함께 표시합니다. 커밋은 그 스냅샷과 메시지 그리고 그 전에 온 커밋으로의 링크입니다. 전체 해시가 필요한 경우는 거의 없으며, 처음 여러 문자만으로도 Git이 정확히 어느 커밋을 의미하는지 알 수 있습니다. git show로 한 커밋 검사하기
git log는 커밋이 일어났다는 것을 알려줍니다. git show <hash>는 정확히 그것이 무엇을 했는지 알려줍니다:
$ git show 4f2a1c9
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: 박민지 <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
섭씨-화씨 온도 변환 공식 수정
diff --git a/src/index.js b/src/index.js
index 3f2c1a9..7b8e2d4 100644
--- a/src/index.js
+++ b/src/index.js
@@ -12,7 +12,7 @@ function celsiusToFahrenheit(celsius) {
- return celsius * (9 / 5 + 32)
+ return (celsius * 9) / 5 + 32위쪽 절반은 git log가 보여주는 것과 동일한 메타데이터입니다. 아래는 실제 변경사항입니다: -로 시작하는 줄은 커밋이 제거한 줄이고, +로 시작하는 줄은 추가한 줄이며, 표시되지 않은 줄은 동일하게 유지된 컨텍스트입니다. 여기서 명확하게 읽혀집니다: 이전 줄은 32를 괄호 안에 그룹화했으므로 곱셈이 발생하기 전에 추가되었습니다. 수정은 celsius * 9 주위에 괄호를 다시 그룹화하여 32가 마지막에 추가되도록 합니다. 이것이 민지의 메시지가 설명하는 연산자 우선순위 버그입니다.
git show <hash>는 한 커밋을 전체로 표시합니다: 누가 만들었는지, 언제, 그리고 실제로 변경한 줄입니다. 제거된 줄은 빼기 기호로 시작하고, 추가된 줄은 더하기 기호로 시작합니다. "이 커밋이 실제로 무엇을 했는가"라는 질문에 답하는 가장 빠른 방법입니다. git diff가 보여주는 것, 그리고 거의 모두가 맞는 함정
git log와 git show는 커밋된 히스토리를 읽습니다. git diff는 아직 커밋되지 않은 것을 읽습니다: 지금 작업 디렉토리에 있는 변경사항을 마지막 커밋과 비교합니다.
$ git diff
diff --git a/README.md b/README.md
index 1c2d3e4..9f8a7b6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# weather-app
+순수 자바스크립트로 만든 5일 날씨 대시보드.이것은 README.md에 대한 편집입니다. 아무것도 스테이징하거나 커밋하기 전에 표시됩니다. 첫 주에 거의 모두를 잡는 부분이 여기 있습니다: git add .를 실행하여 같은 변경사항을 스테이징한 다음, git diff를 다시 실행하면 전혀 아무것도 표시되지 않습니다.
$ git add .
$ git diff아무것도 출력되지 않습니다. 편집이 사라지지 않았고, 아무것도 잘못되지 않았습니다. 평문 git diff는 작업 디렉토리를 스테이징 영역과 비교하며, 모든 것을 스테이징했으면 이 둘은 이제 일치하므로 거기서 더 이상 보여줄 차이가 없습니다. 스테이징 영역에서 대기 중인 변경사항을 보려면 대신 git diff --staged를 사용하세요.
$ git diff --staged
diff --git a/README.md b/README.md
index 1c2d3e4..9f8a7b6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# weather-app
+순수 자바스크립트로 만든 5일 날씨 대시보드.같은 변경사항, 이제 보입니다. --staged가 스테이징 영역을 마지막 커밋과 비교하기 때문입니다.
git diff는 아직 스테이징되지 않은 작업 디렉토리의 편집을 표시합니다. git add로 모든 것을 스테이징하면, 평문 git diff는 조용해집니다. 이것은 예상된 것이며, 변경사항은 여전히 있습니다. git diff --staged를 사용하여 커밋을 기다리고 있는 것을 보세요. Git 히스토리가 그래프를 형성하는 이유
지금까지 본 모든 커밋은 정확히 한 부모를 가리키며, 위에서 아래로 git log를 읽는 것이 직선을 읽는 것처럼 느껴졌습니다. 이것은 작업의 한 줄에서 작동하는 솔로 프로젝트에 적용됩니다. 브랜치와 병합이 그림에 들어오는 순간 그것은 멈춥니다. 다음 브랜치에서 다루어집니다. 프로젝트의 실제 히스토리는 별도의 줄로 분할되고 다시 함께 올 수 있기 때문입니다.

