Git - blame 명령어, 코드 수정한 사람과 Commit 찾기

git 프로젝트에서 어떤 코드를 누가 수정했는지, 어떤 commit으로 수정이 되었는지 궁금할 때가 있습니다. 이럴 때, git blame 명령어를 사용하면 누가 수정했는지, 어떤 commit으로 수정되었는지 알 수 있습니다.

1. git blame으로 누가 코드를 수정했는지 확인

Android에서 이미지를 라이브러리 Glide 프로젝트에서 git blame 명령어로 누가 코드를 수정했는지 살펴볼 것입니다.

Glide.java라는 파일을 라인별로 누가 수정했는지 알고 싶다면, 아래와 같이 git blame 명령어로 파일 경로를 입력하면 됩니다.

~/../glide$ git blame Glide.java

그럼 다음과 같이 왼쪽에는 commit id, 파일 이름, 수정한 사람, 수정 시간 순서로 보이고, 오른쪽에는 라인 번호와 코드가 보입니다. 이렇게 Line 별로 누가, 어떤 commit으로 수정했는지 알 수 있습니다.

....
ef027a4d4a library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2015-01-02 18:55:14 -0800 111) public class Glide implements ComponentCallbacks2 {
f389e91cce library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2015-02-14 17:47:55 -0800 112)   private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
f389e91cce library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2015-02-14 17:47:55 -0800 113)   private static final String TAG = "Glide";
cce9375713 library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2020-03-27 17:12:06 -0700 114)
cce9375713 library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2020-03-27 17:12:06 -0700 115)   @GuardedBy("Glide.class")
f389e91cce library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2015-02-14 17:47:55 -0800 116)   private static volatile Glide glide;
cce9375713 library/src/main/java/com/bumptech/glide/Glide.java (Sam Judd                 2020-03-27 17:12:06 -0700 117)
6c56e3831a library/src/main/java/com/bumptech/glide/Glide.java (judds                    2017-07-07 12:33:53 -0700 118)   private static volatile boolean isInitializing;

2. commit의 모든 수정 사항 확인

위에서 찾은 commit f389e91cce의 모든 수정사항을 보고 싶다면, git show <commit id> 명령어를 사용하여 자세히 확인할 수 있습니다.

~/../glide$ git show f389e91cce

commit f389e91ccecac6ddf736bbf1a4346782609eb034
Author: Sam Judd <judds@google.com>
Date:   Sat Feb 14 17:47:55 2015 -0800

    Convert to google style.

diff --git a/checkstyle.xml b/checkstyle.xml
index 34735f1b1..456d5e34a 100644
--- a/checkstyle.xml
+++ b/checkstyle.xml
@@ -150,7 +150,7 @@
         <module name="StringLiteralEquality" />
         <module name="UnnecessaryParentheses" />
         <module name="LineLength">
-            <property name="max" value="120" />
+            <property name="max" value="100" />
         </module>
....

3. author, timestamp는 출력하지 않기

git blame 명령어에서 -s 옵션을 이용하면 author name과 timestamp를 출력되지 않습니다.

~/../glide$ git blame -s Glide.java
ef027a4d4a library/src/main/java/com/bumptech/glide/Glide.java 111) public class Glide implements ComponentCallbacks2 {
f389e91cce library/src/main/java/com/bumptech/glide/Glide.java 112)   private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
f389e91cce library/src/main/java/com/bumptech/glide/Glide.java 113)   private static final String TAG = "Glide";
cce9375713 library/src/main/java/com/bumptech/glide/Glide.java 114)
cce9375713 library/src/main/java/com/bumptech/glide/Glide.java 115)   @GuardedBy("Glide.class")
f389e91cce library/src/main/java/com/bumptech/glide/Glide.java 116)   private static volatile Glide glide;
cce9375713 library/src/main/java/com/bumptech/glide/Glide.java 117)
6c56e3831a library/src/main/java/com/bumptech/glide/Glide.java 118)   private static volatile boolean isInitializing;

4. 특정 line에 대한 수정사항만 확인

소스의 모든 line에 대해서 commit을 확인하고 싶지 않고, 특정 line에 대해서만 확인하고 싶을 때가 있습니다.

만약 Glide.java의 Line 111에서 113까지의 수정사항만 확인하고 싶다면..

Line 111   public class Glide implements ComponentCallbacks2 {
Line 112       private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
Line 113       private static final String TAG = "Glide";

다음과 같이 -L <start>,<end>옵션으로 라인을 지정할 수 있습니다.

하기 명령어에서 -L 111,113 옵션의 의미는 111 라인부터 113 라인까지의 수정사항만 출력하라는 의미입니다.

~/../glide$ git blame -L 111,113 Glide.java

ef027a4d4a (Sam Judd 2015-01-02 18:55:14 -0800 111) public class Glide implements ComponentCallbacks2 {
f389e91cce (Sam Judd 2015-02-14 17:47:55 -0800 112)   private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
f389e91cce (Sam Judd 2015-02-14 17:47:55 -0800 113)   private static final String TAG = "Glide";

5. git blame 명령어 정리

위에서 소개한 명령어들을 정리하였습니다.

  • git blame <file name> : <file name>에 대한 모든 수정 내역
  • git blame -s <file name> : <file name>에 대한 모든 수정 내역. author name, timestamp는 출력 안함
  • git show <commit id> : <commit id>에 대한 description과 수정사항을 보여줌
  • git blame -L <start,end> <file name> : <file name>에서 start부터 end 라인까지의 수정 내역만 보여줌
Loading script...
codechachaCopyright ©2019 codechacha