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?

Himanshu Mishra
źródło
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:

[email protected]:~# 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.

znak
źródło
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ć :)

XRay
źródło
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.
12
@FranciscoC. szukasz: github.com/jayphelps/git-blame-someone-else
DustWolf
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.

Himanshu Mishra
źródło
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.

Bharath TS
źródło
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.

VonC
źródło
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

jackzhoumine
źródło