2013-07-22 13 views
21

Czy w Git można wyświetlić listę wszystkich poprzednich wersji danej linii w pliku według numeru wiersza?Lista wszystkich wersji danego numeru wiersza w historii GIT

Powodem, dla którego uznałabym to za użyteczne, jest łatwiejsze rozwiązywanie problemu w oparciu o raport śledzenia stosu rejestrowanego.

tj. Mam zarejestrowany undefined method exception w wierszu 100 podanego pliku. Plik jest zawarty w wielu zatwierdzeniach, które spowodowały, że dana linia mogła "przemieścić się" w górę iw dół pliku, nawet bez żadnych zmian.

Jak wydrukować zawartość linii 100 danego pliku przez ostatnie x zatwierdzenia?

+0

Zobacz także [historia git linii źródłowej] (http://stackoverflow.com/q/10854370) – CharlesB

+0

@MRT: W mojej odpowiedzi opisałem, jak patrzeć poza ostatnia zmiana linii. –

+1

Opublikowałem nową [odpowiedź] (http://stackoverflow.com/a/17803860/946850) na zduplikowane pytanie. Zachowa tę samą odpowiedź tutaj, jako kopię, na wypadek gdyby to pytanie nie zostało zamknięte. – krlmlr

Odpowiedz

9

ten wezwie git blame dla każdy znaczące zmiany, aby pokazać linię $LINE pliku $FILE:

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE 

Jak zwykle winę pokazuje numer wersji na początku każdej linii. Aby dołączyć wyniki zbiorcze, można dodać

| sort | uniq -c 
coś w rodzaju listy zmian, które zmieniły ten wiersz. (Nie całkiem, jeśli kod został przeniesiony tylko dookoła, to może pokazać ten sam identyfikator zatwierdzenia dwa razy dla różnych treści linii.Aby uzyskać bardziej szczegółową analizę, musisz wykonać opóźnione porównanie wyników git blame dla sąsiednich zatwierdzeń. ?)

+0

Dzięki, wygląda na to, że wykonuje to zadanie. Po prostu musiałem użyć kapitału 'L' w opcjach xargs:' git log - format = format:% H $ FILE | xargs -L1 git winę $ FILE -L $ LINE, $ LINE' – mrt

+0

@MRT: W prawo, przełączenie '-l' na' xargs' jest przestarzałe zgodnie z POSIX. Pracowałem w moim systemie, ale '-L' jest lepsze. – krlmlr

+0

Argument '-L' do' git blame' może być użyty do znalezienia kodu zamiast numerów linii. Może to być na przykład przydatne do znalezienia funkcji, która została przeniesiona (ale nie wtedy, gdy została zmieniona). –

7

Nie jest to dokładnie to, o co prosisz, ale dzięki git blame <file> możesz zobaczyć zatwierdzenie, które ostatnio zmodyfikowało każdą linię.

pierwsze kolumny pokazuje popełnić ID:

$ git blame my-file.txt 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 1) Heading 
c6e6d36d (David Pärsson 2013-07-22 12:53:10 +0200 2) ======= 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 3) 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

Możesz zajrzeć poza ostatniej modyfikacji podając wersję, np

$ git blame 8b3d2e15 my-file.txt 

Można również wybrać konkretnych linii z -L argumentu, na przykład:

$ git blame my-file.txt -L 4,+3 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

Więcej szczegółów i sprytnych sztuczek można znaleźć na git-blame man page.

+1

Można również podać wersję, tzn. Nie chodzi tylko o * ostatnie * zatwierdzenie, które zmieniło tylko każdą linię. –

+3

Nie zapomnij o opcji '-L100, + 10', aby obwiniać 10 linii od linii 100, lub' -L/void foo /, + 10', aby obwiniać 10 linii od miejsca zdefiniowania funkcji foo. – sehe

1

Myślę, że podążasz za git blame, mówi ci zatwierdzenie, które dodało każdą linię.

Po uruchomieniu git blame the-file-that-has-that-line.txt przejdź do linii 100, która powie Ci, jakie zatwierdzenie dodało (i kiedy zostało popełnione, i przez kogo).

-2

użycie git blame osiągnąć

zobacz czy działa

NAME 
     git-blame - Show what revision and author last modified each line of a file 

SYNOPSIS 
     git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m] 
        [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>] 
        [<rev> | --contents <file> | --reverse <rev>] [--] <file> 

DESCRIPTION 
     Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision. 
+0

Zasugerowano już trzy razy, nie jest to, czego szuka OP ... – krlmlr

2

Jest rzeczywiście fantazyjny GUI dostarczane z Git, która ułatwia podróż tam iz powrotem w czasie, aby zobaczyć, jak dana linia zmieniła . Wypróbuj

git gui blame <file> 

Możesz kliknąć wersję obok linku "cofnij się w czasie".

3

Sprawdź ten krótki poradnik jak: http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
Zasadniczo, to prowadzi użytkownika poprzez połączenie git blame i git show aby zobaczyć, który zobowiązuje zmienić konkretną linię (git blame, jak już zasugerował, zwłaszcza w odpowiedzi Davida Parsson) i jak ta zmiana linii (git show <commit-id>). Tak więc, iterowanie po zatwierdzeniach na przemian git blame <commit-id>git show <commit-id> da ci pełną historię określonego wiersza pliku.
Pamiętaj też, aby nie zapomnieć o git blame -M, jeśli wątpisz, że linia została skopiowana z innego pliku. Od https://www.kernel.org/pub/software/scm/git/docs/git-blame.html

-M | num |
Wykrywanie przeniesionych lub skopiowanych linii w pliku. Kiedy zatwierdzenie przesuwa lub kopiuje blok wierszy (np. Oryginalny plik ma A, a następnie B, a zatwierdzenie zmienia go na B, a następnie A), tradycyjny algorytm aluzji rozpoznaje tylko połowę ruchu i zazwyczaj obwinia linie, które były przeniósł się (tj. B) do rodzica i przypisuje winę do linii, które zostały przesunięte w dół (tj. A) do zatwierdzenia potomka. W przypadku tej opcji obie grupy linii są obwiniane przez rodzica, przeprowadzając dodatkowe inspekcje.

num jest opcjonalna, ale jest dolną granicą liczby znaków alfanumerycznych, które git musi wykryć jako przenoszenie/kopiowanie w pliku, aby skojarzyć te linie z nadrzędnym zatwierdzeniem. Domyślną wartością jest 20.

Powiązane problemy