Thursday, March 24, 2022

Git 로그, 더 똑똑하게 활용하기: 포맷팅부터 검색까지

소프트웨어 개발에서 버전 관리 시스템 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