Git blame

git blame 명령은 광범위하게 사용할 수 있는 옵션을 제공하는 다용도 문제 해결 유틸리티입니다. git blame의 개략적인 수준의 기능은 파일의 커밋된 특정 줄에 첨부된 작성자 메타데이터를 표시하는 것입니다. 파일 기록의 특정 지점을 살펴보고 해당 줄을 마지막으로 수정한 작성자가 누구인지에 대한 컨텍스트를 얻는 데 사용됩니다. 특정 코드의 기록을 살펴보고 코드가 리포지토리에 추가된 내용, 방법, 이유에 대한 질문에 답하는 데 사용됩니다.

Git blame은 GUI 디스플레이와 함께 사용되는 경우가 많습니다. Bitbucket과 같은 온라인 Git 호스팅 사이트에서는 git blame의 UI 래퍼인 blame 보기를 제공합니다. 이러한 보기는 풀리퀘스트 및 커밋에 대한 공동 논의에서 참조됩니다. 또한 Git 통합이 있는 대부분의 IDE에는 동적 blame 보기도 있습니다.

작동 방식

git blame을 설명하기 위해서는 어느 정도의 기록이 있는 리포지토리가 필요합니다. 오픈 소스 프로젝트인 git-blame-example을 사용해 보겠습니다. 이 오픈 소스 프로젝트는 README.md 파일이 들어 있는 단순한 리포지토리이며 이 파일에는 여러 작성자의 커밋이 몇 개 있습니다. git blame 사용 예시의 첫 번째 단계는 예시 리포지토리를 git clone하는 것입니다.

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

이제 예시 코드의 복사본이 있으므로 git blame으로 탐색해 볼 수 있습니다. 예시 리포지토리의 상태는 git log를 사용하여 확인할 수 있습니다. 커밋 기록은 다음과 비슷하게 표시됩니다.

$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket

git blame은 개별 파일에서만 작동합니다. 유용한 출력을 위해서는 파일 경로가 필요합니다. git blame의 기본 실행은 단순히 명령 도움말 메뉴를 출력합니다. 이 예시의 경우 README.MD 파일에서 작업하겠습니다. 일반적인 오픈 소스 소프트웨어 관행은 프로젝트의 문서 소스로 Git 리포지토리의 루트에 README 파일을 포함하는 것입니다.

git blame README.MD

위의 명령을 실행하면 첫 번째 blame 출력의 샘플을 받게 됩니다. 다음 출력은 README의 전체 blame 출력의 일부에 해당합니다. 또한 이 출력은 정적이며 작성 시점의 리포지토리 상태를 반영합니다.

$ git blame README.md
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this README.

이것은 README.md 파일의 첫 13줄 샘플입니다. 출력 내용을 더 잘 이해하기 한 줄을 자세히 살펴보겠습니다. 다음 표는 3번 줄의 콘텐츠를 표시하며 표의 열은 열 콘텐츠를 나타냅니다.

ID

작성자

타임스탬프

줄 번호

줄 콘텐츠

89feb84d

Albert So

2018-03-01 00:54:03 +0000

3

이 리포지토리는 여러 기여자가 커밋을 하는 프로젝트의 예입니다.

blame 출력 목록을 살펴보면 몇 가지 사항을 관찰할 수 있습니다. 작성자가 세 명 나열되어 있습니다. 프로젝트 관리자인 Kev Zettler 외에도 Albert So 및 Juni Mukherjee도 목록에 있습니다. 일반적으로 git blame 출력에서 가장 중요한 부분은 작성자입니다. 타임스탬프 열도 유용합니다. 변경된 내용이 무엇인지는 줄 콘텐츠 열에 표시됩니다.

일반적인 옵션

git blame -L 1,5 README.md

-L 옵션은 출력을 요청한 줄 범위로 제한합니다. 여기서는 출력을 1~5번 줄로 제한했습니다.

git blame -e README.md

-e 옵션은 사용자 이름 대신 작성자의 이메일 주소를 표시합니다.

git blame -w README.md

-w 옵션은 공백 변경을 무시합니다. 이전 작성자가 탭에서 공백으로 바꾸거나 새 줄을 추가하여 파일 간격을 수정한 경우 아쉽게도 이러한 변경 사항을 표시하여 git blame의 출력이 모호해집니다.

git blame -M README.md

-M 옵션은 같은 파일 내에서 이동되거나 복사된 줄을 감지합니다. 줄을 이동하거나 복사한 마지막 작성자가 아니라 해당 줄의 원래 작성자를 보고합니다.

git blame -C README.md

-C 옵션은 다른 파일에서 이동되거나 복사된 줄을 감지합니다. 줄을 이동하거나 복사한 마지막 작성자가 아니라 해당 줄의 원래 작성자를 보고합니다.

Git Blame 및 Git Log 비교

git blame은 줄을 마지막으로 수정한 작성자를 표시하지만 사용자는 줄이 처음에 언제 추가되었는지 알고 싶어 하는 경우가 많습니다. git blame으로는 이 작업이 번거로울 수 있습니다. -w, -C-M 옵션을 함께 사용해야 합니다. git log 명령을 사용하는 것이 훨씬 편리할 수 있습니다.

특정 코드가 추가되거나 수정된 원래 커밋을 모두 나열하려면 -S 옵션으로 git log를 실행합니다. 찾고 있는 코드에 -S 옵션을 추가합니다. 위의 README 출력에서 한 줄을 예로 들어 보겠습니다. README 출력의 12번 줄에서 텍스트 "CSS3D and WebGL renderers"를 살펴보겠습니다.

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
    e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

이 출력은 README의 콘텐츠를 서로 다른 작성자 3명이 세 번 추가 또는 수정했다는 것을 보여줍니다. 원래는 Mr.doob가 커밋 cb20237cc에 추가했습니다. 이 예시에서는 git log 앞에 --pretty-format 옵션이 추가되었습니다. 이 옵션은 git log의 기본 출력 형식을 git log 형식과 일치하도록 변환합니다. 사용 방법과 구성 옵션에 대한 자세한 내용은 git log 페이지를 참조하세요.

요약

git blame 명령은 파일의 콘텐츠를 한 줄씩 검사하여 각 줄이 언제 마지막으로 수정되었는지, 수정한 작성자가 누구인지 확인하는 데 사용됩니다. git blame의 출력 형식은 다양한 명령줄 옵션으로 변경할 수 있습니다. Bitbucket과 같은 온라인 Git 호스팅 솔루션은 명령줄 git blame 사용에 대해 뛰어난 사용자 경험을 제공하는 blame 보기를 제공합니다. git blame과 git log를 함께 사용하면 파일 콘텐츠의 기록을 찾는 데 도움이 될 수 있습니다. git log 명령에도 비슷한 blame 기능이 있습니다. 자세한 내용은 git log 개요 페이지를 참조하세요.

맞춤 추천

Bitbucket 블로그

DevOps 학습 경로

Git에 대해 자세히 알아보기

이 허브에서 더 많은 Git 가이드 및 리소스를 찾아보세요.