Close

git blame

Polecenie git blame to wszechstronne narzędzie do rozwiązywania problemów, które ma liczne zastosowania. Wysokopoziomową funkcją git blame jest wyświetlanie metadanych autora dołączonych do określonych zatwierdzonych wierszy w pliku. Służy do zbadania konkretnych punktów historii pliku i uzyskania kontekstu, kto był ostatnim autorem modyfikacji wiersza. Służy do zbadania historii określonego kodu i odpowiedzi na pytania dotyczące kodu, który został dodany do repozytorium, dlaczego i w jaki sposób.

Polecenie git blame jest często używane z wyświetlaczem graficznego interfejsu użytkownika. Witryny hostingowe systemu Git online, np. Bitbucket, oferują widoki szukania powodu błędów, które są otokami polecenia git blame w interfejsie użytkownika. Widoki te są przywoływane we wspólnych dyskusjach na temat pull requestów i commitów. Dodatkowo większość IDE, które mają integrację z Git, ma również dynamiczne widoki szukania powodu błędów.


Jak to działa


Aby zademonstrować działanie polecenia git blame, potrzebujemy repozytorium z historią. Użyjemy projektu open source git-blame-example. Ten projekt typu open source jest prostym repozytorium zawierającym plik README.md, który ma kilka commitów od różnych autorów. Pierwszym krokiem naszego przykładu użycia polecenia git blame jest wykonanie polecenia git clone w celu sklonowania przykładowego repozytorium.

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

Now that we have a copy of the example code we can start exploring it with git blame. The state of the example repo can be examined using git log. The commit history should look like the following:

$ 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
Logo Git
materiały pokrewne

Git — ściągawka

Logo Bitbucket
POZNAJ ROZWIĄZANIE

Poznaj środowisko Git z rozwiązaniem Bitbucket Cloud

Polecenie git blame działa tylko na pojedynczych plikach. Aby uzyskać użyteczne dane wyjściowe, wymagana jest ścieżka pliku. Domyślne wykonanie polecenia git blame spowoduje po prostu wyświetlenie menu pomocy poleceń. W tym przykładzie będziemy pracować na pliku README.MD. Powszechną praktyką oprogramowania open source jest dołączenie pliku README w katalogu głównym repozytorium git jako źródła dokumentacji dla projektu.

git blame README.MD

Wykonanie powyższego polecenia da nam pierwszą próbkę danych wyjściowych narzędzia blame. Poniższy wynik jest podzbiorem pełnych danych wyjściowych blame w przypadku pliku README. Dodatkowo te dane wyjściowe są statyczne, co odzwierciedla stan repozytorium z chwili pisania tego tekstu.

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

Jest to próbka pierwszych 13 wierszy pliku README.md. Aby lepiej zrozumieć te dane wyjściowe, przeanalizujmy wiersz. W poniższej tabeli wyświetlana jest zawartość wiersza 3, a kolumny tabeli wskazują zawartość.

Identyfikator

Autor

Znacznik czasu

Numer wiersza

Zawartość wiersza

89feb84d

Autor

Albert So

Znacznik czasu

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

Numer wiersza

3

Zawartość wiersza

To repozytorium jest przykładem projektu z wieloma współautorami dodającymi commity.

Jeśli przejrzymy listę danych wyjściowych narzędzia blame, możemy dokonać pewnych obserwacji. Na liście jest trzech autorów. Oprócz opiekuna projektu, którym jest Kev Zettler, wymienieni są również Albert So i Juni Mukherjee. Autorzy są generalnie najcenniejszą częścią danych wyjściowych polecenia git blame. Kolumna znacznika czasu zwykle również jest pomocna. Zmianę wskazuje kolumna „Zawartość wiersza”.

Często używane opcje


git blame -L 1,5 README.md

Opcja -L ograniczy dane wyjściowe do żądanego zakresu wierszy. Tutaj ograniczyliśmy wyjście do wierszy od 1 do 5.

git blame -e README.md

Opcja -e pokazuje adres e-mail autorów zamiast nazw użytkowników.

git blame -w README.md

Opcja -w ignoruje zmiany w znakach odstępu. Jeśli poprzedni autor zmodyfikował odstępy w pliku, zamieniając je z tabulatorów na spacje lub dodając nowe wiersze, utrudnia to odczyt danych wyjściowych polecenia git blame, ponieważ zmany te są wyświetlane.

git blame -M README.md

Opcja -M wykrywa przeniesione lub skopiowane wiersze wewnątrz tego samego pliku. Spowoduje to zgłoszenie oryginalnego autora wierszy zamiast ostatniego autora, który przeniósł lub skopiował wiersze.

git blame -C README.md

Opcja -C wykrywa wiersze, które zostały przeniesione lub skopiowane z innych plików. Spowoduje to zgłoszenie oryginalnego autora wierszy zamiast ostatniego autora, który przeniósł lub skopiował wiersze.

Git blame vs git log


While git blame displays the last author that modified a line, often times you will want to know when a line was originally added. This can be cumbersome to achieve using git blame. It requires a combination of the -w, -C, and -M options. It can be far more convenient to use the git log command.

Aby wyświetlić wszystkie oryginalne commity, w których dodano lub zmodyfikowano określony fragment kodu, uruchom polecenie git log z opcją -S. Dołącz opcję -S z kodem, którego szukasz. Jako przykład weźmy jeden z wierszy z powyższych danych wyjściowych pliku README. Skorzystajmy z tekstu „CSS3D i WebGL renderery” z wiersza 12 danych wyjściowych pliku README.

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

This output shows us that content from the README was added or modified 3 times by 3 different authors. It was originally added in commit cb20237cc by Mr.doob. In this example, git log has also been prepended with the --pretty-format option. This option converts the default output format of git log into one that matches the format of git log. For more information on usage and configuration options visit the git log page.

Podsumowanie


The git blame command is used to examine the contents of a file line by line and see when each line was last modified and who the author of the modifications was. The output format of git blame can be altered with various command line options. Online Git hosting solutions like Bitbucket offer blame views, which offer a superior user experience to command line git blame usage. git blame and git log can be used in combination to help discover the history of a file's contents. The git log command has some similar blame functionality, to learn more visit the git log overview page.


Udostępnij ten artykuł
Następny temat

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ludzie współpracujący przy ścianie pełnej narzędzi

Blog Bitbucket

Ilustracja DevOps

Ścieżka szkoleniowa DevOps

Demonstracje funkcji z ekspertami Atlassian

Zobacz, jak Bitbucket Cloud współpracuje z Atlassian Open DevOps

Zapisz się do newslettera DevOps

Thank you for signing up