소프트웨어 개발에서 버전 관리 시스템 Git은 이제 선택이 아닌 필수입니다. 그리고 Git의 수많은 기능 중 프로젝트의 과거를 들여다보고, 변경 사항을 추적하며, 문제의 원인을 파악하는 데 가장 핵심적인 역할을 하는 것이 바로 git log
명령어입니다. 하지만 단순히 git log
만 입력했을 때 나타나는 방대한 텍스트의 장벽에 부딪혀 그 강력함을 제대로 활용하지 못하는 경우가 많습니다. 이 글에서는 기본 git log
의 한계를 넘어, 원하는 정보만 깔끔하게 확인하는 포맷팅 방법부터 특정 커밋을 정확히 찾아내는 필터링 기술, 그리고 이 모든 것을 나만의 명령어로 만드는 Git Alias 설정까지, git log
를 120% 활용하는 전문가적인 방법을 상세히 다룹니다.
1. `git log`의 기본, 그리고 그 한계
가장 먼저, 아무런 옵션 없이 git log
를 실행했을 때 어떤 정보가 출력되는지 살펴보겠습니다. 터미널에 이 명령어를 입력하면 현재 브랜치의 커밋 내역이 시간의 역순(가장 최신 커밋이 맨 위)으로 나타납니다.
commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 (HEAD -> main, origin/main)
Author: Jane Doe <jane.doe@example.com>
Date: Mon Oct 26 15:30:10 2023 +0900
feat: Add user authentication feature
- Implement user login and registration API
- Add JWT-based token authentication
commit f1e2d3c4b5a6f7e8d9c0a1b2c3d4e5f6a7b8c9d0
Author: John Smith <john.smith@example.com>
Date: Fri Oct 23 11:20:45 2023 +0900
fix: Correct calculation error in payment module
The tax calculation was incorrect under certain conditions.
This commit resolves the issue.
기본 출력은 다음과 같은 유용한 정보를 포함합니다:
- Commit Hash: 각 커밋을 고유하게 식별하는 40자리의 SHA-1 해시값입니다.
- Author: 커밋을 작성한 사람의 이름과 이메일 주소입니다.
- Date: 커밋이 작성된 날짜와 시간입니다.
- Commit Message: 커밋에 대한 설명(제목과 본문)입니다.
이 정보들은 분명 중요하지만, 프로젝트의 규모가 커지고 커밋 히스토리가 길어지면 몇 가지 문제에 직면하게 됩니다. 한 화면에 고작 한두 개의 커밋밖에 볼 수 없어 전체적인 흐름을 파악하기 어렵고, 너무 많은 정보가 한꺼번에 출력되어 정작 내가 원하는 정보를 찾기가 힘들어집니다. 이제부터 이 문제를 해결하는 다양한 옵션들을 알아보겠습니다.
2. 한눈에 보는 커밋 히스토리: 유용한 기본 옵션들
Git은 로그 출력을 간결하게 만들거나 추가적인 정보를 보여주는 여러 편리한 옵션을 제공합니다. 복잡한 포맷팅에 들어가기 전에, 가장 자주 사용되는 옵션들부터 익혀보겠습니다.
--oneline
: 한 줄로 깔끔하게
각 커밋을 한 줄로 요약해서 보여주는 가장 인기 있는 옵션입니다. 커밋 해시의 앞 7자리와 커밋 메시지의 제목만 간결하게 출력하여 전체적인 작업 흐름을 빠르게 파악하는 데 매우 유용합니다.
git log --oneline
a1b2c3d (HEAD -> main, origin/main) feat: Add user authentication feature
f1e2d3c fix: Correct calculation error in payment module
...
--graph
: 브랜치와 병합 히스토리 시각화
여러 브랜치에서 작업하고 병합(merge)하는 일이 잦은 프로젝트에서 --graph
옵션은 필수적입니다. 이 옵션은 커밋 히스토리를 아스키(ASCII) 문자로 그린 그래프와 함께 보여주어, 브랜치가 어떻게 생성되고, 분기되고, 다시 병합되었는지 직관적으로 이해할 수 있게 도와줍니다.
git log --graph --oneline
* a1b2c3d (HEAD -> main) feat: Merge feature branch
|\
| * 8f9e0d1 (feature/new-login) feat: Add social login
| * 7c6b5a4 feat: Refactor login form
* | 5a4b3c2 fix: Update documentation
|/
* f1e2d3c fix: Correct calculation error
...
위 예시처럼 --oneline
옵션과 함께 사용하면 가독성이 극대화됩니다.
--stat
: 변경된 파일과 내용 요약
각 커밋에서 어떤 파일이 변경되었고, 얼마나 많은 라인이 추가/삭제되었는지 요약 정보를 보고 싶을 때 --stat
(statistics) 옵션을 사용합니다.
git log --stat
commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
Author: Jane Doe <jane.doe@example.com>
Date: Mon Oct 26 15:30:10 2023 +0900
feat: Add user authentication feature
src/controllers/authController.js | 55 +++++++++++++++++++
src/routes/authRoutes.js | 12 ++++
2 files changed, 67 insertions(+)
-p
또는 --patch
: 실제 변경 내용(diff) 확인
--stat
을 넘어 각 커밋의 실제 코드 변경 내용(diff)까지 확인하고 싶다면 -p
옵션을 사용합니다. 어떤 코드가 추가되고 삭제되었는지 라인 단위로 상세하게 보여주기 때문에, 특정 변경 사항을 정밀하게 분석할 때 유용합니다.
git log -p -1
위 명령어는 가장 최신 커밋 1개에 대한 패치(변경 내용)를 보여줍니다.
3. 나만의 로그 포맷 만들기: `--pretty=format` 완전 정복
기본 옵션만으로도 충분히 유용하지만, 때로는 내가 원하는 정보만 조합하여 완전히 새로운 형식으로 로그를 보고 싶을 때가 있습니다. 이럴 때 사용하는 것이 바로 --pretty=format:"<포맷 문자열>"
옵션입니다. 이 옵션을 사용하면 Git이 제공하는 다양한 '플레이스홀더(placeholder)'를 조합하여 출력 형식을 자유자재로 커스터마이징할 수 있습니다.
주요 포맷 플레이스홀더
다음은 --pretty=format
에서 사용할 수 있는 유용한 플레이스홀더 목록입니다.
플레이스홀더 | 설명 |
---|---|
%H |
전체 커밋 해시 (40자리) |
%h |
축약된 커밋 해시 (보통 7자리) |
%T |
전체 트리 해시 |
%t |
축약된 트리 해시 |
%P |
전체 부모 커밋 해시 |
%p |
축약된 부모 커밋 해시 |
%an |
작성자(Author) 이름 |
%ae |
작성자 이메일 |
%ad |
작성일 (--date 옵션 형식에 따름) |
%ar |
작성일 (상대적인 시간, 예: '2주 전') |
%cn |
커미터(Committer) 이름 |
%ce |
커미터 이메일 |
%cd |
커밋일 |
%cr |
커밋일 (상대적인 시간) |
%s |
커밋 메시지 제목 |
%b |
커밋 메시지 본문 |
%d |
브랜치나 태그 등 참조 이름 (예: `(HEAD -> main, tag: v1.0)`) |
%C(<color>) |
이어지는 텍스트의 색상을 지정 (예: `red`, `green`, `blue`, `reset`) |
%n |
줄바꿈 문자 |
💡 Author vs Committer
작성자(Author)는 원래 코드를 작성한 사람이고, 커미터(Committer)는 그 코드를 프로젝트에 최종적으로 반영(커밋)한 사람입니다. 대부분의 경우 두 사람은 동일하지만, 다른 사람의 패치를 적용(apply)하거나 리베이스(rebase)하는 경우 달라질 수 있습니다. 예를 들어, 오픈 소스 프로젝트에서 A가 보낸 패치를 관리자인 B가 대신 커밋하면, Author는 A, Committer는 B가 됩니다.
실용적인 포맷팅 예제
이론만으로는 와닿지 않을 수 있으니, 실제 유용한 예제들을 살펴보겠습니다.
예제 1: 기본적이면서도 향상된 로그
원문에서 소개된 형식으로, 축약 해시, 작성자, 상대적 작성일, 커밋 제목을 보여줍니다. 가장 일반적으로 사용하기 좋은 포맷입니다.
git log --pretty=format:"%h - %an, %ar : %s"
a1b2c3d - Jane Doe, 2 days ago : feat: Add user authentication feature
f1e2d3c - John Smith, 5 days ago : fix: Correct calculation error in payment module
예제 2: 색상과 참조 이름을 포함한 상세 로그
여기에 색상과 브랜치 정보를 추가하여 가독성을 한층 더 높일 수 있습니다.
git log --graph --pretty=format:"%C(yellow)%h%C(reset) -%C(red)%d%C(reset) %s %C(green)(%cr) %C(bold blue)<%an>%C(reset)"
* a1b2c3d - (HEAD -> main) feat: Add user authentication feature (2 days ago) <Jane Doe>
* f1e2d3c - fix: Correct calculation error in payment module (5 days ago) <John Smith>
이 명령어는 다음과 같은 정보를 시각적으로 구분하여 보여줍니다.
- 커밋 해시: 노란색
- 브랜치/태그 정보: 빨간색
- 커밋 제목: 기본색
- 커밋 시간: 초록색
- 작성자: 굵은 파란색
4. 원하는 커밋만 쏙쏙 골라보기: 로그 필터링
아무리 로그를 예쁘게 포맷팅해도, 수천 개의 커밋이 쌓인 프로젝트에서는 원하는 정보를 찾기 어렵습니다. Git은 강력한 필터링 옵션을 제공하여 특정 조건에 맞는 커밋만 골라볼 수 있게 해줍니다.
작성자(Author) 또는 커미터(Committer)로 필터링
특정 팀원이 작업한 내역만 확인하고 싶을 때 사용합니다.
git log --author="Jane Doe"
이메일의 일부나 이름의 일부만으로도 검색이 가능합니다.
git log --committer="smith"
날짜로 필터링
특정 기간 동안의 작업 내역을 확인할 때 매우 유용합니다.
--since
/--after
: 특정 날짜 이후의 커밋만 표시합니다.--until
/--before
: 특정 날짜 이전의 커밋만 표시합니다.
다양한 형식의 날짜 표현을 이해합니다.
git log --since="2023-10-01" --until="2023-10-31"
git log --since="2 weeks ago"
git log --after="yesterday"
커밋 메시지로 필터링
커밋 메시지에 특정 키워드가 포함된 커밋을 찾고 싶을 때 --grep
옵션을 사용합니다. 예를 들어, 'bug'나 'fix'와 관련된 모든 커밋을 찾을 수 있습니다.
git log --grep="login"
기본적으로 대소문자를 구분하지만, -i
옵션을 추가하면 대소문자를 무시하고 검색합니다.
git log --grep="auth" -i
파일 및 경로로 필터링
특정 파일이나 디렉토리의 변경 이력만 추적하고 싶을 때 사용합니다. 명령어 마지막에 --
를 붙이고 파일 경로를 지정합니다.
git log -- src/services/paymentService.js
이 명령은 paymentService.js
파일에 변경을 가한 모든 커밋의 히스토리를 보여줍니다.
커밋 범위로 필터링
두 브랜치 또는 커밋 사이의 차이를 확인할 때 사용합니다.
git log main..feature/new-feature
위 명령어는 `main` 브랜치에는 없고 `feature/new-feature` 브랜치에만 있는 커밋들을 보여줍니다. Pull Request를 보내기 전 변경 사항을 리뷰할 때 아주 유용합니다.
5. 전문가처럼 Git 사용하기: Git Alias로 나만의 명령어 만들기
지금까지 배운 멋진 포맷과 필터링 옵션들은 매우 강력하지만, 매번 이렇게 긴 명령어를 입력하는 것은 비효율적입니다. Git의 'Alias(별칭)' 기능을 사용하면 이 긴 명령어를 나만의 짧은 명령어로 만들어 저장해둘 수 있습니다.
예를 들어, 위에서 만들었던 화려한 색상의 그래프 로그 명령어를 git lg
라는 명령어로 만들어 보겠습니다.
터미널에 다음 명령어를 입력하세요.
git config --global alias.lg "log --graph --pretty=format:'%C(yellow)%h%C(reset) -%C(red)%d%C(reset) %s %C(green)(%cr) %C(bold blue)<%an>%C(reset)' --abbrev-commit"
--global
옵션은 이 설정을 현재 컴퓨터의 모든 Git 저장소에 적용하라는 의미입니다. 이제 어떤 프로젝트 폴더에서든 터미널에 git lg
만 입력하면, 우리가 정의한 아름다운 로그가 출력됩니다.
이 설정은 홈 디렉토리의 .gitconfig
파일에 저장됩니다. 직접 이 파일을 열어 수정하거나 더 복잡한 별칭을 추가할 수도 있습니다.
[alias]
lg = log --graph --pretty=format:'%C(yellow)%h%C(reset) -%C(red)%d%C(reset) %s %C(green)(%cr) %C(bold blue)<%an>%C(reset)' --abbrev-commit
st = status -s
co = checkout
br = branch
결론: 히스토리를 지배하는 자가 프로젝트를 지배한다
git log
는 단순히 과거를 기록하는 도구가 아닙니다. 어떻게 활용하느냐에 따라 프로젝트의 흐름을 한눈에 파악하는 대시보드가 될 수도 있고, 버그의 근원을 찾아내는 탐정의 돋보기가 될 수도 있습니다. 처음에는 기본 git log
로 시작하더라도, 점차 --oneline
, --graph
와 같은 옵션에 익숙해지고, 나아가 --pretty=format
으로 자신만의 로그 스타일을 만드세요. 마지막으로, 자주 사용하는 명령어는 반드시 alias
로 등록하여 생산성을 극대화하는 습관을 들이는 것이 좋습니다. 이 글에서 다룬 기술들을 꾸준히 사용하다 보면, 복잡하게 얽힌 프로젝트의 히스토리도 손바닥 위에 올려놓고 보듯 명확하게 이해하게 될 것입니다. 즐거운 코딩 되세요!
0 개의 댓글:
Post a Comment