Diff Git pour afficher uniquement les lignes modifiées

Quand je fais un diff git, 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 également de nombreuses lignes qui ne sont pas modifiées:

 this line is not modified this line is also not modified 

Cela se traduit par la diff Git diff 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 d’afficher uniquement les lignes modifiées et ignorer tout autre code qui n’a pas été modifié? J’ai écrit une méthode qui supprime toutes les lignes qui n’ont pas de signe “+” ou “-” devant elles, mais je suis sûr que cela doit être plus simple.

Dans mon diff Git, je ne suis intéressé que par les lignes modifiées.

Merci d’avance.

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

 git diff --unified=0 

ou

 git diff -U0 

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

 git config diff.context 0 

Pour le définir globalement, pour tout référentiel:

  git config --global diff.context 0 

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

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

Le code ci-dessus fait ce qui suit:

  • git diff -U0 : choisissez 0 lignes de contexte
  • Le premier grep ne comprend que toutes les lignes commençant par + ou -
  • Le second grep exclut les lignes commençant par --- a/ or +++ b/

Remarque: – La solution ci-dessus devra être modifiée si vous utilisez des options git diff supplémentaires telles que -R , --src-prefix , --dst-prefix , --no-prefix , … – Les deux greps peuvent être combinés dans un seul grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )' , mais je trouve la version double grep plus facile à comprendre.

Suite au dernier commentaire de Chris, le principal problème avec le post-traitement est que vous voulez garder les lignes commençant par -|+ mais vous voulez aussi filtrer celles qui commencent par ---|+++ . Si vous stockez des fichiers de correctifs dans votre repo (je le fais dans Pydoop ), par contre, vous souhaitez conserver les lignes commençant par --|++ , de sorte que l’expression rationnelle devient un peu compliquée:

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

L’expression rationnelle utilise une expression négative: voyez la réponse de Peter Boughton à cette question pour une explication détaillée.

Si vous faites cela souvent, vous voudrez peut-être configurer un alias git pour cela:

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

Je pense que pour les cas simples, les regex peuvent être beaucoup plus courtes et plus faciles à mémoriser, avec l’avertissement que cela ne fonctionnera pas si vous avez des changements de ligne où la ligne elle-même commence par + ou -

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

La regex dit que la ligne devrait commencer par + ou - et le caractère suivant immédiatement ne devrait être ni l’un ni l’autre. J’ai eu les mêmes résultats si j’ai échappé le + ou pas ici, du moins …


Exemple:

 $ cat testfile A B C D E F G 

Disons que je change de C en X , E en Y et G en Z

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

Comme je l’ai dit plus haut, c’est juste pour la plupart des cas. Si vous transmettez cette sortie à un fichier dout , puis essayez la même expression régulière, cela ne fonctionnera pas.

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

En tout cas, j’espère que cela vous aidera