Czy jest jakiś sposób, aby git dostarczył ci dziennik zatwierdzeń dla samych zatwierdzeń, które dotknęły określonej linii w pliku?
Podobnie jak git blame
, ale git blame
pokaże OSTATNIE zatwierdzenie, które dotknęło określonego wiersza.
Naprawdę chciałbym uzyskać podobny dziennik, nie listę zatwierdzeń do dowolnego miejsca w pliku, ale tylko zatwierdzenia, które dotknęły określonej linii.
Odpowiedzi:
Zobacz także Git: odkryj, które zmiany dotknęły szeregu linii .
Ponieważ Git 1.8.4 ,
git log
ma-L
by zobaczyć ewolucję różnych liniach.Załóżmy na przykład, że patrzysz na
git blame
wynik. Tutaj-L 150,+11
oznacza „patrzeć tylko na liniach 150 do 150 + 11”:I chcesz poznać historię tego, co jest teraz linią 155.
Następnie użyj
git log
. Tutaj-L 155,155:git-web--browse.sh
oznacza „śledź ewolucję linii 155 do 155 w pliku o nazwiegit-web--browse.sh
”.źródło
git log commitA-hash -L 155,155:file-name
?Możesz uzyskać zestaw zatwierdzeń za pomocą kilofu.
To da ci wszystkie zmiany, które wpłynęły na tekst w tym pliku. Jeśli nazwa pliku została w pewnym momencie zmieniona, możesz dodać opcję --follow-parent.
Jeśli chcesz sprawdzić zatwierdzenia przy każdej z tych edycji, możesz przesłać wyniki do git show:
źródło
git log -S'the previous version of the line'
i tak dalej, dokładnie tak, jak byś to zrobiłgit blame -L
. I będzie o wiele wolniejszy niżgit blame
, ponieważ musi szukać tekstu wszędzie, nie tylko w danym miejscu.Spróbuj użyć poniższego polecenia zaimplementowanego w Git 1.8.4.
Więc w twoim przypadku
upperLimit
ilowerLimit
jest dotkniętyline_number
Więcej informacji - https://www.techpurohit.com/list-some-useful-git-commands
źródło
--pretty=short
jest ignorowany podczas używania-L
. Proszę poprawićNiezwykle łatwym sposobem na to jest użycie vim-fugitive . Po prostu otwórz plik w vimie, wybierz linie, których chcesz użyć
V
, a następnie wpiszTeraz możesz użyć
:cnext
i,:cprev
aby zobaczyć wszystkie wersje pliku, w którym wiersz został zmodyfikowany. W dowolnym momencie wejdź,:Gblame
aby zobaczyć sha, autora i datę.źródło
Uproszczenie odpowiedzi @ matt -
git blame -L14,15 -- <file_path>
Tutaj otrzymasz winę za linie
14 to 15
.Ponieważ
-L
opcja oczekuje sięRange
jako parametru, nie możemy uzyskaćBlame
dla pojedynczej linii przy użyciu-L
opcji` .Odniesienie
źródło
Nie wierzę, że jest w tym coś wbudowanego. Utrudnia to fakt, że pojedyncza linia zmienia się kilka razy bez znacznej zmiany reszty pliku, więc często dochodzi do zmiany numerów linii.
Jeśli masz szczęście, że linia zawsze ma jakąś cechę identyfikującą, np. Przypisanie do zmiennej, której nazwa nigdy się nie zmienia, możesz użyć wyrażenia regularnego dla
git blame -L
. Na przykład:Ale to tylko pierwszy dopasowanie dla tego wyrażenia regularnego, więc jeśli nie masz dobrego sposobu dopasowania linii, nie jest to zbyt pomocne.
Przypuszczam, że możesz coś zhakować. Nie mam teraz czasu na pisanie kodu, ale ... coś w tym stylu. Uruchom
git blame -n -L $n,$n $file
. Pierwsze pole jest dotknięciem poprzedniego zatwierdzenia, a drugie pole to numer wiersza w tym zatwierdzeniu, ponieważ mógł on ulec zmianie. Chwyć je i uruchomgit blame -n $n,$n $commit^ $file
, tzn. To samo, zaczynając od zatwierdzenia przed ostatnią zmianą pliku.(Zauważ, że to Cię nie powiedzie, jeśli ostatni zatwierdzenie, które zmieniło linię, było zatwierdzeniem scalania. Podstawowym sposobem może się to stać, jeśli zmieniono wiersz w ramach rozwiązywania konfliktu scalenia.)
Edycja: Spotkałem się dzisiaj z postem na liście mailowej od marca 2011 roku, który wspomina o tym
tig
igit gui
ma funkcję, która pomoże ci to zrobić. Wygląda na to, że ta funkcja została rozważona, ale nie ukończona, dla samego gita.źródło
Wywoła to
git blame
dla każdej znaczącej rewizji, aby pokazać linię$LINE
pliku$FILE
:Jak zwykle, wina pokazuje numer wersji na początku każdej linii. Możesz dołączyć
aby uzyskać zagregowane wyniki, coś w rodzaju listy zatwierdzeń, które zmieniły ten wiersz. (Niezupełnie, jeśli tylko kod został przeniesiony, może to pokazywać dwa razy ten sam identyfikator zatwierdzenia dla różnych treści wiersza. Aby uzyskać bardziej szczegółową analizę, należy wykonać opóźnione porównanie
git blame
wyników dla sąsiednich zatwierdzeń. Ktoś? )źródło
Oto rozwiązanie, które definiuje alias git, dzięki czemu będziesz mógł go używać w ten sposób:
Przykład wyjściowy:
Możesz zdefiniować alias w .gitconfig lub po prostu uruchomić następującą komendę
To jest brzydka jednowarstwowa, więc tutaj jest zaciemniona równoważna funkcja bash:
Rozwiązanie kilof ( git log --pickaxe-regex -S'REGEX ' ) daje tylko dodawanie / usuwanie wierszy, a nie inne zmiany wiersza zawierającego wyrażenie regularne.
Ograniczeniem tego rozwiązania jest ta wina zwraca tylko 1. dopasowanie REGEX, więc jeśli istnieje wiele dopasowań, rekurencja może „przeskoczyć”, by podążać inną linią. Upewnij się, że sprawdziłeś pełną historię, aby wykryć te „skoki”, a następnie napraw REGEX, aby zignorować linie pasożytów.
Na koniec, oto alternatywna wersja, która uruchamia git show przy każdym zatwierdzeniu, aby uzyskać pełną różnicę:
źródło
Możesz mieszać
git blame
igit log
polecenia, aby pobrać podsumowanie każdego zatwierdzenia w poleceniu git blame i dołączyć je. Coś takiego jak poniższy skrypt bash + awk. Dołącza podsumowanie zatwierdzenia jako wbudowany komentarz kodu.W jednej linii:
źródło
W moim przypadku numer linii bardzo się zmienił w czasie. Byłem także na git 1.8.3, który nie obsługuje wyrażenia regularnego w „git blame -L”. (RHEL7 nadal ma 1.8.3)
Oneliner:
Można to oczywiście przekształcić w skrypt lub funkcję.
źródło