Comment dois-je utiliser git diff pour les longues lignes?

235

Je courais git-diff sur un fichier, mais le changement est à la fin d'une longue ligne.

Si j'utilise les touches de curseur pour me déplacer vers la droite, cela perd le codage couleur — et pire encore, les lignes ne s'alignent pas — ce qui rend plus difficile le suivi du changement.

Existe-t-il un moyen de prévenir ce problème ou de simplement boucler les lignes?

J'utilise Git 1.5.5 via mingw32.

Peter Boughton
la source
6
Vous voudrez peut-être essayer 'git diff --color-words', cela ne résout pas le problème de défilement, mais les changements de mots sont entourés de contexte sur une seule ligne!
kevinf
7
L'utilisation de "fold" semble plutôt bien fonctionner:git diff --color-words | fold
Amy
@Amy, j'ai essayé d'utiliser foldmais cela supprime la couleur. Puisque vous spécifiez, --color-wordsje suppose que vous avez réussi à transmettre des couleurs à fold. Comment?
Nero gris

Réponses:

120

L'affichage de la sortie de git diffest géré par le téléavertisseur que vous utilisez.

Généralement, sous Linux, lessserait utilisé.

Vous pouvez dire à git d'utiliser un pager différent en définissant la GIT_PAGERvariable d'environnement. Si la pagination ne vous dérange pas (par exemple, votre terminal vous permet de revenir en arrière), vous pouvez essayer de définir explicitement la valeur GIT_PAGERvide pour l'arrêter à l'aide d'un pager. Sous Linux:

$ GIT_PAGER='' git diff

Sans téléavertisseur, les lignes s'enrouleront.

Si votre terminal ne prend pas en charge la sortie colorée, vous pouvez également désactiver cette option en utilisant soit l' --no-colorargument, soit en plaçant une entrée dans la section couleur de votre fichier de configuration git.

$ GIT_PAGER='' git diff --no-color
SpoonMeiser
la source
1
Je peux confirmer que le fait de mettre GIT_PAGER à blanc fait que les lignes se terminent. Il insère également des symboles, ce qui le rend un peu difficile à lire, mais si nécessaire, je peux trouver un téléavertisseur différent, donc toujours une réponse valide. :) Merci.
Peter Boughton
1
Quels symboles ajoute-t-il qui rendent sa lecture difficile? Je pourrais peut-être également modifier ma réponse pour résoudre ce problème.
SpoonMeiser
Principalement "<- [m" pour chaque nouvelle ligne (où <- était un seul caractère de flèche), mais aussi des marqueurs où (je pense) chaque couleur aurait commencé, comme "<- [1m" et "<- [32m".
Peter Boughton
1
L'argument --no-color est-il utile du tout? Je ne suis pas sûr des caractères de la nouvelle ligne.
SpoonMeiser
Oui, merci, cela empêche tout le contenu indésirable d'apparaître, donc les nouvelles lignes doivent également être liées à la couleur.
Peter Boughton,
229

Ou si vous utilisez moins comme pageur par défaut, tapez simplement -Stout en visualisant le diff pour réactiver l'habillage en moins.

quelqu'un45
la source
60
astuce connexe, utilisez --word-diffpour voir un surlignage codé par couleur des mots modifiés
Josh Diehl
5
juste une note pour cela car j'ai vu que certaines personnes avaient des problèmes avec cela, -S est différent de -s (assurez-vous que vous
appuyez
2
@JoshDiehl: J'espère que cela ne vous dérange pas ... Je pense que la --word-diffpartie mérite d'avoir sa propre réponse à ce sujet, car elle me semble faire beaucoup pour résoudre le problème sous-jacent: comprendre ce qui a changé sur une longue ligne. Donc, j'en ai fait un: stackoverflow.com/a/19253759/313756
lindes
1
Remarque: cela ne semble pas fonctionner sous OS X (non-conformistes).
DilithiumMatrix
@zhermes Cela fonctionne pour moi dans Mavericks, avec moins de 418. Assurez-vous que vous tapez -Savec un S majuscule, non -s. Moins affiche un message «Pliez les longues lignes (appuyez sur RETOUR)» en bas après avoir tapé -S, puis appuyez sur Retour pour activer l'habillage.
Rory O'Kane
115

Vous pouvez également utiliser git configpour configurer le pager pour envelopper.

$ git config core.pager 'less -r' 

Définit le paramètre de pageur pour le projet en cours.

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

Définit le pager globalement pour tous les projets

Shoan
la source
3
avec msysgit (1.8.1.msysgit.1), cela a fonctionné pour moi en utilisant des guillemets doubles -git config --global core.pager "less -r"
kerim
Cela m'a permis de m'envelopper définitivement avec git diff sur OS X. merci!
Thomson Comer
Cela fonctionne, mais je ne comprends pas pourquoi. Quelqu'un peut-il expliquer? man less, -rne dit rien sur l'emballage.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@ThomsonComer '-r' se rapporte à l'affichage des caractères de contrôle dans OS X ... Comment avez-vous fait fonctionner cela?
DilithiumMatrix
Je ne me souviens plus avec certitude maintenant. Mais j'ai trouvé quelques liens qui l'expliquent davantage: michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/… unix.stackexchange.com/questions/19317/…
Shoan
49

Avec tout le crédit que je dois à Josh Diehl dans un commentaire à cette réponse , je pense néanmoins que cela devrait être une réponse en soi, l'ajoutant ainsi:

Une façon de gérer les différences dans les longues lignes consiste à utiliser un diff orienté sur les mots. Cela peut être fait avec:

git diff --word-diff

Dans ce cas, vous obtiendrez une sortie diff sensiblement différente, qui vous montrera spécifiquement ce qui a changé au sein d'une ligne.

Par exemple, au lieu d'obtenir quelque chose comme ça:

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

Vous pourriez obtenir quelque chose comme ceci:

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

Ou, avec colorisation, au lieu de cela:

résultat de juste <code> git diff </code>

Vous pourriez obtenir ceci:

résultat de <code> git diff --word-diff </code>

Maintenant, si vous comparez une très longue file d'attente, vous pouvez toujours avoir des problèmes avec la situation du téléavertisseur que vous avez décrite à l'origine, et qui a été traitée, apparemment à la satisfaction, dans d'autres réponses. J'espère que cela vous donnera un nouvel outil, cependant, pour identifier plus facilement ce qui a changé sur la ligne.

lindes
la source
6
Il y a deux options pour --word-diff: color, plainet porcelain. De plus, on peut changer l'expression régulière des limites de mots avec --word-diff-regex. La valeur par défaut semble être \S+. ( v2.1.1 )
Michael - Où est Clay Shirky
3
--color-wordssemble être un raccourci pour --word-diff=color, ce qui est bien lorsque vous regardez simplement le diff, pas le partager.
CivFan
Ah, c'est intéressant et potentiellement très utile. Merci d'avoir partagé!
Darragh Enright
1
J'aime --word-diff=porcelainmieux que --word-diffparce que porcelainles modifications seront alignées sur des lignes distinctes, tandis que --word-diffles modifications seront intégrées. Des lignes séparées vous permettent de voir les différences plus facilement lorsque les différences sont subtiles.
wisbucky
1
La vie change pour les fichiers LaTeX!
6005
30

Pour utiliser moins en tant que téléavertisseur et rendre l'habillage de ligne permanent, vous pouvez simplement activer l'option de pliage des lignes longues:

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

De cette façon, vous n'avez pas besoin de le saisir lorsque vous utilisez moins.

À votre santé

Daniel Montezano
la source
A travaillé pour moi sur OS X 10.9.5. Merci!
Jay Taylor
De même, si vous souhaitez désactiver l'habillage de ligne lors de la lecture des différences Git, le paramètre est similaire:git config --global core.pager 'less -S
Topher Hunt
19

Je viens de googler celui-ci. GIT_PAGER='less -r'travaille pour moi

poisson chantant
la source
9
Encore mieux (pour moi): less -R(En fait, j'utilise less -eiFRSX, ce qui résout également les problèmes de couleur et de retour à la ligne.)
cdunn2001
2
less -R est comme -r, mais seules les séquences d'échappement ANSI "couleur" sont sorties sous forme "brute". Contrairement à -r, l'apparence de l'écran est conservée correctement dans la plupart des cas. (homme moins)
richk
19

Mac OSX: Aucune des autres réponses sauf le «-S» de quelqu'un45 alors que moins fonctionne fonctionne pour moi. Il a fallu ce qui suit pour rendre le retour à la ligne persistant:

git config --global core.pager 'less -+$LESS -FRX'
John Lemberger
la source
Cela a fonctionné pour moi aussi, mais je ne comprends pas pourquoi. Que fait le -+$LESSparamètre? À moins que git ne le définisse, ma variable d'environnement LESS n'est même pas définie.
jakar
3
@jakar: alors ça ne fait rien. Dans certains environnements, $LESSest défini sur une certaine valeur (par exemple par un .loginou un .profileou quelque chose), et cette option, je pense, ajoute simplement les valeurs par défaut, puis ajoute -FRXen plus de celles-ci.
naught101
Cela n'a pas fonctionné pour moi sur OS X Mavericks, $LESSn'est pas défini.
DilithiumMatrix
naught101 a raison: + - $ LESS inclut simplement tous les paramètres dans .login ou .profile (le cas échéant). Cela fonctionne bien sur Mavericks pour moi, mais vous pouvez l'omettre, si cela pose des problèmes.
John Lemberger
5

Lorsque vous utilisez "git diff" et qu'il affiche plusieurs pages (vous voyez ":" à la fin de la page) dans ce cas, vous pouvez taper "-S" et appuyez sur Entrée. (S devrait être le capital). il fera basculer les longues lignes de pliage.

Amin
la source
c'est beaucoup plus facile que d'avoir à
jouer
4

Personne ne l'a signalé jusqu'à présent. C'est assez simple à retenir et aucune configuration supplémentaire ne doit être effectuée dans la configuration git

git diff --color | less -R
infoclogged
la source
De loin la plus simple de toutes les réponses de cette page. Mon environnement - Oracle Linux 7.6. git diff --color | less -FRpour les petits changements lorsque vous n'avez pas besoin de faire défiler
Rakesh N
3

Vous pouvez simplement diriger la sortie de git diff vers plus:

git diff | more
AnonTidbits
la source
3

Pas une solution parfaite, mais gitket git-guipeut à la fois afficher ces informations et avoir des barres de défilement.

Peter Boughton
la source
1

liste la configuration actuelle / par défaut:

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

puis mettez à jour et omettez le -S comme:

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

-S: les lignes plus longues que la largeur de l'écran sont coupées plutôt que pliées.

user5870226
la source
-1

En cas de problème, je recourt souvent à DiffMerge. Excellent outil de différenciation avec mise en évidence des différences en ligne. De plus, dans les dernières versions, ils ont ajouté un mode pour avoir un mode horizontal.

Cependant, je n'ai pas pu configurer git pour l'utiliser. Je dois donc fouiller pour obtenir les deux versions du fichier en premier.

webmat
la source