Kiedy robię różnicę git, pokazuje linie, które zostały dodane:
+ this line is added
linie, które zostały usunięte:
- this line is removed
ale pokazuje również wiele wierszy, które nie są modyfikowane:
this line is not modified
this line is also not modified
Powoduje to, że rzeczywisty różnic git wygląda mniej więcej tak:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Czy mogę poprosić git o pokazanie tylko zmodyfikowanych wierszy i zignorowanie pozostałego kodu, który nie został zmodyfikowany? Napisałem metodę, która usunie wszystkie linie, które nie mają przed sobą znaku „+” lub „-”, ale jestem pewien, że musi istnieć prostszy sposób, aby to zrobić.
W moim git diff interesuje mnie tylko wyświetlanie zmodyfikowanych linii.
Z góry dziękuję.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
mieć to ustawione globalnieKolejny hack (na un * x), aby pokazać tylko linie zaczynające się od
+
i-
:Powyższy kod wykonuje następujące czynności:
git diff -U0
: wybierz 0 linii kontekstu+
lub-
--- a/
lub+++ b/
Kolor
Aby wyświetlić kolorowe różnice, spróbuj wykonać następujące czynności:
^\e\[[^m]*m[-+]
szuka początku wiersza (^
), następnie znaku ucieczki (\e
), po[
którym następuje razem początek sekwencji sterującej , a następnie dowolnego znaku innego niż „m” (liczby, średniki lub nic), po którym następuje „ m ”, co kończy sekwencję ucieczki.\e[0m
(reset),\e[m
(także reset),\e[1m
(pogrubienie),\e[31m
(czerwony),\e[32m
(zielony),\e[9;31m
(przekreślenie + czerwony),\e[31;9m
(czerwony + przekreślenie),\e[1;4;9;31m
(pogrubienie + podkreśl + przekreśl + czerwony). Domyślne kolory git to czerwony i zielony, ale można je zmienić.--color
jest taki sam jak--color=always
.--- a/
lub+++ b/
pojawiania się na początku linii zostało usunięte, aby uwzględnić sekwencje ucieczki, co może prowadzić do skrajnego przypadku.Dodatkowe uwagi:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
, itdgrep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, ale wydaje mi się, że wersja podwójnego grepa jest łatwiejsza do zrozumienia.źródło
git diff
linii typu „nagłówek”, które zaczynają się od@@
, ale co to sągit diff
linie zaczynające się od---
lub+++
? Nie byłem tego świadomy.+++
) lub usunięcia (---
). Widzę to teraz tutaj: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
wydaje się oznaczać „plik po lewej stronie” lub plik taki, jaki był wcześniej, i+++ b/filename
wydaje się oznaczać „plik po prawej stronie”, lub plik taki, jaki jest teraz z twoimi zmianami. Jestem tak przyzwyczajony do używaniagit difftool
z meldowaniem , które pokazuje piękne porównania obok siebie, do których nigdy się nie przyzwyczaiłemgit diff
, więc nadal wygląda to dla mnie dziwnie i nigdy wcześniej nie patrzyłem na te niuanse.Nawiązując do ostatniego komentarza Chrisa, głównym problemem związanym z przetwarzaniem końcowym jest to, że chcesz zachować wiersze zaczynające się od,
-|+
ale chcesz też odfiltrować te, które zaczynają się od---|+++
. Z drugiej strony, jeśli przechowujesz pliki łatek w swoim repozytorium (robię to w Pydoop ), chcesz zachować linie zaczynające się od--|++
, więc wyrażenie regularne staje się nieco zaangażowane:Wyrażenie regularne używa ujemnego wyprzedzenia: zobacz odpowiedź Petera Boughton na to pytanie, aby uzyskać szczegółowe wyjaśnienie.
Jeśli robisz to często, możesz chcieć skonfigurować dla niego alias git:
źródło
-P
lub--perl-regexp
jest używany do interpretowania wzorca jako regularnej ponownej ekspresji Perla, ale nie zawsze jest implementowany. Nie działało na mnie na OSX. gnu.org/software/grep/manual/grep.html#grep-ProgramsMyślę, że w prostych przypadkach wyrażenie regularne może być znacznie krótsze i łatwiejsze do zapamiętania, z zastrzeżeniem, że nie zadziała, jeśli masz zmiany wiersza, w których sama linia zaczyna się od
+
lub-
Wyrażenie regularne mówi, że wiersz powinien zaczynać się od
+
lub-
, a następujący po nim znak nie powinien być żadnym z tych znaków. Mam takie same wyniki, czy uciekłem+
tutaj, czy nie, przy okazji ...Przykład:
Powiedz, że zmieniam się
C
naX
,E
naY
iG
naZ
.Jak powiedziałem powyżej, dotyczy to jednak tylko większości przypadków. Jeśli potokujesz to wyjście do pliku
dout
, a następnie wypróbuj to samo wyrażenie regularne, to nie zadziała.Tak czy inaczej, mam nadzieję, że to pomoże w twoim przypadku
źródło
- name: No pdb
w pliku yaml.Ta odpowiedź zachowa oryginalne czerwono-zielone kolory dla czytelności. Podałem kilka odmian składni:
Wyjaśnienie:
git diff --color
to potrzebne, aby uniemożliwić gitowi wyłączenie koloru podczas przesyłania rur.grep --color=never
to zapobiec usunięciu przez grep oryginalnego koloru i podświetleniu dopasowanego ciągu.\e[31m
) lub zielonych (\e[32m
) kodów ucieczki.$'...'
(ANSI-C składnia cytowanie) lub-P
(Perl składni) to niechgrep
interpretować\e
albo\033
jakoESC
postać.źródło
$''
rola szczególnie mi pomogła. stackoverflow.com/a/61929887/4561887Jak używać,
awk
aby wyświetlać tylko linie+
i-
, uwzględniając dowolny kolor lub formatowanie tekstugit diff
:Żadna z pozostałych odpowiedzi tutaj (w tym moja druga odpowiedź ) nie zrobi dokładnie tego, co chcesz w 100% poprawnie. Ta odpowiedź jednak będzie. Oto 1-liniowiec, który możesz skopiować i wkleić do swojego terminala. Właśnie utworzyłem go w wielu wierszach, aby był czytelny - możesz go skopiować i wkleić w ten sam sposób w obie strony, więc równie dobrze mogę uczynić go czytelnym! Opiera się na
awk
języku programowania:Oto jego cechy. Wszystkie te cechy razem wzięte rozwiązują wady każdej innej odpowiedzi tutaj:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
ustawieniach . Dlatego powyższe wyrażenie regularne zawiera;?
i{1,10}
: jeśli wykryje początek koloru lub kodu formatowania tekstu, dopasuje do 10 sekwencji tych połączonych kodów ANSI.NIE zawiera również wierszy zaczynających się od
@@
i słowadiff
, jak to ma miejsce w zaakceptowanej odpowiedzi . Jeśli chcesz te linie (które szczerze mówiąc, myślę, że są przydatne :)), zrób to zamiast tego:lub
Pokazuje dane wyjściowe w taki sam sposób, jak
git diff
byłby to: naless
pagerze z opcjonalnym wyjściem kolorowym (-R
) i tylko wtedy, gdy tekst jest> 1 strona (-F
), i zachowując bieżącą stronę tekstu na ekranie, gdyq
wykonujesz polecenie uit (-X
) .Ma również tę zaletę, że jest potężny i łatwo konfigurowalny, ponieważ używa języka programowania awk.
Jeśli jesteś zainteresowany nauką awk , oto kilka zasobów:
gawk
(GNUawk
) podręcznik: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
i zamieszczone tam komentarze: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
, czyligit diff
z numerami linii, zobacz tutaj: Git diff z numerami linii (Git log z numerami linii)Jako bonus
git diffc
dodałem również powyższe, aby użyć jako , co oznacza "git diff, aby pokazać TYLKO 'zmiany". Użycie jest identyczne zgit diff
; po prostu użyjgit diffc
zamiast tego! Obsługuje WSZYSTKIE opcje. Kolor jest domyślnie WŁĄCZONY. Aby go wyłączyć, po prostu użyjgit diffc --no-color
lubgit diffc --color=never
. Zobaczman git diff
szczegóły.Odkąd właśnie skończyłem wczoraj wieczorem
git diffn
(narzędzie do wyświetlania zagit diff
pomocą linii i liczb), pisaniegit diffc
było trywialne. Pomyślałem, że lepiej zrobię to teraz, kiedy wiedza jest świeża w mojej głowie.Zainstaluj
git diffc
:Postępuj zgodnie z instrukcjami na końcu tej odpowiedzi tutaj , z wyjątkiem wszystkich miejsc, które widzisz
git-diffn
w instrukcjach, użyjgit-diffc
zamiast tego. Dotyczy to równieżwget
polecenia. Pobieranie i instalowaniegit diffc
jest łatwe: to tylko kilka poleceń.źródło
Oto inny, prostszy sposób na znalezienie tylko tych wierszy, które zostały zmodyfikowane i dlatego zaczynają się od pojedynczego
+
lub-
, zachowując kolor wyjściowy:-U0
Mówi zawierać 0 linii kontekstu wokół zmienionych linii - czyli: obejmują tylko te zmieniły same linie. Zobaczman git diff
.-E
Dla grep na to pozwala pracować z rozszerzonych wyrażeń regularnych$''
Składnia najwyraźniej pozwala ANSI cytowanie, który poprawnie interpretuje ESC (escape lub 0x1b) Postać prawidłowo. Widzieć tutaj .^
dopasowuje początek wiersza,\e
dopasowuje znak Escape, który jest początkiem kodu koloru w terminalu,\[
dopasowuje następny znak w kodzie koloru, czyli jest[
, a następnie(this|that)
składnia dopasowuje „to” lub „tamto” , gdzie to jest32m+
zielona linia +, a31m-
czerwona linia.\e[32m
jest zielony i\e[31m
jest czerwony.+
pokazujegit diff
oczywiście linie oznaczone jako dodane i-
pokazuje linie oznaczonegit diff
jako usunięte.--color=never
jest wymagane w 2grep
wyrażeniu, aby zapobiec podświetlaniu dopasowań, co w przeciwnym razie spieprzyłoby kody kolorów przychodzące odgit diff
lewej strony.+
również wprowadzić zmiany znaczenia,\+
ponieważ w przeciwnym razie+
jest to specjalny znak wyrażenia regularnego (regex), który określa jedno lub więcej wystąpień poprzedniego elementu . Zobacz tutaj: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .Bibliografia:
Związane z:
git-filechange-search.sh
- skrypt, który pozwala przeszukać plik pod kątem nazwy zmiennej lub funkcji i dowiedzieć się, które zatwierdzenia zawierają zmiany o tej zmiennej lub nazwie funkcji. Dawny. użycie:./git-filechange-search.sh path/to/my/file.cpp variable_name
znajdzie wszystkie zatwierdzenia ze zmianami w pliku.cpp, które sięvariable_name
w nich zawierają . Jest to przydatne, aby zobaczyć, gdzie i kiedy zostały zmienione niektóre funkcje. To tak, jakby było to wyszukiwanie, które pozwala na obserwację sekcji pliku wyświetlanegogit blame
w czasie.źródło