소개
Git 시간 여행자 여러분, 환영합니다! 오늘은 Git 프로젝트의 역사를 관통하는 흥미진진한 여정을 떠나보겠습니다. Git 의 가장 강력한 기능 중 하나는 프로젝트의 모든 변화 과정을 추적하고 보여주는 능력입니다. 이 히스토리는 단순히 과거의 기록에 그치지 않고, 프로젝트를 이해하고 디버깅하며 개선하는 데 필요한 강력한 도구가 됩니다.
이 실습에서는 Git 의 역사적 기록을 들여다보는 창인 git log 명령어를 살펴봅니다. 기본적인 사용법부터 시작하여 로그 출력 형식 지정, 날짜별 로그 필터링, 특정 변경 사항 검색, 그리고 프로젝트 히스토리로부터 통계 데이터를 생성하는 고급 기술까지 심도 있게 다룰 것입니다.
실습을 마칠 때쯤이면 여러분은 전문가처럼 프로젝트 히스토리를 탐색하고, 더 효율적인 개발자가 되는 데 필요한 가치 있는 통찰력과 정보를 추출할 수 있게 될 것입니다. 버그를 추적하든, 변경 사항을 검토하든, 혹은 프로젝트가 어떻게 진화해 왔는지 파악하려 하든, 여기서 배우는 기술은 매우 유용할 것입니다.
이제 Git 타임머신에 올라타 과거를 탐험해 봅시다!
작업 공간 설정하기
Git 의 히스토리 기능을 본격적으로 살펴보기 전에, 탐색할 만한 커밋 기록이 있는 작업 공간을 만들어 보겠습니다. 새 디렉토리를 생성하고 Git 저장소를 초기화한 뒤, 몇 개의 커밋을 추가하겠습니다.
터미널을 열고 다음 명령어들을 입력하세요:
cd ~/project
mkdir git-history-lab
cd git-history-lab
git init
이제 다음 명령어들을 복사하여 붙여넣어 파일들을 생성하고 일련의 커밋을 만들어 봅시다:
echo "## Git History Lab" > README.md
git add README.md
git commit -m "Initial commit"
echo "function hello() {" > script.js
echo " console.log('Hello, Git!');" >> script.js
echo "}" >> script.js
git add script.js
git commit -m "Add hello function"
echo "function goodbye() {" >> script.js
echo " console.log('Goodbye, Git!');" >> script.js
echo "}" >> script.js
git add script.js
git commit -m "Add goodbye function"
echo "This is a test file" > test.txt
git add test.txt
git commit -m "Add test file"
echo "hello();" >> script.js
echo "goodbye();" >> script.js
git add script.js
git commit -m "Call hello and goodbye functions"
방금 수행한 작업의 내용은 다음과 같습니다:
- README 파일을 생성하고 첫 번째 커밋을 했습니다.
- "hello" 함수가 포함된 자바스크립트 파일을 만들고 커밋했습니다.
- 같은 파일에 "goodbye" 함수를 추가하고 커밋했습니다.
- 테스트 파일을 추가하고 커밋했습니다.
- 마지막으로 두 함수를 모두 호출하도록 스크립트를 수정하고 변경 사항을 커밋했습니다.
이제 탐색할 히스토리가 있는 저장소가 준비되었습니다!
기본적인 로그 사용법
커밋 히스토리가 준비되었으니, git log의 기본적인 사용법을 알아보겠습니다.
프로젝트의 커밋 히스토리를 확인하려면 다음 명령어를 실행하면 됩니다:
git log
그러면 다음과 유사한 출력이 나타날 것입니다:
commit 1234567890abcdef1234567890abcdef12345678 (HEAD -> main)
Author: Your Name <your.email@example.com>
Date: Mon Jun 5 10:00:00 2023 +0000
Call hello and goodbye functions
commit 2345678901abcdef2345678901abcdef23456789
Author: Your Name <your.email@example.com>
Date: Mon Jun 5 09:45:00 2023 +0000
Add test file
...
로그의 각 항목은 다음 정보를 보여줍니다:
- 전체 커밋 해시 (커밋을 식별하는 고유 식별자)
- 커밋 작성자
- 커밋 날짜 및 시간
- 커밋 메시지
기본적으로 git log는 가장 최근 커밋부터 시작하여 모든 커밋을 보여줍니다. 즉, 역순 연대기순 (최신순) 으로 표시됩니다.
출력 내용이 길면 Git 은 페이저 (보통 less) 를 통해 보여줍니다. 화살표 키를 사용하여 이동할 수 있으며, q를 누르면 종료됩니다.
로그를 더 간결하게 보려면 다음 명령어를 사용하세요:
git log --oneline
이 옵션은 각 커밋을 한 줄로 표시하며, 짧은 커밋 해시와 커밋 메시지만 보여줍니다.
git log는 프로젝트의 과거를 들여다보는 창이라는 점을 기억하세요. 어떤 변경이 언제, 누구에 의해 이루어졌는지 파악하는 데 아주 좋은 시작점입니다.
로그 출력 형식 지정하기
Git 은 필요한 정보를 정확하게 볼 수 있도록 로그 출력 형식을 지정하는 강력한 옵션들을 제공합니다. 몇 가지 옵션을 살펴보겠습니다.
각 커밋에서 수정된 파일들을 확인하려면 --stat 옵션을 사용합니다:
git log --stat
이 옵션은 각 커밋에서 어떤 파일이 변경되었는지, 그리고 몇 줄이 추가되거나 삭제되었는지 보여줍니다.
변경 사항을 더 자세히 보려면 -p 옵션을 사용하세요:
git log -p
이 옵션은 각 커밋의 실제 패치 (추가 및 삭제된 코드 줄) 를 보여줍니다. 변경 사항을 상세히 검토할 때 매우 유용합니다.
--pretty 옵션을 사용하여 사용자 정의 형식을 만들 수도 있습니다. 예를 들어:
git log --pretty=format:"%h - %an, %ar : %s"
이 명령어는 다음 정보를 출력합니다:
%h: 짧은 커밋 해시%an: 작성자 이름%ar: 상대적인 작성 날짜%s: 제목 (커밋 메시지)
필요한 정보를 포함하도록 이 형식 문자열을 자유롭게 수정할 수 있습니다. 유용한 자리 표시자 (placeholder) 는 다음과 같습니다:
%H: 전체 커밋 해시%ad: 작성 날짜%cn: 커미터 이름%ce: 커미터 이메일%cd: 커미터 날짜
다양한 형식을 실험해 보며 자신에게 가장 잘 맞는 형식을 찾아보세요!
날짜별 로그 필터링
특정 시간 범위 내의 커밋만 확인하고 싶을 때가 많습니다. Git 은 날짜별로 로그를 필터링하는 여러 옵션을 제공합니다.
지난 일주일 동안의 커밋을 보려면:
git log --since=1.week
특정 날짜를 지정할 수도 있습니다:
git log --after="2023-06-01" --before="2023-06-30"
이 명령어는 2023 년 6 월 1 일부터 6 월 30 일 사이의 커밋을 보여줍니다.
Git 은 "yesterday", "1 month 2 weeks 3 days ago"와 같은 상대적인 표현을 포함하여 다양한 날짜 형식을 이해합니다.
--before 대신 --until을 사용할 수 있으며, --since와 --after는 같은 의미로 쓰입니다.
이 필터들은 커밋 날짜가 지정된 범위에 속하는 커밋들을 보여준다는 점에 유의하세요. 커밋 날짜는 커밋이 생성된 시점이며, 실제 코드가 수정된 시점과는 다를 수 있습니다.
특정 변경 사항이 언제 도입되었는지 조사 중이라면, 다음 단계에서 다룰 --grep 옵션을 사용하여 특정 커밋 메시지를 검색하는 것이 더 효과적일 수 있습니다.
특정 변경 사항 검색하기
Git 은 특정 커밋을 찾는 데 도움이 되는 강력한 검색 기능을 제공합니다. 이러한 기능들을 살펴보겠습니다.
커밋 메시지에 특정 단어가 포함된 커밋을 검색하려면:
git log --grep="function"
이 명령어는 커밋 메시지에 "function"이라는 단어가 포함된 모든 커밋을 보여줍니다.
특정 파일에 대한 변경 사항만 검색할 수도 있습니다:
git log -- script.js
이 명령어는 script.js 파일에 영향을 준 모든 커밋을 보여줍니다.
특정 코드 라인이 추가되거나 삭제된 변경 사항을 찾으려면:
git log -S "console.log"
이것을 "pickaxe" 검색이라고 합니다. "console.log"라는 문자열의 등장 횟수가 변한 커밋들을 찾아줍니다.
이러한 옵션들을 조합해서 사용할 수도 있습니다. 예를 들어, 지난 일주일 동안 script.js 파일에 발생한 상세 변경 사항을 보려면 다음과 같이 합니다:
git log -p --since=1.week -- script.js
기본적으로 Git 의 검색은 대소문자를 구분합니다. 대소문자를 구분하지 않고 검색하려면 -i 옵션을 추가하세요:
git log --grep="function" -i
이러한 검색 기능은 특정 변경이 언제 도입되었는지 또는 버그가 언제 수정되었는지 추적할 때 매우 유용합니다.
로그를 활용한 통계 생성
Git 은 통계 데이터를 통해 프로젝트 히스토리에 대한 가치 있는 통찰력을 제공할 수 있습니다. 통계를 생성하는 몇 가지 방법을 알아보겠습니다.
작성자별 커밋 수 요약을 보려면:
git shortlog -s -n
이 명령어는 커밋 수에 따라 정렬된 작성자 목록과 각 이름 옆에 커밋 횟수를 보여줍니다.
특정 작성자가 추가하고 삭제한 코드 라인 수를 확인하려면:
git log --author="Jane Doe" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "Added lines: %s, Removed lines: %s, Total lines: %s\n", add, subs, loc }'
"Jane Doe" 부분을 확인하려는 작성자의 이름으로 바꾸어 실행하세요.
가장 많이 변경된 파일이 무엇인지 확인하려면:
git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10
이 명령어는 가장 빈번하게 수정된 상위 10 개 파일을 보여줍니다.
전체 커밋 횟수를 확인하려면:
git rev-list --count HEAD
이러한 통계는 프로젝트의 전반적인 개발 패턴을 이해하는 데 매우 유용합니다. 프로젝트의 어느 부분이 가장 활발하게 개발되고 있는지, 누가 가장 기여도가 높은지, 그리고 시간이 지남에 따라 프로젝트가 어떻게 성장했는지 파악하는 데 도움이 됩니다.
물론 이러한 통계가 유익하긴 하지만, 그것이 전부는 아닙니다. 커밋 수나 변경된 라인 수가 반드시 기여의 영향력이나 품질과 일치하는 것은 아니라는 점을 명심하세요.
요약
축하합니다, Git 역사가 여러분! 여러분은 방금 Git 의 히스토리 및 로그 관리 기능의 강력한 힘을 깨우쳤습니다. 우리가 다룬 핵심 개념들을 다시 한번 정리해 봅시다:
- 기본적인 로그 사용법:
git log를 사용하여 프로젝트의 커밋 히스토리를 확인하는 방법을 배웠습니다. - 로그 출력 형식 지정: 필요한 정보를 정확히 볼 수 있도록 로그 출력을 사용자 정의하는 방법을 익혔습니다.
- 날짜별 로그 필터링: 특정 시간 범위 내의 커밋에 집중하는 방법을 확인했습니다.
- 특정 변경 사항 검색: 특정 변경이 언제 도입되었는지 찾아내는 강력한 기술들을 배웠습니다.
- 로그를 활용한 통계 생성: 프로젝트의 개발 패턴에 대한 통찰력을 추출하는 방법을 살펴보았습니다.
이러한 기술들은 규모가 큰 프로젝트에서 작업할 때 매우 귀중한 자산이 될 것입니다. 버그를 추적하든, 기능의 진화 과정을 검토하든, 프로젝트의 전반적인 개발 트렌드를 파악하려 하든, git log 명령어와 다양한 옵션들은 여러분의 든든한 동반자가 되어줄 것입니다.
Git 의 히스토리는 단순히 과거의 기록이 아니라, 프로젝트를 이해하고 개선하기 위한 강력한 도구라는 점을 잊지 마세요. 이를 현명하게 활용한다면 여러분은 더욱 유능한 개발자가 될 것입니다.
앞으로도 이 명령어들을 계속 탐색하고 실험해 보세요. 프로젝트 히스토리를 탐색하는 데 익숙해질수록, 그 안에서 더 많은 통찰력을 얻을 수 있을 것입니다. 여러분의 Git 저장소에서 즐거운 시간 여행 되시길 바랍니다!



