Jak powinienem używać git diff do długich linii?

235

Używam git-diff na pliku, ale zmiana jest na końcu długiej linii.

Jeśli użyję klawiszy kursora, aby przejść w prawo, utraci to kodowanie kolorami - a co gorsza, linie się nie wyrównują - co utrudni śledzenie zmiany.

Czy istnieje sposób, aby zapobiec temu problemowi lub po prostu sprawić, by linie się zawijały?

Używam Git 1.5.5 przez mingw32.

Peter Boughton
źródło
6
Możesz spróbować „git diff --color-words”, to nie rozwiązuje problemu przewijania, ale zmiany słów są otoczone kontekstem w jednym wierszu!
kevinf
7
Wydaje się, że użycie „fold” działa całkiem dobrze:git diff --color-words | fold
Amy,
@Amy próbowałem użyć, foldale usuwa kolor. Ponieważ podałeś --color-words, zakładam, że udało ci się przekazać kolory fold. W jaki sposób?
Nero gris

Odpowiedzi:

120

Wyświetlanie danych wyjściowych git diffjest obsługiwane przez dowolny pager, którego używasz.

Zwykle w Linuksie lessbyłby używany.

Możesz powiedzieć gitowi, aby używał innego pagera, ustawiając GIT_PAGERzmienną środowiskową. Jeśli nie masz nic przeciwko stronicowaniu (na przykład terminal pozwala ci na przewijanie do tyłu), możesz spróbować jawnie ustawić GIT_PAGERpuste, aby zatrzymać korzystanie z pagera. W systemie Linux:

$ GIT_PAGER='' git diff

Bez pagera linie zostaną zawinięte.

Jeśli twój terminal nie obsługuje kolorowych wydruków, możesz to wyłączyć za pomocą --no-colorargumentu lub wpisu w sekcji kolorów pliku konfiguracyjnego git.

$ GIT_PAGER='' git diff --no-color
SpoonMeiser
źródło
1
Mogę potwierdzić, że ustawienie GIT_PAGER na puste powoduje zawijanie się linii. Wstawia także symbole, które utrudniają czytanie, ale w razie potrzeby mogę znaleźć inny pager, więc wciąż poprawna odpowiedź. :) Dzięki.
Peter Boughton,
1
Jakie dodane symbole utrudniają czytanie? Być może będę w stanie edytować moją odpowiedź, aby rozwiązać ten problem.
SpoonMeiser
Głównie „<- [m” dla każdej nowej linii (gdzie <- był pojedynczą strzałką), ale także znaczniki, w których (myślę) każdy kolor zacząłby się, jak „<- [1m” i „<- [32m”).
Peter Boughton,
1
Czy argument --no-color w ogóle pomaga? Nie jestem pewien co do znaków nowej linii.
SpoonMeiser
Tak, dzięki, że zapobiega to pojawianiu się niechcianej zawartości, więc te z nowej linii muszą być również powiązane z kolorem.
Peter Boughton
229

Lub jeśli używasz mniej jako domyślnego pagera, po prostu wpisz -Spodczas przeglądania różnic, aby włączyć ponownie zawijanie w mniej.

ktoś45
źródło
60
powiązana wskazówka, użyj, --word-diffaby zobaczyć kolorowe podkreślenie zmienionych słów
Josh Diehl,
5
Tylko uwaga na to, ponieważ widziałem kilka osób mających problemy z nim, -S różni się od -S (upewnij się, że uderzenie Shift + S)
Longda
2
@JoshDiehl: Mam nadzieję, że nie masz nic przeciwko ... Myślę, że ta --word-diffczęść zasługuje na własną odpowiedź na to pytanie, ponieważ wydaje mi się, że robię wiele, aby pomóc rozwiązać podstawowy problem: zastanawianie się, co się zmieniło na dłuższej linii. Zrobiłem to jeden: stackoverflow.com/a/19253759/313756
lindes,
1
Uwaga: wydaje się, że nie działa to w systemie OS X (mavericks).
DilithiumMatrix
@zhermes To działa na mnie w Mavericks, z mniejszym 418. Upewnij się, że wpisywanie -Sprzez duże S, nie -s. Less wyświetla komunikat „Złożyć długie linie (naciśnij klawisz RETURN)” u dołu po wpisaniu -S, a następnie naciśnięcie klawisza Return umożliwia zawijanie.
Rory O'Kane
115

Możesz także użyć, git configaby skonfigurować pager do zawijania.

$ git config core.pager 'less -r' 

Ustawia ustawienie pagera dla bieżącego projektu.

$ git config --global core.pager 'less -r' 

Ustawia pager globalnie dla wszystkich projektów

Shoan
źródło
3
z msysgit (1.8.1.msysgit.1) działało dla mnie przy użyciu podwójnych cudzysłowów -git config --global core.pager "less -r"
kerim
Dzięki temu na stałe pakuję się w git diff na OS X. dzięki!
Thomson Comer
Działa, ale nie rozumiem dlaczego. Czy ktoś może wyjaśnić? man less, -rnie mówi nic o pakowaniu.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@ThomsonComer '-r' odnosi się do pokazywania znaków kontrolnych w OS X ... Jak to się stało?
DilithiumMatrix
Teraz już nie pamiętam. Ale znalazłem kilka linków, które wyjaśniają to bardziej: michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/... unix.stackexchange.com/questions/19317/...
Shoan
49

Z pełnym uznaniem dla Josha Diehla w komentarzu do tej odpowiedzi , jednak uważam, że powinna to być odpowiedź sama w sobie, dlatego dodając:

Jednym ze sposobów radzenia sobie z różnicami w długich liniach jest użycie różnicy zorientowanej na słowa. Można to zrobić za pomocą:

git diff --word-diff

W takim przypadku otrzymasz znacznie inny wynik różnicowy, który pokazuje konkretnie to, co zmieniło się w linii.

Na przykład zamiast uzyskać coś takiego:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

Możesz dostać coś takiego:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

Lub z koloryzacją zamiast tego:

wynik tylko <code> git diff </code>

Możesz dostać to:

wynik <code> git diff --word-diff </code>

Teraz, jeśli porównujesz naprawdę długą linię, możesz nadal mieć problemy z sytuacją pagera, którą pierwotnie opisałeś i która została rozwiązana, najwyraźniej dla satysfakcji, w innych odpowiedziach. Mam jednak nadzieję, że daje to nowe narzędzie do łatwiejszego identyfikowania zmian w linii.

Lindes
źródło
6
Istnieje kilka opcji dla --word-diff: color, plain, i porcelain. Można również zmienić wyrażenie regularne dla granic słów za pomocą --word-diff-regex. Domyślnie wydaje się, że jest \S+. ( v2.1.1 )
Michael - Where's Clay Shirky
3
--color-wordswygląda na skrót --word-diff=color, co jest miłe, gdy oglądasz różnicę, a nie ją udostępniasz.
CivFan,
Ach, to jest interesujące i potencjalnie bardzo przydatne. Dzięki za udostępnienie!
Darragh Enright,
1
Podoba mi się --word-diff=porcelainbardziej niż --word-diffdlatego, porcelainże ustawię zmiany w osobnych liniach, jednocześnie --word-diffwprowadzając zmiany w linii. Oddzielne linie pozwalają łatwiej zobaczyć różnice, gdy różnice są subtelne.
wisbucky,
1
Życie zmienia się dla plików LaTeX!
6005
30

Aby użyć mniej jako pagera i uczynić zawijanie linii trwałym, możesz po prostu włączyć opcję składania długich linii:

git config --global core.pager 'less -+S'

W ten sposób nie musisz wpisywać go, używając mniej.

Twoje zdrowie

Daniel Montezano
źródło
Pracował dla mnie w systemie OS X 10.9.5. Dzięki!
Jay Taylor,
Podobnie, jeśli chcesz WYŁĄCZYĆ zawijanie linii podczas czytania Git diffs, ustawienie jest podobne:git config --global core.pager 'less -S
Topher Hunt
19

Właśnie przejrzałem ten. GIT_PAGER='less -r'pracuje dla mnie

singingfish
źródło
9
Jeszcze lepiej (dla mnie): less -R(Właściwie używam less -eiFRSX, który rozwiązuje również problemy z kolorem i zawijaniem wiersza.)
cdunn2001
2
mniej -R jest jak -r, ale tylko sekwencje specjalne „kolorowe” ANSI są generowane w postaci „surowej”. W przeciwieństwie do opcji -r, w większości przypadków wygląd ekranu jest poprawnie utrzymywany. (bez mężczyzny)
richk
19

Mac OSX: Żadna z pozostałych odpowiedzi, z wyjątkiem czyjejś „-S”, podczas gdy less działa, nie działało. Aby utrwalanie zawijania słów trwało:

git config --global core.pager 'less -+$LESS -FRX'
John Lemberger
źródło
To też działało dla mnie, ale nie rozumiem dlaczego. Co -+$LESSrobi parametr? O ile git tego nie zdefiniuje, moja zmienna środowiskowa LESS nie jest nawet ustawiona.
jakar
3
@jakar: to nic nie robi. W niektórych środowiskach $LESSjest ustawiona na pewną wartość (np. Przez a .loginlub a .profilelub coś), a ta opcja, myślę, po prostu dodaje wartości domyślne, a następnie dodaje -FRXje.
naught101
To nie działało dla mnie w OS X Mavericks, $LESSjest niezdefiniowane.
DilithiumMatrix
naught101 ma rację, że + - $ LESS zawiera po prostu wszystkie ustawienia w .login lub .profile (jeśli istnieją). Dla mnie działa dobrze w Mavericks, ale możesz to pominąć, jeśli powoduje to problemy.
John Lemberger,
5

Kiedy używasz „git diff” i pokazuje on kilka stron (na końcu strony widzisz „:”), w tym przypadku możesz wpisać „-S” i nacisnąć enter. (S powinno być wielką literą). będzie przełączać fałdy długich linii.

Jestem w
źródło
jest to o wiele łatwiejsze niż konieczność wprowadzania jakichkolwiek ustawień
chharvey
4

Do tej pory nikt tego nie zauważył. Jest dość prosty do zapamiętania i nie wymaga dodatkowej konfiguracji w git config

git diff --color | less -R
zaatakowany
źródło
Zdecydowanie najprostsza ze wszystkich odpowiedzi na tej stronie. Moje środowisko - Oracle Linux 7.6. git diff --color | less -FRw przypadku drobnych zmian, gdy nie trzeba przewijać
Rakesh N
3

Możesz po prostu przesłać dane wyjściowe git diff do większej liczby:

git diff | more
AnonTidbits
źródło
3

Nie jest to idealne rozwiązanie, ale gitki git-guimoże pokazać zarówno te informacje i mają paski przewijania.

Peter Boughton
źródło
1

wypisz bieżącą / domyślną konfigurację:

  $ git config --global core.pager  
    less -FXRS -x2

następnie zaktualizuj i pomiń -S jak:

  $ git config --global core.pager 'less -FXR -x2'

-S: Powoduje, że linie dłuższe niż szerokość ekranu są przycinane, a nie składane.

użytkownik5870226
źródło
-1

Kiedy mam kłopoty, często uciekam się do DiffMerge. Doskonałe narzędzie do różnicowania, które ma podświetlanie w linii. Ponadto w najnowszych wersjach dodali tryb mający tryb poziomy.

Jednak nie byłem w stanie skonfigurować gita, aby go używał. Więc muszę się rozejrzeć, żeby najpierw uzyskać obie wersje pliku.

webmat
źródło