Co robi „git blame”?


314

Widziałem wiele pytań na temat metod korzystania git blame , ale tak naprawdę ich nie rozumiem.

Widzę Blameprzycisk nad plikami w interfejsie GitHub. Po kliknięciu pokazuje różnicę z nazwami użytkowników na lewym pasku. Co to oznacza?

Dlaczego git blamefaktycznie jest używany, oprócz GitHub?


66
Jeśli „obwinianie” też brzmi, cóż, obwinianie za ciebie, możesz zainstalować ten skrypt i użyć git praisezamiast tego :) github.com/ansman/git-praise
Jon Kiparsky

7
Nie powinno to być ani wina, ani pochwała; jest z założenia zakładany i powinien być obiektywny.
pdvries

40
git objectively-determine-contributerpo prostu nie ma tego samego pierścienia.
Ritwik Bose

27
@RitwikBose or justgit who
aktivb

Odpowiedzi:


238

Od git-winy :

Adnotuje każdą linię w danym pliku informacjami z wersji, która ostatnio zmodyfikowała linię. Opcjonalnie rozpocznij adnotację od danej wersji.

Jeśli podano jeden lub więcej razy, -L ogranicza adnotację do żądanych linii.

Przykład:

johndoe@server.com:~# git blame .htaccess
...
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  4) allow from all
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  5)
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  6) <IfModule mod_rewrite.c>
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  7)     RewriteEngine On
...

Należy pamiętać, że git blamenie pokazuje historii modyfikacji według linii w sensie chronologicznym. Pokazuje tylko, kto był ostatnią osobą, która zmieniła wiersz w dokumencie do ostatniego zatwierdzeniaHEAD .

To znaczy, że aby zobaczyć pełną historię / log wiersza dokumentu, musisz uruchomić git blame path/to/filedla każdego zatwierdzenia w swoim git log.


1
więc tylko po to, żeby zobaczyć ostatnią osobę?
Rıfat Erdem Sahin

2
Tak, pozwala zobaczyć ostatnią osobę, która zmieniła linię.
Mark

@ Mark Więc kiedy dodamy adnotacje do IDE, wewnętrznie sprawia, że ​​polecenie git winne?
Nagarajan Shanmuganathan

2
@NagarajanShanmuganathan tak, jeśli używasz git, to dzieje się za kulisami.
Mark

151

Polecenie wyjaśnia się całkiem dobrze. Chodzi o ustalenie, który współpracownik napisał konkretną linię lub zniszczył projekt, abyś mógł je winić :)


105
Polecenie brzmi tak, jakbyś obwiniał kogoś, uruchamiając go. Przynajmniej tak to brzmiało, zanim dowiedziałem się, co zrobiłem w tym poście.
Francisco C.


2
@FranciscoC. poczekaj co, czy to nie robi dokładnie tego, tzn. pozwala obwiniać kogoś innego?
IanDess,

16
@IanDess Być może to tylko semantyka, ale git blamebrzmi tak, jakby miał jakiś trwały efekt, podobny do tego git commit, gdzie w rzeczywistości informuje Cię tylko o tym, jakie zmiany zostały wprowadzone przez kogo. To i negatywne skojarzenia, jakie niesie ze sobą słowo „wina”, sprawiają, że polecenie brzmi jak coś, z czego należy trzymać się z daleka, i prowadzi do pytań takich jak ta, szukających wyjaśnienia.
Francisco C.,

20
Oczywiście należy to nazwać git praise.
pfnuesel,

75

Od GitHub :

Polecenie obwiniania to funkcja Git, zaprojektowana, aby pomóc Ci ustalić, kto dokonał zmian w pliku.

Mimo swojej negatywnie brzmiącej nazwy, git blame jest w rzeczywistości całkiem niewinna; jego podstawową funkcją jest wskazanie, kto zmienił, które wiersze w pliku i dlaczego. Może to być przydatne narzędzie do identyfikowania zmian w kodzie.

Zasadniczo git-blamesłuży do pokazania, która wersja i autor ostatnio zmodyfikowali każdą linię pliku. To jak sprawdzanie historii rozwoju pliku.


2
Wydaje mi się to zbędne, widać różnicę między zatwierdzeniami a ID użytkownika z dziennika zmian. Jeśli rozumiem wszystko tutaj, ma mniej uporu niż historia zatwierdzeń. Może czegoś mi brakuje, ale wygląda to na kodowanie standardów egzekwowanych przez publiczne upokorzenie.
user1431356,

8
Wydaje mi się, że nazwa polecenia wynikała ze specyficznego poczucia humoru Linusa :) Nie miał on być użyty do poniżania kogokolwiek :) był to po prostu zabawny (lub nie) wybór nazwy przydatnego polecenia :)
Mladen B.

2
@ user1431356 - chodzi o to, że chcesz mieć pierwszą linię dziennika, która wpływa na określoną linię . W przeciwnym razie należy przeszukać dzienniki pod kątem określonego ciągu. (Co jest rzeczywiście opłacalne podejście - spojrzenie w stronach manuala dla „git dziennika -S”.)
azernik

1
Tytuł „wina” to coś, co istniało od lat przed gitem. Wystarczy spojrzeć na implementację svn . To nie było imię Linusa Torvaldsa.
JackAce

„Wydaje mi się, że nazwa polecenia wynikała ze szczególnego poczucia humoru Linusa :) Nie miała być używana do poniżania kogokolwiek :)” lol ... Bardziej przypominała osobowość Linusa i Miała upokorzyć kogoś.
Sinaesthetic

34

git blamePolecenie służy wiedzieć który / która jest odpowiedzialna za popełnić najnowsze zmiany wprowadzone do pliku. Można także zobaczyć autora / zatwierdzenie każdej linii.

git blame filename (zatwierdza zmiany we wszystkich wierszach kodu)

git blame filename -L 0,10 (zatwierdza zmiany z linii „0” na linię „10”)

Istnieje wiele innych opcji obwiniania, ale ogólnie mogą one pomóc.


2

git blameKomenda annotates linie z informacjami z przeglądu, który jako ostatni zmodyfikował linię i ... z Git 2.22 (Q2 2019), zrobi to szybciej , ze względu na poprawki wydajności around "git blame ”, zwłaszcza w historii liniowej (co jest norma, którą powinniśmy zoptymalizować).

Zobacz commit f892014 (02 kwietnia 2019) autorstwa David Kastrup ( fedelibre) . (Połączone przez Junio ​​C Hamano - gitster- w commit 4d8c4da , 25 kwietnia 2019)

blame.c: nie upuszczaj obiektów blob pochodzenia tak chętnie

Gdy nadrzędny obiekt blob ma już w kolejce porcje do obwiniania, upuszczenie obiektu blob na końcu jednego kroku obwiniania spowoduje jego natychmiastowe ponowne załadowanie, podwojenie ilości operacji we / wy i rozpakowanie podczas przetwarzania historii liniowej.

Utrzymywanie takich nadrzędnych obiektów blob w pamięci wydaje się rozsądną optymalizacją, która powinna powodować dodatkową presję pamięci, głównie podczas przetwarzania połączeń ze starych gałęzi.


1

git blameKomenda służy do sprawdzania zawartości pliku linia po linii i zobaczyć, kiedy każdy wiersz był ostatnio modyfikowany i kto był autorem modyfikacji.

Jeśli w kodzie był błąd, użyj go, aby zidentyfikować, kto go zarejestrował, a następnie możesz go winić. Git winić jest winić.

Jeśli chcesz poznać historię jednego kodu linii, użyj git log -S"code here"prostszego niż wina git.

git log vs git winy

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.