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.

1voto

Gabriel Staples Points 1804

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é ?

Et de le commentaire de suivi du PO sous la réponse principale :

Merci pour cette réponse rapide. Cela résout la moitié de mon problème, mais j'obtiens toujours des lignes telles que @@ -1 +1 @@ dans mon diff et en haut de mon git diff ont diff --git a/db/xxxxxxx b/db/xxxx index xxxxx..aaaaaaa bbbbbbbb . -r3b00t

Pour résoudre les deux demandes ci-dessus, voici la solution en 1 ligne qui utilise la méthode git-diffc.sh awk -que j'ai écrit autour de git diff :

git diffc

C'est fait !

Voici les caractéristiques de git diffc .
Toutes ces caractéristiques, prises ensemble, résoudre les défauts de toutes les autres réponses ici :

  1. Il gère les sorties en couleur ET sans couleur. C'est ce que fait cette expression régulière : ^(\033\[(([0-9]{1,2};?){1,10})m)?

  2. Il prend en charge TOUTES LES COULEURS et TOUTES LES OPTIONS DE MISE EN FORME DU TEXTE, y compris le gras, l'italique, le barré, etc. dans votre git config paramètres . C'est pourquoi la regex ci-dessus a ;? y {1,10} en lui : s'il détecte le début d'un code de couleur ou de formatage de texte, il fera correspondre jusqu'à 10 séquences de ces codes ANSI combinés.

  3. Il ne comprend PAS également les lignes qui commencent par @@ et le mot diff comme le réponse acceptée fait. Si vous voulez vraiment ces lignes (qui, très franchement, sont utiles :) ), faites ceci à la place :

    git diff --unified=0

    ou

    git diff -U0
  4. Il montre la sortie de la même façon que git diff serait : dans le less pager avec sortie couleur optionnelle ( -R ), et seulement si le texte est > 1 page ( -F ), et tout en conservant la page de texte en cours à l'écran lorsque vous utilisez la fonction q uit ( -X ).

Il a également l'avantage d'être puissant et facilement configurable puisqu'il utilise le langage de programmation awk.

Exemple de sortie de git diff 8d4d4fd3b60f200cbbb87f2b352fb097792180b2~2..8d4d4fd3b60f200cbbb87f2b352fb097792180b2~3 :

diff --git a/useful_scripts/rg_replace.sh b/useful_scripts/rg_replace.sh
index 74bc5bb..0add69d 100755
--- a/useful_scripts/rg_replace.sh
+++ b/useful_scripts/rg_replace.sh
@@ -2,12 +2,11 @@

 # This file is part of eRCaGuy_dotfiles: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles

-# STATUS: functional and ready-to-use
-
+# WORK IN PROGRESS! <===========
 # This is a simple wrapper around RipGrep (`rg`) to allow in-place find-and-replace, since the
 # `rg --replace` option replaces only the stdout, NOT the contents of the file.
 # `man rg` under the `--replace` section states: "Neither this flag nor any other ripgrep
-# flag will modify your files." This wrapper overcomes that limitation.
+# flag will modify your files."

 # INSTALLATION INSTRUCTIONS:
 # 1. Install RipGrep: https://github.com/BurntSushi/ripgrep#installation

par rapport à l'échantillon de sortie de git diffc 8d4d4fd3b60f200cbbb87f2b352fb097792180b2~2..8d4d4fd3b60f200cbbb87f2b352fb097792180b2~3 . Remarquez que seuls - y + sont affichées, tandis que les lignes de contexte environnantes sont supprimées, et toutes les autres lignes telles que diff , index , --- , +++ et @@ sont partis aussi !

-# STATUS: functional and ready-to-use
-
+# WORK IN PROGRESS! <===========
-# flag will modify your files." This wrapper overcomes that limitation.
+# flag will modify your files."

git diffc signifie "git diff c hanges", c'est-à-dire : montrer uniquement les modifié lignes de code, rien d'autre. C'est moi qui l'ai écrit. Il ne fait pas partie du git normal.

Il supporte TOUTES les options et paramètres supportés par git diff puisqu'il ne s'agit que d'une enveloppe légère autour de l'application git diff .

Téléchargez-le ici : git-diffc.sh . Il fait partie de mon eRCaGuy_dotfiles repo.

Pour l'installer :

git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffc.sh" ~/bin/git-diffc

Maintenant, déconnectez-vous manuellement et reconnectez-vous, si c'est la première fois que vous créez ou utilisez l'outil de gestion de l'identité de l'utilisateur. ~/bin afin de faire en sorte que le programme par défaut d'Ubuntu ~/.profile pour ajouter ~/bin à votre PATH variable. Si le fait de se déconnecter et de se reconnecter ne fonctionne pas, ajoutez les quelques lignes de code suivantes à votre fichier ~/.profile puis déconnectez-vous d'Ubuntu et reconnectez-vous :

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

C'est ça !

Utilisation : même que git diff . Ex :

git diffc
git diffc -h
git diffc commit1 commit2
git diffc --no-color
# etc.

Remarques supplémentaires sur l'installation :

Voir aussi la section sur l'installation de mon autre réponse concernant git diffn que j'ai également écrit, ici . Sauf que, partout où vous voyez git-diffn dans ces instructions, utilisez git-diffc à la place. Cela inclut l'intérieur de la wget commande aussi. Téléchargement et installation git diffc est facile : il suffit de quelques commandes.

Mode d'emploi awk pour ne montrer que le + y - lignes, en tenant compte de toute couleur ou mise en forme du texte. git diff peut sortir :

Le code ci-dessous est ce qui compose le git diffc l'emballage.

Pas une seule des autres réponses ici (y compris mon autre réponse ) fera exactement ce que vous voulez, de manière 100% correcte. Cette réponse, cependant, le fera. Voici une réponse en une ligne que vous pouvez copier et coller dans votre terminal. J'ai juste fait plusieurs lignes pour plus de lisibilité - vous pouvez le copier-coller de la même façon, alors autant le rendre lisible ! Il s'appuie sur le awk le langage de programmation :

git diff --color=always "$@" | awk '
# 1. Match and then skip "--- a/" and "+++ b/" lines
/^(\033\[(([0-9]{1,2};?){1,10})m)?(--- a\/|\+\+\+ b\/)/ {
    next 
} 
# 2. Now print the remaining "+" and "-" lines ONLY! Note: doing step 1 above first was required or
# else those lines would have been matched by this matcher below too since they also begin with 
# the "+" and "-" symbols.
/^(\033\[(([0-9]{1,2};?){1,10})m)?[-+]/ {
    print $0 
}
' | less -RFX

Si vous souhaitez apprendre awk voici quelques ressources :

  1. gawk (GNU awk ) manuel : https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
  2. Étude git diffn et les commentaires qui y figurent : https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh
  3. Si vous voulez git diffn aussi, ce qui est git diff avec les numéros de ligne, voir ici : Git diff avec numéros de ligne (Git log avec numéros de ligne)
  4. Quelques exemples d'awk "hello world" et de tests syntaxiques : https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk

En bonus, j'ai aussi emballé ce qui précède pour l'utiliser comme git diffc ce qui signifie "git diff pour ne montrer QUE les 'c'hanges'". L'utilisation est identique a git diff ; utilisez simplement git diffc à la place ! Il prend en charge TOUTES les options. La couleur est activée par défaut. Pour la désactiver, utilisez simplement git diffc --no-color o git diffc --color=never . Voir man git diff pour les détails.

Puisque je viens de terminer git diffn (un outil pour montrer git diff avec des lignes et des nombres) la nuit dernière, en écrivant git diffc était insignifiante. Je me suis dit que je ferais mieux de le faire maintenant, pendant que les connaissances sont fraîches dans ma tête.

0voto

Gabriel Staples Points 1804

Voici une autre façon, plus simple, de ne trouver que les lignes qui ont été modifiées, et qui commencent donc par un simple + o - tout en conservant les couleurs :

git diff -U0 --color=always HEAD~ | grep --color=never -E $'^\e\[(32m\+|31m-)'
  1. El -U0 dit d'inclure 0 ligne de contexte autour des lignes modifiées - c'est-à-dire d'inclure seulement les lignes modifiées elles-mêmes. Voir man git diff .
  2. El -E pour grep lui permet de travailler avec des expressions régulières étendues
  3. El $'' La syntaxe permet apparemment la citation ANSI, qui interprète correctement le caractère ESC (escape, ou 0x1b). Voir aquí .
  4. Et voici la description de la regex à partir de https://www.regex101.com : enter image description here
  5. En gros, ^ correspond au début de la ligne, \e correspond au caractère Escape, qui est le début d'un code couleur dans le terminal, \[ correspond au caractère suivant dans le code couleur, qui est [ et ensuite le (this|that) La syntaxe correspond à "ceci" ou "cela", où "ceci" est 32m+ qui est une ligne verte +, et 31m- est une ligne rouge.
  6. Les couleurs sont comme ça : \e[32m est vert et \e[31m est rouge.
  7. + montre les lignes marquées par git diff comme ajouté, bien sûr, et - montre les lignes marquées par git diff comme supprimé.
  8. Notez que --color=never es requis dans la 2e grep afin de l'empêcher de mettre en évidence ses correspondances, ce qui aurait pour effet de fausser les codes de couleur provenant de l'expression git diff à gauche.
  9. El + doit également être échappé car \+ car sinon, le + est un caractère spécial d'expression régulière (regex) qui spécifie une ou plusieurs occurrences de l'élément précédent . Voir ici : https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .

Références :

  1. https://git-scm.com/docs/git-diff#_combined_diff_format
  2. Réponse de @user650654 : Git diff pour ne montrer que les lignes qui ont été modifiées
  3. Réponse de @wisbucky : Git diff pour ne montrer que les lignes qui ont été modifiées

En rapport :

  1. [ma propre réponse] Git diff avec numéros de ligne (Git log avec numéros de ligne)
  2. [réponse de quelqu'un d'autre] Git diff avec numéros de ligne (Git log avec numéros de ligne)
  3. git diff avec les numéros de ligne et un alignement/indentation correct du code
  4. git-filechange-search.sh - un script qui vous permet de rechercher dans un fichier le nom d'une variable ou d'une fonction et de déterminer quel est le nom de cette variable ou fonction. commet contiennent des modifications avec ce nom de variable ou de fonction. Ex. utilisation : ./git-filechange-search.sh path/to/my/file.cpp variable_name trouvera tous les commet avec des changements à file.cpp qui contiennent variable_name en eux. C'est utile pour voir où et quand certaines caractéristiques ont été modifiées. C'est comme s'il s'agissait d'une recherche permettant d'observer les sections d'un fichier affichées par l'intermédiaire de git blame au fil du temps.

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