176 votes

Git diff pour ne montrer que les lignes qui ont été modifiées

Quand je fais un git diff, il montre les lignes qui ont été ajoutées :

+ this line is added

les lignes qui ont été supprimées :

- this line is removed

mais il montre aussi de nombreuses lignes qui ne sont pas modifiées :

this line is not modified
this line is also not modified

Il en résulte que le diff git actuel ressemble à quelque chose comme ceci :

+ this line is added
  this line is not modified
- this line is removed
  this line is not modified

Puis-je demander à git de ne montrer que les lignes qui ont été modifiées et d'ignorer tout le reste du code qui n'a pas été modifié ? J'ai écrit une méthode qui supprime toutes les lignes qui ne sont pas précédées d'un signe "+" ou "-", mais je suis sûr qu'il doit y avoir un moyen plus simple de le faire.

Dans mon git diff, je suis seulement intéressé à voir les lignes qui ont été modifiées.

247voto

Chris Hayes Points 9953

Ce que vous voulez, c'est un diff avec 0 ligne de contexte. Vous pouvez générer ceci avec :

git diff --unified=0

ou

git diff -U0

Vous pouvez également définir cette option comme une option de configuration pour ce référentiel :

git config diff.context 0

Pour qu'il soit défini globalement, pour n'importe quel référentiel :

 git config --global diff.context 0

55voto

user650654 Points 588

Un autre hack (sur un*x) pour afficher seulement les lignes commençant par + y - :

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'

Le code ci-dessus fait ce qui suit :

  • git diff -U0 : choisir 0 ligne de contexte
  • Le premier grep inclut seulement toutes les lignes commençant par + o -
  • Le second grep exclut les lignes commençant par --- a/ o +++ b/

Couleur

Pour montrer la différence de couleur, essayez ce qui suit :

git diff -U0 --color | grep '^\e\[[^m]*m[-+]' | grep -Ev '(--- a/|\+\+\+ b/)'
  • L'expression, ^\e\[[^m]*m[-+] cherche le début de la ligne ( ^ ), puis le caractère d'échappement ( \e ), suivi par [ qui commencent ensemble la séquence d'échappement, puis tout caractère qui n'est pas un "m" (chiffres, points-virgules ou rien), suivi d'un "m" qui termine la séquence d'échappement.
  • Notez que toutes les séquences suivantes sont des séquences d'échappement valides : \e[0m (remise à zéro), \e[m (également remis à zéro), \e[1m (en gras sur), \e[31m (rouge), \e[32m (vert), \e[9;31m (biffer + rouge), \e[31;9m (rouge + barré), \e[1;4;9;31m (gras + souligné + barré + rouge). Les couleurs par défaut de git utilisent le rouge et le vert, mais elles peuvent être reconfigurées.
  • --color est la même chose que --color=always .
  • La restriction sur --- a/ o +++ b/ qui devait apparaître au début de la ligne a été supprimée pour tenir compte des séquences d'échappement, ce qui pourrait conduire à un cas limite.

Notes supplémentaires :

  • La solution ci-dessus doit être modifiée si vous utilisez des options supplémentaires de git diff telles que -R , --src-prefix , --dst-prefix , --no-prefix etc.
  • Les deux requêtes peuvent être combinées en une seule. grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )' mais je trouve la version double grep plus facile à comprendre.

8voto

galois Points 747

Je pense que pour les cas simples, la regex peut être beaucoup plus courte et plus facile à mémoriser, avec la réserve que cela ne fonctionnera pas si vous avez des changements de ligne où la ligne elle-même commence avec + o -

$ git diff | grep '^[+-][^+-]'

La regex dit que la ligne doit commencer par + o - et le caractère qui suit immédiatement ne doit être ni l'un ni l'autre. J'ai obtenu les mêmes résultats si j'ai échappé le caractère + ou pas ici, d'ailleurs...


Ejemplo:

$ cat testfile
A
B
C
D
E
F
G

Dis que je change C a X , E a Y et G a Z .

$ git diff | grep '^[+-][^+-]'
-C
+X
-E
+Y
-G
+Z

Comme je l'ai dit plus haut, cependant, c'est juste pour la plupart des cas. Si vous envoyez la sortie vers un fichier dout puis essayez la même expression rationnelle, cela ne fonctionnera pas.

$ git diff dout | grep '^[+-][^+-]'
$

Quoi qu'il en soit, j'espère que cela vous aidera dans votre cas

6voto

simleo Points 143

Pour faire suite au dernier commentaire de Chris, le principal problème avec le post-traitement est que vous voulez conserver les lignes commençant par -|+ mais vous voulez aussi filtrer celles qui commencent par ---|+++ . Si vous stockez des fichiers patch dans votre repo (je le fais, en Pydoop ), d'autre part, vous voulez garder les lignes qui commencent par --|++ donc le regexp devient un peu compliqué :

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'

La regexp utilise un lookahead négatif : voir la réponse de Peter Boughton à la question suivante cette question pour une explication détaillée.

Si vous faites cela souvent, vous pourriez vouloir mettre en place un alias git pour cela :

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'

4voto

wisbucky Points 829

Cette réponse conservera les couleurs rouge/vert originales pour la lisibilité. J'ai fourni quelques variations dans la syntaxe :

git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'

Explication :

  • El git diff --color est nécessaire pour empêcher git de désactiver la couleur lorsqu'elle est pipée.
  • El grep --color=never est d'empêcher grep de supprimer la couleur d'origine et de mettre en évidence la chaîne correspondante.
  • Nous recherchons les lignes qui commencent par du rouge ( \e[31m ) ou vert ( \e[32m ) des codes d'échappement.
  • El $'...' (syntaxe de citation ANSI-C) ou -P (syntaxe perl) est de laisser grep d'interpréter \e o \033 comme un ESC caractère.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X