본문 바로가기
기타/Git

[Git] log

by 코딩하는 랄로 2023. 12. 20.
728x90

git log

git 은 버전 관리 시스템으로, commit을 통해 git 이 관리하는 파일들의 기록들을 저장해온다. 그리고 이렇게 저장해온 기록(커밋 히스토리)들을 열람하는 것 또한 가능한데, 이를 위한 명렁어가 git log 명렁어이다. 버전관리 시스템이 기록한 버전들을 열람하는 명렁어인 만큼 자주 사용되는 명렁어이다.

 

git log는 특별한 동작 과정을 거쳐서 작업을 하는 명렁어가 아닌 단순히 commit을 통해 기록한 커밋 히스토리를 보기 위한 명렁어이기 때문에, 동작 과정보다는 git log가 어떤 정보를 보여주고 옵션으로는 어떤 것이 있는지를 알아보겠다.

 

이를 위해, 현재 git 공부를 위해 참고하고 있는 pro git에서 사용하는 예제 코드인 simplegit을 사용하겠다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ git clone https://github.com/schacon/simplegit-progit
Cloning into 'simplegit-progit'...
remote: Enumerating objects: 13, done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
Receiving objects: 100% (13/13), done.
Resolving deltas: 100% (3/3), done.

user@DESKTOP-UCJOAKJ MINGW64 /d/git (master)
$ cd simplegit-progit/

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)

 

해당 프로젝트에서 git log를 실행하게 되면, 아래와 같은 결과를 볼 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

 

위에서, 출력된 결과들이 바로 커밋 히스토리로써 위에서부터 가장 최근 커밋부터 첫번째 커밋까지 순서대로 보여준다. 각각의 커밋은 먼저 해당 커밋 개체의 SHA-1 해시 키를 보여주고 저자의 이름과 저자의 이메일, 커밋이된 날짜와 시간 그리고 마지막으로 커밋 메세지를 보여준다.

 

또한, 첫번째 커밋을 보면 해시 키 뒤에 소괄호로  (HEAD -> master, origin/master, origin/HEAD) 라고 표기 되어 있는데, 이는 현재의 HEAD( 현재의 branch , 지금은 누구의 working directory인가를 뜻한다고 생각하면 된다. ) 가 무엇인지 보여주고 origin/master 와 origin/HEAD 모두 현재의 커밋개체의 상태임을 알려주는 것이다. (추후에 이에 대해 더 자세히 다루겠다.)

 

 

 

git log 옵션

git log는 커밋 히스토리를 위한 다양하고 편리한 옵션들을 지원하고 있다. 이 중에서도 유용하고 자주 사용되는 옵션들에 대해서 알아보겠다.

 

git log -p/--patch

-p 옵션은 커밋의 diff 결과도 같이 보여주는 옵션이다. ( -[number] 옵션도 같이 붙이면 해당 number 수만큼의 커밋만을 보여준다. )

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gmail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end

 

git log -p 는 diff의 결과를 그대로 보여주기 때문에 커밋시에 변경 사항이 무엇인지에 대해서 바로 알 수 있고 변경 사항에 대한 히스토리를 볼 수 있기 때문에 매우 유용한 옵션이다.

 

 

git log --stat

해당 옵션은 커밋 히스토리의 통계 정보를 보여주는 옵션이다. 어떠한 통계 정보를 보여주는지 알아보기 위해 한번 실행해보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

 

git log --stat 이 보여주는 통계 자료는 각 커밋마다 몇 개의 파일이 변경/추가/삭제 되었는지를 보여주고 또한 파일마다 몇개의 라인이 추가되었고 삭제되었는지도 보여준다.

 

 

git log --pretty

git log --pretty는 히스토리를 내용을 보여주는 옵션으로 --pretty 로 지정해준 방식에 따라 히스토리 정보를 보여준다. 방식은 여러가지가 있는 데 그 중 하나는 바로 각 커밋을 한 라인으로 보여주는 oneline이다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD) changed the verison number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

 

pretty의 방식은 위의 예제 처럼 등호(=) 를 통해 지정해주면 되고, oneline을 지정해준 결과 각 커밋이 한 라인으로 간략한 정보만을 보여주면서 출력되는 것을 볼 수 있다.

 

이 외에도 short, full, fuller 방식이 있다. 각각의 방식을 -1 옵션을 주어 한번 출력해보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --pretty=short -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>

    changed the verison number

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --pretty=full -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Commit: Scott Chacon <schacon@gmail.com>

    changed the verison number

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --pretty=fuller -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author:     Scott Chacon <schacon@gmail.com>
AuthorDate: Mon Mar 17 21:52:11 2008 -0700
Commit:     Scott Chacon <schacon@gmail.com>
CommitDate: Fri Apr 17 21:56:31 2009 -0700

    changed the verison number

 

oneline에서 fuller로 갈 수록 더 많은 정보를 보여주는 것을 확인 할 수 있다. git log --pretty에는 위의 방식 이외에도 format이라는 옵션이 존재한다. 해당 옵션은 커밋 히스토리를 나만의 방식대로 출력할 수 있게 해준다. 그렇기 때문에 커밋 히스토리를 다른 프로그램으로 파싱하고자 할 때 유용하게 사용되고, 이를 사용하면 포맷을 정확하게 일치시킬 수 있기 때문에 Git을 새 버전으로 바꿔도 결과가 바뀌지 않는다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 16 years ago : changed the verison number
085bb3b - Scott Chacon, 16 years ago : removed unnecessary test code
a11bef0 - Scott Chacon, 16 years ago : first commit

 

아래는 format을 위한 옵션 중 유용한 옵션들이다.

옵션 설명
%H 커밋 해시
%h 짧은 길이 커밋 해시
%T 트리 해시
%t 짧은 길이 트리 해시
%P 부모 해시
%p 짧은 길이 부모 해시
%an 저자 이름
%ae 저자 메일
%ad 저자 시각
%ar 저자 상대적 시각 ( 지금 현재로부터 )
%cn 커미터 이름
%ce 커미터 메일
%cd 커미터 시각
%cr 커미터 상대적 시각 ( 지금 현재로부터 )
%s 요약

 

 

git log --graph

git log --graph는 커밋 히스토리를 그래프 형식으로 보여준다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --graph
* commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
| Author: Scott Chacon <schacon@gmail.com>
| Date:   Mon Mar 17 21:52:11 2008 -0700
|
|     changed the verison number
|
* commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
| Author: Scott Chacon <schacon@gmail.com>
| Date:   Sat Mar 15 16:40:33 2008 -0700
|
|     removed unnecessary test code
|
* commit a11bef06a3f659402fe7563abf99ad00de2209e6
  Author: Scott Chacon <schacon@gmail.com>
  Date:   Sat Mar 15 10:31:28 2008 -0700

      first commit

 

커밋 사이의 라인이 생긴 것을 볼 수 있다. 지금 당장은 master 브랜치 하나로만 작업을 했기 하나의 라인으로 쭉 이어져 있지만 후에 브랜치를 배우고 merge를 배우게 된다면, 해당 옵션을 통해 어디서 branch가 생겼으며 어디서 합쳐졌는지를 시각적으로 볼 수 있는 매우 편리한 옵션 중 하나이다.

 

또한 해당 옵션과 위에서 배운 pretty=format 옵션과 같이 사용한다면 더욱 유용하게 사용할 수 있게 된다. (지금은 단순히 master 브랜치로만 커밋하였기 때문에 크게 와닿지 않겠지만...)

user@DESKTOP-UCJOAKJ MINGW64 /d/git/simplegit-progit (master)
$ git log --pretty=format:"%h %s" --graph
* ca82a6d changed the verison number
* 085bb3b removed unnecessary test code
* a11bef0 first commit

 

 

 

제한 조건

제한 조건이라 함은 위의 예제에서 종종 나왔던 -2, -1 옵션 처럼 git log 시 보여주는 정보들의 조건을 거는 옵션이다. 이러한 옵션에는 매우 유용하게 사용할 수 있는 --since, --until 옵션이 있는데 이름에서 알 수 있듯이 시간을 제한 조건으로 커밋 히스토리를 조회할 수 있다.

git log --since=[time]     :     time 이후에 커밋만 보여줌
git log --until=[time]       :     time 이전에 커밋만 보여줌

 

time에 해당하는 형식으로는 "2.weeks(2주전), 1.year(1년전), 4.minutes(4분전)" ( = 2 weeks ago,  1 year ago, 4 minutes ago)  과 같은 상대적인 시간 형식도 가능하지만 "2023-12-20" 과 같이 정확한 날짜도 사용할 수 있다.

 

이 외에도 저자로 검색하는 --author 옵션, 커밋 메시지에서 키워드로 검색하는 --grep 옵션, merge 는 제외한 순수 커밋만을 보여주는 --no-merge 옵션도 있다.

 

마지막으로 정말 유용한 옵션으로는 코드에서 추가되거나 제거된 내용 중에 특정 텍스트가 포함되어 있는지를 검색하는 git log -S 옵션이 있다.

git log -S [ 검색 키워드 ]
ex) sayHello 라는 함수에 관한 로그를 찾아라 : git log -S sayHello

 

 

 

 

 

 

reference : pro git

728x90

'기타 > Git' 카테고리의 다른 글

[Git] remote  (1) 2023.12.31
[Git] 되돌리기  (0) 2023.12.27
[Git] mv  (0) 2023.12.20
[Git] rm  (0) 2023.12.14
[Git] Commit  (2) 2023.12.06