Git 그래프 시각화

브랜치와 커밋 히스토리를 효과적으로 시각화하는 방법

Git의 복잡한 브랜치 구조와 커밋 히스토리를 그래프로 시각화하는 다양한 방법을 알아본다. 터미널에서의 기본 명령어부터 GUI 도구까지, 프로젝트 히스토리를 효과적으로 파악하기 위한 기법들을 소개한다.

Engineering
Git
저자

Kwangmin Kim

공개

2023년 05월 06일

1 Git 그래프 시각화 개요

Git의 브랜치와 커밋 히스토리를 시각적으로 확인하는 것은 프로젝트의 흐름을 이해하고 복잡한 병합 작업을 수행하는 데 필수적이다. 특히 여러 개발자가 협업하는 프로젝트에서는 브랜치 관계를 명확히 파악하는 것이 중요하다.

1.1 그래프 시각화가 필요한 상황

  • 여러 브랜치의 병합 지점 확인
  • 특정 기능의 개발 히스토리 추적
  • 버그가 도입된 시점 파악
  • 릴리스 버전 간의 차이점 분석
  • 팀원의 작업 흐름 이해

2 터미널에서 그래프 시각화하기

2.1 기본 그래프 명령어

# 모든 브랜치의 커밋 히스토리를 그래프로 보기  
git log --oneline --graph --all --decorate  

이 명령어는 다음 옵션들을 조합한다:

  • --oneline: 각 커밋을 한 줄로 간결하게 표시
  • --graph: ASCII 아트로 브랜치와 병합 히스토리를 그래프로 표현
  • --all: 모든 브랜치의 커밋을 표시
  • --decorate: 브랜치명과 태그 등 참조를 함께 표시

2.2 출력 예시

* a123456 (HEAD -> main) 최신 기능 추가  
| * b789012 (feature/login) 로그인 페이지 개선  
| * c345678 로그인 기능 구현 시작  
|/  
* d901234 (tag: v1.0.0) 첫 번째 릴리스  
* e567890 초기 커밋  

2.3 커스터마이징 옵션

더 상세하거나 특화된 그래프 출력을 위한 추가 옵션들:

# 날짜와 작성자 정보 포함  
git log --graph --all --format="%h %ad %s (%an)" --date=short  
* a123456 2024-01-15 최신 기능 추가 (Alice)
| * b789012 2024-01-14 로그인 페이지 개선 (Bob)
| * c345678 2024-01-13 로그인 기능 구현 시작 (Bob)
|/
* d901234 2024-01-10 첫 번째 릴리스 (Alice)

%h는 짧은 커밋 해시, %ad는 작성 날짜(--date=shortYYYY-MM-DD 형식), %s는 커밋 메시지 첫 줄, %an은 작성자 이름이다.

# 특정 기간 내의 커밋만 표시  
git log --graph --all --since="2 weeks ago"  
* a123456 (HEAD -> main) 최신 기능 추가
| * b789012 (feature/login) 로그인 페이지 개선
|/
* c345678 2주 전 커밋

2주 이전 커밋은 출력에서 잘린다. --until="1 week ago" 와 조합하면 기간 범위를 지정할 수 있다.

# 특정 파일의 변경 히스토리만 그래프로 보기  
git log --graph --all --oneline -- path/to/file  

-- 뒤에 파일 경로를 지정하면 해당 파일을 수정한 커밋만 필터링된다.

# 브랜치 간의 차이점 시각화  
git log --graph --left-right --boundary main...feature  
> a123456 (HEAD -> main) main 전용 커밋
< b789012 (feature) feature 전용 커밋
< c345678 feature 전용 커밋 2
o d901234 공통 조상 (boundary)

> 는 좌측 브랜치(main)에만 있는 커밋, < 는 우측 브랜치(feature)에만 있는 커밋, o--boundary 옵션으로 표시되는 공통 조상 커밋이다. 두 브랜치가 서로 얼마나 벌어졌는지 한눈에 파악할 수 있다.

2.4 별칭(Alias) 설정하기

자주 사용하는 그래프 명령어는 Git 별칭으로 설정하면 편리하다:

# 별칭 설정  
git config --global alias.graph "log --oneline --graph --all --decorate"  

# 사용법  
git graph  
* a123456 (HEAD -> main) 최신 기능 추가
| * b789012 (origin/feature/login, feature/login) 로그인 페이지 개선
| * c345678 로그인 기능 구현 시작
|/
* d901234 (tag: v1.0.0, origin/main) 첫 번째 릴리스
* e567890 초기 커밋

괄호 안의 참조들은 --decorate 옵션으로 표시된다. origin/main 은 원격 추적 브랜치, tag: v1.0.0 은 태그, HEAD -> 는 현재 체크아웃된 브랜치를 나타낸다.

3 고급 그래프 시각화 기법

3.1 브랜치 비교 시각화

두 브랜치 사이의 차이점을 시각화하는 방법:

# main과 feature 브랜치 사이의 차이 시각화  
git log --graph --oneline main...feature  
* b789012 (feature) 로그인 페이지 개선
* c345678 로그인 기능 구현 시작
* a123456 (main) 최신 기능 추가

... (점 3개) 는 두 브랜치 중 한쪽에만 있는 커밋을 모두 보여주는 대칭 차이(symmetric difference)이다. .. (점 2개) 는 우측 브랜치에만 있는 커밋만 보여준다.

# 공통 조상 이후의 변경사항만 보기  
git log --graph --oneline main...feature --not $(git merge-base main feature)  

공통 조상 커밋을 git merge-base로 찾아 제외시키는 기법이다. 두 브랜치가 갈라진 이후의 변경사항만 정확히 파악할 수 있다.

3.2 특정 커밋 범위 시각화

# 특정 태그 사이의 커밋 그래프  
git log --graph --oneline v1.0.0..v2.0.0  
* f432109 버전 2.0.0 릴리스
* e123456 기능 C 추가
* d789012 기능 B 추가
* c345678 버전 1.x 패치

v1.0.0..v2.0.0 은 v1.0.0 이후부터 v2.0.0까지의 커밋을 의미한다. v1.0.0 자체는 포함되지 않는다.

# 특정 커밋 이후의 변경사항  
git log --graph --oneline 3a4b5c6..HEAD  

HEAD 는 현재 브랜치의 마지막 커밋이다. 특정 커밋 해시 이후 지금까지의 변경 내역만 볼 때 유용하다.

3.3 병합 커밋 처리 옵션

# 병합 커밋 제외하기  
git log --graph --oneline --no-merges  
* f432109 기능 D 완성
* c345678 기능 C 완성
* d901234 초기 기능 구현
# 병합 커밋만 보기  
git log --graph --oneline --merges  
*   a123456 (HEAD -> main) Merge branch 'feature/login'
*   b789012 Merge branch 'hotfix/1.0.1'

--no-merges--merges 는 서로 반대 필터이다. --no-merges 는 실제 작업 커밋만 볼 때, --merges 는 통합 이력만 추적할 때 사용한다.

4 GUI 도구를 통한 그래프 시각화

터미널 명령어는 강력하지만, 복잡한 프로젝트에서는 GUI 도구가 더 직관적인 시각화를 제공할 수 있다.

4.1 내장 GUI 도구

# Git 내장 GUI 실행  
gitk --all  

# Git GUI 실행  
git gui  

4.2 인기 있는 외부 GUI 도구

  • GitKraken: 직관적인 인터페이스와 강력한 그래프 시각화 기능
  • Sourcetree: Atlassian에서 제공하는 무료 Git 클라이언트
  • GitHub Desktop: GitHub 연동에 최적화된 간편한 도구
  • VSCode의 Git Graph 확장: 에디터 내에서 그래프 시각화
  • GitLens: VSCode 확장으로, 코드 라인별 히스토리 시각화 제공

4.3 IDE 통합 도구

대부분의 현대 IDE는 Git 그래프 시각화 기능을 내장하고 있다:

  • IntelliJ IDEA/PyCharm: Git 탭에서 로그 그래프 제공
  • Visual Studio: Team Explorer에서 히스토리 시각화
  • Eclipse: EGit 플러그인을 통한 히스토리 뷰

5 실전 활용 사례

5.1 Git Flow 모델 시각화

Git Flow 브랜칭 모델을 사용하는 프로젝트의 그래프 예시:

* a123456 (HEAD -> main) 버전 2.0.0 릴리스  
|\  
| * b789012 (release/2.0.0) 릴리스 준비  
| |\  
| | * c345678 (feature/login) 로그인 기능 완성  
| | * d901234 로그인 UI 개선  
| |/  
| * e567890 버전 번호 업데이트  
|/  
* f432109 (tag: v1.0.0) 버전 1.0.0 릴리스  
|\  
| * g876543 (hotfix/1.0.1) 긴급 버그 수정  
|/  
* h234567 초기 커밋  

5.2 복잡한 병합 시나리오 분석

여러 기능 브랜치가 병합된 복잡한 상황에서의 그래프 분석:

# 특정 병합 커밋의 상세 정보 확인  
git show --graph <merge-commit-hash>  

# 병합 충돌이 발생한 파일 이력 추적  
git log --graph --all -- <conflict-file>  

5.3 리베이스 vs 병합 비교

동일한 작업을 리베이스와 병합으로 각각 처리했을 때의 그래프 차이:

병합을 사용한 경우:

*   a123456 (HEAD -> main) Merge branch 'feature'  
|\  
| * b789012 (feature) 기능 완성  
| * c345678 기능 작업 중  
|/  
* d901234 메인 브랜치 작업  
* e567890 초기 커밋  

리베이스를 사용한 경우:

* f123456 (HEAD -> main) 기능 완성  
* g789012 기능 작업 중  
* d901234 메인 브랜치 작업  
* e567890 초기 커밋  

6 효과적인 그래프 읽기 팁

6.1 그래프 기호 이해하기

  • *: 각 커밋을 나타냄
  • |: 브랜치 라인
  • / 또는 \: 브랜치의 분기 또는 병합 지점
  • |/: 브랜치가 분기되는 지점
  • |\: 브랜치가 병합되는 지점

6.2 복잡한 그래프 분석 전략

  1. 최신 커밋부터 시작: 최신 커밋(HEAD)에서 시작하여 과거로 거슬러 올라가기
  2. 주요 브랜치 식별: main, develop 등 핵심 브랜치 흐름 먼저 파악
  3. 병합 지점 집중: 브랜치가 합쳐지는 지점에 주목하여 통합 흐름 이해
  4. 태그 활용: 릴리스 태그를 기준점으로 삼아 주요 변경사항 파악

7 결론

Git 그래프 시각화는 프로젝트의 역사와 구조를 이해하는 강력한 도구다. 터미널 명령어부터 GUI 도구까지 다양한 방법을 활용하면 복잡한 개발 흐름도 명확하게 파악할 수 있다. 특히 협업 프로젝트에서는 그래프를 통해 팀원들의 작업 맥락을 이해하고, 효과적인 브랜치 전략을 수립하는 데 큰 도움이 된다.

효과적인 Git 그래프 활용은 단순히 명령어를 아는 것을 넘어, 프로젝트의 히스토리를 스토리텔링하는 능력을 키우는 것이다. 이를 통해 코드의 변화 과정을 더 깊이 이해하고, 더 나은 개발 결정을 내릴 수 있다.

Subscribe

Enjoy this blog? Get notified of new posts by email: