git blame to twój detektyw od kodu. Dla każdej linii pliku pokazuje, kto i w którym commicie ostatnio ją tknął, razem z datą i skrótem hasha. Klasyczne zastosowanie: ktoś (pewnie Ty trzy miesiące temu) wstawił dziwny if, a Ty chcesz wiedzieć kogo o to przepytać i jaki commit za tym stoi. Nie zmienia plików, niczego nie psuje — tylko czyta historię z repozytorium Git, więc możesz odpalać do woli.
Składnia i najważniejsze opcje
Podstawowa forma: git blame [opcje] [-L start,koniec]
-L— ogranicza wynik do zakresu linii, np., -L 30,60. Można podać też wzorzec:-L :nazwaFunkcji.-e— pokazuje e-mail autora zamiast imienia (przydatne, gdy w zespole jest trzech Adamów).-w— ignoruje zmiany w białych znakach, żeby reformatowanie wcięć nie przykrywało prawdziwego autora linii.-M— wykrywa linie przeniesione w obrębie tego samego pliku i wskazuje ich oryginalny commit.-C— wykrywa linie skopiowane lub przeniesione z innych plików (możesz powtórzyć:-C -Cdla agresywniejszego szukania).-s— pomija imię autora i datę, zostawia sam skrót commita i numer linii. Czyściej, gdy interesuje Cię tylko hash.-l— wyświetla pełny, długi hash commita zamiast skróconego.--reverse— odwraca logikę: pokazuje, w którym commicie linia zniknęła, a nie powstała...
Przykłady użycia
git blame app.py— pełny przegląd: każda linia pliku z autorem, datą i commitem.git blame -L 40,55 app.py— tylko linie 40–55, idealne gdy znasz numer feralnej linii z traceback.git blame -e -w config.js— e-maile autorów, z pominięciem szumu od zmian formatowania.git blame -L :handleLogin src/auth.js— obwinia tylko ciało funkcjihandleLogin, bez liczenia linii ręcznie.git blame abc123^ -- app.py— pokazuje stan pliku tuż przed commitemabc123, żeby zobaczyć kto był winny wcześniej.
Częste błędy i pułapki
git blame pokazuje, kto ostatnio zmienił linię, a nie kto ją wymyślił. Jeden globalny prettier albo zmiana wcięć i nagle „autorem” całego pliku jest osoba od formatowania — dlatego prawie zawsze dopisuj -w, a do realnego śledztwa -M i -C. Nazwa jest myląca: tu nie chodzi o szukanie winnych, tylko kontekstu. Jeśli wynik prowadzi do jednego wielkiego commita „initial import”, historia po prostu nie sięga głębiej. Do interaktywnego klikania po liniach lepszy bywa git gui blame albo blame w edytorze (VS Code, GitLens). Komenda działa tak samo na Linuksie, macOS i Windowsie — różnic między systemami praktycznie brak, bo to czysta logika Gita.
Powiązane komendy: git log, git show, git annotate, git bisect, git diff.