git log 명령어는 Git 저장소의 커밋 기록을 보여줍니다. 기본적으로 커밋 해시, 커밋 메시지 및 기타 커밋 메타데이터를 표시하며, 다양한 옵션을 통해 출력 결과를 필터링할 수 있습니다.
버전 관리 시스템의 핵심 목적은 코드베이스가 시간에 따라 어떻게 변화하는지 기록하는 것입니다. 이를 통해 프로젝트가 어떻게 발전해 왔는지 확인할 수 있고, 누가 프로젝트에 기여했으며 어떤 변경 사항이 언제 적용되었는지 파악할 수 있습니다.
하지만 Git 저장소에 축적된 히스토리를 실제로 어떻게 확인할 수 있을까요? 바로 그 지점에서 git log 명령어가 유용하게 사용됩니다.
이 글에서는 예제와 함께 git log 명령어의 기본 개념과 Git 저장소를 살펴보는 방법을 자세히 알아보겠습니다.
git log 명령어란?
git log 명령어는 저장소에 수행된 모든 커밋 목록을 보여줍니다. 각 Git 커밋의 해시값, 커밋 메시지, 그리고 기타 메타데이터를 확인할 수 있어 저장소의 히스토리를 표시하는 데 매우 유용합니다.
git status 명령어가 현재 작업 디렉토리의 상태에 초점을 맞춘다면, git log는 저장소의 전체 히스토리를 볼 수 있게 해준다는 차이가 있습니다.
git log 명령어 사용 예시
예제를 통해 git log 명령어의 동작 방식을 살펴보겠습니다. 'demo-repository'라는 저장소에서 작업 중이며, 이제 저장소에 푸시된 모든 커밋 목록을 확인하고 싶다고 가정해 봅시다. 이 경우 다음 명령어를 사용할 수 있습니다.
git log 명령어는 저장소에 수행된 모든 커밋 목록을 반환합니다. 다음은 이 명령어가 반환하는 단일 커밋의 예시입니다:
commit 43433c674e3d6c86a889fad222dae179785893cf (HEAD -> master, origin/master, origin/HEAD)
Author: James Gallagher <37276661+jamesgallagher432@users.noreply.github.com>
Date: Tue Apr 7 13:09:58 2020 +0100
Update index.html
이 출력 결과를 하나씩 살펴보겠습니다. git log 명령어가 반환하는 각 항목에는 다음 정보가 포함됩니다:
- 커밋의 SHA 해시: Secure Hash Algorithm 해시로, 저장소 내 각 커밋을 고유하게 식별하는 데 사용됩니다. 위 예시에서는 '43433c674e3d6c86a889fad222dae179785893cf'였습니다.
- 커밋 작성자: 위 예시에서는 James Gallagher이며, 작성자의 이메일 주소도 함께 표시됩니다.
- 커밋 푸시 날짜: 위 예시에서는 4월 7일 화요일이었습니다.
- 커밋 메시지: 위 예시에서 반환된 커밋 메시지는 'Update index.html'였습니다.
이 모든 데이터는 저장소의 커밋에 대한 유용한 정보를 제공합니다.
git log 출력 결과 필터링하기
기본적으로 git log는 위에서 설명한 구조로 저장소의 모든 커밋 목록을 반환합니다. 커밋 수가 많아지면 로그를 읽는 것이 점점 어려워질 수 있습니다.
다행히도 git log에는 로그를 필터링할 수 있는 다양한 플래그가 내장되어 있습니다. 하나씩 살펴보겠습니다.
최근 커밋으로 필터링
특정 개수의 커밋만 반환하고 싶다면 -n 플래그를 사용하면 됩니다. 예를 들어 아래 명령어는 가장 최근의 3개 커밋 목록을 반환합니다.
git log -n 3
작성자(Author) 또는 커미터(Committer)로 필터링
변경 사항을 작성하거나 커밋한 사람을 기준으로 결과를 필터링할 수도 있습니다. 'John Smith'가 푸시한 커밋 목록을 확인하고 싶다면 다음 명령어를 사용합니다:
git log --author="John Smith"
git log --committer="John Smith"
--author 플래그는 John Smith가 작성한 변경 사항이 포함된 커밋으로 결과를 제한하고, --committer 플래그는 실제로 해당 인물이 커밋한 커밋으로 결과를 제한합니다.
대부분의 경우 작성자와 커미터는 동일인입니다. 하지만 규모가 큰 프로젝트에서는 커밋 작성자가 반드시 그 변경 사항을 저장소에 푸시하는 사람은 아닐 수 있습니다. 바로 이런 이유로 두 플래그가 존재하는 것입니다.
날짜로 필터링
날짜를 기준으로도 결과를 필터링할 수 있습니다. 이때 --before와 --after 플래그를 사용하며, 두 플래그 모두 다양한 날짜 형식을 지원하지만 가장 많이 쓰이는 것은 상대 참조(relative reference)와 전체 날짜 형식입니다.
2019년 3월 2일 이후의 커밋 목록을 가져오고 싶다면 다음 명령어를 사용합니다:
git log --after="2019-3-2"
마찬가지로 어제 이전의 커밋 목록을 가져오고 싶다면 상대적인 값('yesterday')을 지정하여 다음과 같이 사용할 수 있습니다:
git log --before="yesterday"
2019년 3월 2일 이후부터 2019년 3월 19일 이전 사이에 게시된 커밋 목록을 원한다면, 두 플래그를 조합하여 사용하면 됩니다:
git log --after="2019-3-2" --before="2019-3-19"
파일로 필터링
git log를 사용할 때 특정 파일에 영향을 준 커밋만 확인하고 싶은 경우가 있습니다. 이때는 변경 내역을 보고 싶은 파일 경로를 직접 지정하면 됩니다.
코드에서 'main.py' 파일에 대한 변경 사항을 확인하고 싶다면 다음 명령어를 사용합니다:
git log -- main.py
-- 구분자는 지정된 인수가 브랜치 이름이 아니라 파일 경로임을 git log에 알려주는 역할을 합니다.
위 명령어에서는 하나의 파일만 지정했지만, 필요하다면 여러 파일을 동시에 지정할 수도 있습니다.
내용으로 필터링
특정 코드 라인이 추가되거나 삭제된 커밋을 검색할 수도 있습니다.
예를 들어 '# Introduction'이라는 문구가 코드에 추가된 모든 커밋을 찾고 싶다면 다음 명령어를 사용합니다:
git log -S"# Introduction"
-S 플래그는 커밋 목록에서 어떤 변경 내용을 찾을지 지정하는 데 사용됩니다. 주의할 점은 -S 플래그와 검색어 사이에 공백이나 등호가 없다는 것, 그리고 검색할 커밋 내용을 큰따옴표로 감싸야 한다는 점입니다.
커밋 범위로 필터링
since와 until 매개변수를 사용하여 특정 범위의 커밋을 git log에 전달할 수 있습니다. 문법은 다음과 같습니다:
git log since..until
b72beb5 커밋 이후부터 b53b22d 커밋까지의 커밋 목록을 가져오고 싶다면 다음과 같이 사용합니다:
git log b72beb5..b53b22d
이 명령어는 b72beb5와 b53b22d 커밋 사이의 모든 커밋 목록을 반환합니다.
메시지로 필터링
--grep 플래그를 사용하면 커밋 메시지를 기준으로 결과를 필터링할 수 있습니다.
예를 들어 이름이 'feat:'으로 시작하는 모든 커밋 목록을 반환하고 싶다면 다음 코드를 사용합니다:
git log --grep="feat:"
이 명령어는 메시지가 'feat:'으로 시작하는 모든 커밋 목록을 반환합니다.
git log 출력 결과 서식 지정하기
앞선 섹션에서는 git log 명령어의 전체 출력 결과를 살펴봤습니다. 이 출력에는 커밋의 SHA, 작성자, 푸시 날짜, 커밋 메시지가 모두 포함되어 있었습니다.
이러한 정보가 모두 유용하지만, 때로는 특정 데이터만 필요한 경우가 많습니다. 다행히 git log에는 출력 형식을 조절할 수 있는 여러 플래그가 마련되어 있습니다.
간결한 로그 반환하기
기본적으로 git log는 각 커밋에 대한 전체 로그 항목을 반환합니다. --oneline 플래그를 사용하면 커밋 ID와 해당 커밋 메시지만 간결하게 확인할 수 있습니다.
--oneline 플래그의 문법은 다음과 같습니다:
git log --oneline
앞서 사용한 저장소에서 실행하면 다음과 같은 결과가 반환됩니다:
43433c6 (HEAD -> master, origin/master, origin/HEAD) Update index.html
a7d8dc2 docs: Update README.md
b53b22d feat: Update website
3b16026 feat: Launch new homepage
b72beb5 first commit
커밋 ID와 커밋 메시지의 첫 줄만 표시되므로, 전체 메타데이터를 보여주는 기본 출력보다 훨씬 읽기 편합니다. 각 항목이 한 줄로 표현되기 때문에 불필요한 정보 없이 커밋 현황을 빠르게 파악할 수 있는 실용적인 기법입니다.
참조 정보 표시하기
--decorate 플래그를 사용하면 특정 커밋을 가리키는 모든 참조(브랜치, 태그 등)를 확인할 수 있습니다. 문법은 다음과 같습니다:
git log --decorate
실행 결과는 다음과 같습니다:
43433c6 (HEAD -> master, origin/master, origin/HEAD) Update index.html
a7d8dc2 docs: Update README.md
b53b22d feat: Update website
3b16026 (tag: v1) feat: Launch new homepage
b72beb5 first commit
목록의 네 번째 커밋에 태그 이름 '(tag: v1)'이 표시된 것을 볼 수 있습니다. --decorate 플래그가 커밋 히스토리의 각 커밋과 연관된 참조 정보를 드러내기 때문입니다.
변경 통계(Diff) 확인하기
--stat 플래그를 사용하면 각 커밋에서 저장소에 추가되거나 삭제된 코드 라인 수를 표시할 수 있습니다. 다음은 git log --stat 명령어의 실행 예시입니다:
Author: James Gallagher <james@users.noreply.github.com>
Date: Mon Apr 6 09:11:46 2020 +0100
feat: Update website
index.html | 1 +
index.js | 0
2 files changed, 1 insertion(+)
플러스 기호(+)는 추가된 라인을 의미하며, 삭제된 라인이 있다면 마이너스 기호(-)로 표시됩니다. 이 데이터를 통해 저장소에 가해진 전체적인 변경 사항을 더 깊이 이해할 수 있습니다.
저장소에 가해진 정확한 변경 내용까지 확인하고 싶다면 -p 플래그를 사용하세요. 이 플래그는 커밋에서 수행된 변경 사항을 더욱 상세하게 보여주는 diff를 반환합니다.
다음은 예제 저장소에서 git log -p 명령어를 실행했을 때 반환되는 항목의 예시입니다:
Author: James Gallagher <37276661+jamesgallagher432@users.noreply.github.com>
Date: Tue Apr 7 13:09:58 2020 +0100
Update index.html
diff --git a/index.html b/index.html
index f45673f..2d2701d 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,3 @@
-This is a file.
-Changes have been made.
+<body>
+ <p>This is a website.</p>
+</body>
이 출력 결과는 커밋에 대한 설명과 함께 커밋에서 수행된 각 변경 사항의 세부 내역을 모두 보여줍니다. 누가 언제 저장소의 파일에서 내용을 추가하거나 삭제했는지 확인할 수 있습니다.
다만 이 데이터는 유용하지만, 표시할 커밋이 많으면 출력을 읽기 어려워질 수 있습니다. 이 경우 앞서 소개한 다른 플래그들을 함께 조합해서 사용하면, 반환되는 정보가 종합적이면서도 읽기 쉽게 유지됩니다.
Git diff에 대해 더 알고 싶다면 git diff 명령어 가이드를 참고하세요.
git shortlog 명령어
git shortlog 명령어는 git log의 요약 버전을 제공합니다. 출력 결과가 작성자별로 그룹화되기 때문에 누가 저장소에 어떤 변경을 했는지 한눈에 파악할 수 있습니다.
앞서 사용한 저장소에서 git shortlog를 실행해 보겠습니다:
James Gallagher (5):
first commit
feat: Launch new homepage
feat: Update website
docs: Update README.md
Update index.html
이 저장소에는 James만 기여했으며 총 5번의 커밋을 수행했습니다. 만약 다른 기여자가 있다면, 그들의 기여 내역과 저장소에 푸시한 총 커밋 수도 함께 여기에 표시됩니다.
마무리
git log 명령어는 저장소에 어떤 변경이 이루어졌는지, 누가 언제 수행했는지 보여줍니다. 또한 출력 결과를 필터링하여 꼭 필요한 정보만 표시할 수 있습니다.
git log의 플래그는 크게 두 가지 유형으로 나뉩니다. 하나는 로그의 출력 형식을 지정하는 플래그이고, 다른 하나는 명령어가 반환하는 커밋을 필터링하는 데 도움을 주는 플래그입니다.
이 글에서는 예제와 함께 git log 사용법과 가장 자주 사용되는 플래그들을 살펴봤습니다. git log는 Git을 활용할 때 반드시 익혀야 할 중요한 도구입니다. 이 명령어를 효과적으로 사용할 줄 알게 되면 Git 저장소를 분석하는 달인이 될 수 있습니다!
Git에 대해 더 배우고 싶다면 'How to Learn Git' 가이드를 참고해 보세요.