[2장]커밋 히스토리 조회하기

조회하기

저장소의 히스토리를 보고 싶을 땐 git log 명령어를 이용하라.

연습용 프로젝트 다운로드

$ git clone https://github.com/schacon/simplegit-progit

일단 로그를 조회해 보자

$ cd simplegit-progit
$ 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

특별한 옵션 없이 git log 명령을 실행하면 저장소의 커밋 히스토리를 시간순으로 보여준다. 즉 가장 최근의 커밋이 가장 먼저 나온다. 그리고 이어서 각 커밋의 SHA-1 체크섬, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지를 보여준다.

옵션 보기

주요 옵션

  • -p : 각 커밋에 적용된 패치를 보여줌
  • —stat : 각 커밋에서 수정된 파일의 통계정보를 보여줌
  • —shortstat : —stat 명령의 결과 중에서 수정한 파일, 추가된 라인, 삭제된 라인만 보여줌
  • —name-only : 커밋 정보중에서 수정된 파일의 목록만 보여줌
  • —name-status : 수정된 파일의 목록을 보여줄 뿐 아니라 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지도 보여준다.
  • —abbrev-commit : 40자 짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여줌
  • —relative-date : 정확한 시간을 보여주는 것이 아니라 '2 weeks ago' 처럼 상대적인 시간을 보여줌
  • —graph : 브랜치와 머지 히스토리 정보까지 아스크 그래프로 보여줌
  • —pretty : 지정한 형식으로 보여줌. 이 옵션에는 oneline, format, short, full, fuller 가 있다. (fotmat은 원하는 형식으로 출력하고자 할 때 사용)

-p, -2(조회 제한조건)

원하는 히스토리를 검색할 수 있도록 많은 옵션이 있지만 특히 -p 옵션(각 커밋의 diff 결과를 보여줌)은 굉장히 유용한 옵션이다. 그 외 -2 옵션(조회 제한조건)은 최근 2개의 결과만 보여준다. 옵션은 여러 개를 같이 사용할 수 있다.

이 옵션은 직접 diff를 실행한 것과 같은 결과를 출력하기 때문에 동료가 무엇을 커밋했는지 리뷰하고 빨리 조회하는데 유용하다.

  • 소스보기

      $ 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>
      :...skipping...
      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
    
      :...skipping...

    (결과가 책에서 나온거랑 조금 다르게 나옴...아마 Git 이 업그레이드 되면서 추가되어서 그런걸로 추정)

—stat(통계)

히스토리의 통계를 보여주는 --stat 옵션

어떤 파일이 수정됐는지, 얼마나 많은 파일이 변경됐는지, 또 얼마나 많은 라인을 추가하거나 삭제했는지 보여준다. 요약 정보는 가장 아래쪽에 보여준다.

  • 소스보기

      $ 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(+)

—pretty(출력형식 변경)

출력형식을 변경할 때 다양한 값이 있다.

  • oneline : 각 커밋을 한 라인으로 보여줌

      $ git log --pretty=oneline
      ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD) changed the verison number
      085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
      a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
  • format

      $ git log --pretty=format:"%h - %an, %ar : %s"
      ca82a6d - Scott Chacon, 12 years ago : changed the verison number
      085bb3b - Scott Chacon, 12 years ago : removed unnecessary test code
      a11bef0 - Scott Chacon, 12 years ago : first commit

    fotmat 에 사용가능한 옵션들

    • 옵션 더 보기

      • %H : 커밋 해시
      • %h : 짧은 길이의 커밋 해시
      • %T : 트리 해시
      • %t : 짧은 길이의 트리 해시
      • %P : 부모 해시
      • %p : 짧은 길이의 부모 해시
      • %an : 저자 이름
      • %ae : 저자 이메일
      • %ad : 저자 시각(형식은 -date=옵션 참고)
      • %ar : 저자 상대적 시각
      • %cn : 커미터 이름
      • %ce : 커미터 이메일
      • %cd : 커미터 시각
      • %cr : 커미터 상대적 시각
      • %s : 요약

      저자(Author) : 원래 작업을 수행한 원작자

      커밋터(Committer) : 마지막으로 이 작업을 적용한(저장소에 포함시킨) 사람

      만약 내가 어떤 프로젝트에 패치를 보냈고 그 프로젝트의 담당자가 패치를 적용했다면 두 명 모두의 정보를 알 필요가 있을 것이다. 그래서 이 경우 내가 저자가 되고, 그 담당자가 커미터가 되는 것이다.(분산 환경에서의 Git 공부할 때 다시 볼 것)

  • short

  • full

  • fuller

—graph

branch와 merge 히스토리를 보여주는 아스키 그래프를 출력

oneline 옵션 또는 format 옵션과 같이 사용하면 더 더욱 좋다.

$ git log --pretty=format:"%h %s" --graph
* ca82a6d changed the verison number
* 085bb3b removed unnecessary test code
* a11bef0 first commit

조회 제한조건

히스트로 전부가 아니라 부분만 조회 가능하도록 도와줌

주요옵션

  • -(n) : 최근 n 개의 커밋만 조회
  • —since, —after : (유용)명시한 날짜 이후의 커밋만 검색
  • —until, —before : (유용)명시한 날짜 이전의 커밋만 검색
  • —author : 입력한 저자의 커밋만 보여줌
  • —committer : 입력한 커미터의 커밋만 보여줌
  • —grep : 커밋 메시지 안의 텍스트를 검색
  • -S : 커밋 변경(추가/삭제) 내용 안의 텍스트를 검색

간단 예제

$ git log --since=2.weeks
$ git log -Sfunction_name
  • —since 옵션은 "2020-03-09" 또는 "2 weeks ago" 같은 형식을 지원
  • 여러 옵션을 같이 사용해서 모두 만족하는 커밋을 찾으려면 --all-match 옵션도 같이 사용해야 함
  • -S 옵션으로 특정 텍스트가 포함된 커밋을 검색할 수 있음
  • 경로로 검색하려면 git log -- path1 path2 처럼 -- 와 함께 경로를 이용해 검색 가능

위 옵션들을 혼합하여 조회하는 예제

git log --pretty=format:"%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t/

레퍼런스

+ Recent posts