git blame

Pokazuje, który commit i autor ostatnio zmienił każdą linię pliku.

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 -C dla 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 funkcji handleLogin, bez liczenia linii ręcznie.
  • git blame abc123^ -- app.py — pokazuje stan pliku tuż przed commitem abc123, ż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.