Come dovrei usare git diff per le linee lunghe?


235

Sto eseguendo git-diff su un file, ma la modifica è alla fine di una lunga fila.

Se uso i tasti cursore per spostarmi a destra, perde la codifica a colori - e peggio ancora le linee non si allineano - rendendo più difficile tenere traccia delle modifiche.

C'è un modo per prevenire quel problema o semplicemente per avvolgere le linee invece?

Sto eseguendo Git 1.5.5 tramite mingw32.


6
Potresti provare 'git diff --color-words', non risolve il problema di scorrimento, ma i cambiamenti di parole sono circondati dal contesto su una sola riga!
kevinf,

7
L'uso di "fold" sembra funzionare abbastanza bene:git diff --color-words | fold
Amy

@Amy ho provato a usare foldma rimuove il colore. Dato che specifichi, --color-wordssuppongo che tu sia riuscito a passare i colori a fold. Come?
Nero gris,

Risposte:


120

La visualizzazione dell'output di git diffviene gestita da qualsiasi cercapersone che si sta utilizzando.

Comunemente, sotto Linux, lessverrebbe utilizzato.

Puoi dire a git di usare un altro cercapersone impostando la GIT_PAGERvariabile d'ambiente. Se non ti dispiace per il paging (ad esempio, il tuo terminale ti consente di scorrere indietro) potresti provare esplicitamente GIT_PAGERa svuotare per fermarlo usando un cercapersone. Sotto Linux:

$ GIT_PAGER='' git diff

Senza un cercapersone, le righe verranno completate.

Se il tuo terminale non supporta l'output colorato, puoi anche disattivarlo usando l' --no-colorargomento o inserendo una voce nella sezione colore del tuo file di configurazione git.

$ GIT_PAGER='' git diff --no-color

1
Posso confermare che l'impostazione di GIT_PAGER su vuoto causa il ritorno a capo delle righe. Inserisce anche simboli che rendono un po 'difficile la lettura, ma se necessario posso trovare un cercapersone diverso, quindi ancora una risposta valida. :) Grazie.
Peter Boughton,

1
Quali simboli aggiunge che rendono difficile la lettura? Potrei essere in grado di modificare la mia risposta per risolvere anche questo problema.
SpoonMeiser,

Principalmente "<- [m" per ogni newline (dove <- era un singolo carattere a freccia), ma anche marcatori in cui (penso) ogni colore sarebbe iniziato, come "<- [1m" e "<- [32m".
Peter Boughton,

1
L'argomento --no-color aiuta affatto? Non sono sicuro dei personaggi newline.
SpoonMeiser,

Sì, grazie, ciò impedisce la visualizzazione di tutti i contenuti indesiderati, quindi anche quelli newline devono essere stati correlati al colore.
Peter Boughton,

229

Oppure, se usi meno come cercapersone predefinito, digita -Smentre visualizzi il diff a riattivabile in meno.


60
suggerimento correlato, utilizzare --word-diffper visualizzare un evidenziazione con codice colore delle parole modificate
Josh Diehl

5
solo una nota per questo da quando ho visto che alcune persone avevano problemi con esso, -S è diverso da -s (assicurati di
premere

2
@JoshDiehl: Spero non ti dispiaccia ... Penso che la --word-diffparte meriti di avere una sua risposta su questo, dato che mi sembra fare molto per aiutare a risolvere il problema di fondo: capire cosa è cambiato su una lunga fila. Così, ho fatto uno: stackoverflow.com/a/19253759/313756
Lindes

1
Nota: questo non sembra funzionare su OS X (maverick).
DilithiumMatrix,

@zhermes Funziona per me in Mavericks, con meno 418. Assicurati di scrivere -Scon la S maiuscola, no -s. Meno visualizza un messaggio "Piega le righe lunghe (premere INVIO)" in basso dopo aver digitato -S, quindi premere Invio per abilitare il wrapping.
Rory O'Kane,

115

È inoltre possibile utilizzare git configper configurare il cercapersone da avvolgere.

$ git config core.pager 'less -r' 

Imposta l'impostazione del cercapersone per il progetto corrente.

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

Imposta il cercapersone a livello globale per tutti i progetti


3
con msysgit (1.8.1.msysgit.1) ha funzionato per me usando le doppie virgolette -git config --global core.pager "less -r"
Kerim

Questo mi ha fatto impacchettare definitivamente con git diff su OS X. grazie!
Thomson Comer,

Funziona, ma non capisco perché. Qualcuno può spiegare? man less, -rnon dice nulla sul confezionamento.
Ciro Santilli 5 冠状 病 六四 事件 法轮功

@ThomsonComer '-r' riguarda la visualizzazione dei caratteri di controllo in OS X ... Come hai fatto a farlo funzionare?
DilithiumMatrix,


49

Con pieno merito a Josh Diehl in un commento a questa risposta , mi sento comunque che questa dovrebbe essere una risposta a se stessa, quindi aggiungendola:

Un modo per gestire le differenze nelle lunghe righe è utilizzare un diff orientato alle parole. Questo può essere fatto con:

git diff --word-diff

In questo caso, otterrai un output diff significativamente diverso, che ti mostra specificamente cosa è cambiato all'interno di una linea.

Ad esempio, invece di ottenere qualcosa del genere:

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

Potresti ottenere qualcosa del genere:

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

Oppure, con colorazione, invece di questo:

risultato di solo <code> git diff </code>

Potresti ottenere questo:

risultato di <code> git diff --word-diff </code>

Ora, se stai confrontando una linea molto lunga, potresti avere ancora problemi con la situazione del cercapersone che hai descritto in origine e che è stata affrontata, apparentemente con soddisfazione, in altre risposte. Spero che questo ti dia un nuovo strumento, tuttavia, per identificare più facilmente cosa è cambiato sulla linea.


6
Ci sono un paio di opzioni per --word-diff: color, plain, e porcelain. Inoltre, si può cambiare la regex per i confini delle parole con --word-diff-regex. L'impostazione predefinita sembra essere \S+. ( v2.1.1 )
Michael - Dov'è Clay Shirky il

3
--color-wordssembra essere una scorciatoia per --word-diff=color, il che è bello quando stai solo visualizzando il diff, non condividendolo.
CivFan,

Ah, questo è interessante e potenzialmente molto utile. Grazie per la condivisione!
Darragh Enright, l'

1
Mi piace di --word-diff=porcelainpiù --word-diffperché porcelainallineare le modifiche su linee separate, mentre --word-diffle modifiche saranno in linea . Linee separate consentono di vedere le differenze più facilmente quando le differenze sono sottili.
Wisbucky

1
La vita cambia per i file LaTeX!
6005

30

Per usare meno come cercapersone e rendere permanente il ritorno a capo, puoi semplicemente abilitare l'opzione piega linee lunghe:

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

In questo modo non è necessario digitarlo mentre si utilizza meno.

Saluti


Ha funzionato per me su OS X 10.9.5. Grazie!
Jay Taylor,

Allo stesso modo, se si desidera DISATTIVARE il ritorno a capo quando si legge Git diff, l'impostazione è simile:git config --global core.pager 'less -S
Topher Hunt

19

Ho appena cercato su questo. GIT_PAGER='less -r'per me va bene


9
Ancora meglio (per me): less -R(In realtà, io uso less -eiFRSX, che risolve anche i problemi di colore e di avvolgimento della linea.)
cdunn2001,

2
less -R è come -r, ma solo le sequenze di escape "color" ANSI vengono emesse in forma "raw". A differenza di -r, l'aspetto dello schermo viene mantenuto correttamente nella maggior parte dei casi. (meno uomo)
richk,

19

Mac OSX: nessuna delle altre risposte, tranne '-S' di qualcuno45 mentre meno è in esecuzione ha funzionato per me. Ci sono voluti i seguenti per rendere persistente il ritorno a capo automatico:

git config --global core.pager 'less -+$LESS -FRX'

Questo ha funzionato anche per me, ma non capisco perché. Cosa sta -+$LESSfacendo il parametro? A meno che git non lo definisca, la mia variabile di ambiente LESS non è nemmeno impostata.
Jakar,

3
@jakar: quindi non fa nulla. In alcuni ambienti, $LESSè impostato su un valore (ad es. Da a .logino a .profileo qualcosa), e quell'opzione, penso, aggiunge solo i valori predefiniti, quindi aggiunge -FRXquelli.
naught101

Questo non ha funzionato per me su OS X Mavericks, $LESSnon è definito.
DilithiumMatrix,

naught101 ha ragione nel dire che + - $ LESS include semplicemente qualsiasi impostazione sia in .login o .profile (se presente). Per me funziona bene su Mavericks, ma puoi ometterlo, se causa problemi.
John Lemberger,



5

Quando stai usando "git diff" e mostra diverse pagine (vedi ":" alla fine della pagina) in questo caso puoi digitare "-S" e premere Invio. (S dovrebbe essere maiuscolo). alternerà le linee lunghe.


questo è molto più facile che dover fare confusione con qualsiasi impostazione
chharvey l'

4

Nessuno lo ha sottolineato fino ad ora. È abbastanza semplice da ricordare e non è necessario eseguire ulteriori configurazioni nella configurazione di git

git diff --color | less -R

Di gran lunga la più semplice di tutte le risposte in questa pagina. Il mio ambiente - Oracle Linux 7.6. git diff --color | less -FRper piccole modifiche quando non è necessario scorrere
Rakesh N

3

Potresti semplicemente reindirizzare l'output di git diff a più:

git diff | more

3

Non una soluzione perfetta, ma gitke git-guipuò mostrare sia questa informazione, e hanno barre di scorrimento.


1

elenca la configurazione corrente / predefinita:

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

quindi aggiorna e lascia fuori il -S come:

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

the -S: fa sì che le linee più lunghe della larghezza dello schermo vengano troncate anziché piegate.


-1

Quando sono nei guai, ricorro spesso a DiffMerge. Eccellente strumento diff con evidenziazione diff in linea. Inoltre, nelle ultime versioni hanno aggiunto una modalità per avere una modalità orizzontale.

Non sono stato in grado di configurare git per usarlo, però. Quindi devo andare in giro per ottenere prima entrambe le versioni del file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.