Quand je fais un git diff, il montre les lignes qui ont été ajoutées:
+ this line is added
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
Cela donne au diff réel git ressemblant à ceci:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Puis-je demander à git de n'afficher que les lignes qui ont été modifiées et d'ignorer tout autre code qui n'a pas été modifié? J'ai écrit une méthode qui supprimera toutes les lignes qui n'ont pas de signe «+» ou «-» devant elles, mais je suis sûr qu'il doit y avoir un moyen plus simple de le faire.
Dans mon git diff, je ne suis intéressé que par les lignes qui ont été modifiées.
Merci d'avance.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
pour l'avoir réglé globalementUn autre hack (sur un * x) pour afficher uniquement les lignes commençant par
+
et-
:Le code ci-dessus effectue les opérations suivantes:
git diff -U0
: choisissez 0 ligne de contexte+
ou-
--- a/
ou+++ b/
Couleur
Pour afficher des différences colorées, essayez ce qui suit:
^\e\[[^m]*m[-+]
,, recherche le début de la ligne (^
), puis le caractère d'échappement (\e
) suivi par[
lequel ensemble commence la séquence d'échappement, puis tout caractère qui n'est pas un "m" (nombres, points-virgules ou rien), suivi d'un " m "qui termine la séquence d'échappement.\e[0m
(réinitialiser),\e[m
(également réinitialiser),\e[1m
(gras activé),\e[31m
(rouge),\e[32m
(vert),\e[9;31m
(barré + rouge),\e[31;9m
(rouge + barré),\e[1;4;9;31m
(gras + souligné + barré + rouge). Les couleurs git par défaut utilisent le rouge et le vert, mais elles peuvent être reconfigurées.--color
est le même que--color=always
.--- a/
ou+++ b/
à apparaître au début de la ligne a été supprimée pour tenir compte des séquences d'échappement et cela pourrait conduire à un cas de bord.Notes complémentaires:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
, etc.grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, mais je trouve la version double grep plus facile à comprendre.la source
git diff
lignes de type "en-tête" qui commencent par@@
, mais que sont lesgit diff
lignes qui commencent par---
ou+++
? Je n'étais pas au courant de ceux-là.+++
) ou des suppressions (---
). Je vois cela ici maintenant: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
semble désigner le "fichier à gauche", ou le fichier tel qu'il était avant, et+++ b/filename
semble désigner le "fichier à droite", ou le fichier tel qu'il est maintenant avec vos modifications. Je suis tellement habitué à utilisergit difftool
avec meld , qui montre de belles comparaisons côte à côte, que je ne me suis jamais vraiment habitué à regardergit diff
, donc cela me semble toujours étrange, et je n'ai jamais vraiment regardé ces nuances auparavant.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 également filtrer celles qui commencent par---|+++
. Si vous stockez des fichiers de correctifs dans votre dépôt (je le fais, dans Pydoop ), par contre, vous voulez garder les lignes commençant par--|++
, donc l'expression rationnelle devient un peu impliquée:L'expression régulière utilise une anticipation négative: voir 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:
la source
-P
ou--perl-regexp
est utilisé pour interpréter le modèle comme une expression régulière Perl, mais n'est pas toujours implémenté. Cela n'a pas fonctionné pour moi sur OSX. gnu.org/software/grep/manual/grep.html#grep-ProgramsJe pense que pour les cas simples, l'expression régulière peut être beaucoup plus courte et plus facile à retenir, avec la mise en garde que cela ne fonctionnera pas si vous avez des changements de ligne où la ligne elle-même commence par
+
ou-
L'expression régulière dit que la ligne doit commencer par
+
ou-
, et le caractère immédiatement suivant ne doit être ni l'un ni l'autre. J'ai eu les mêmes résultats que je me sois échappé+
ou pas ici, au fait ...Exemple:
Dites que je change
C
enX
,E
enY
etG
enZ
.Comme je l'ai dit ci-dessus, cependant, c'est juste pour la plupart des cas. Si vous dirigez cette sortie vers un fichier
dout
, puis essayez la même expression régulière, cela ne fonctionnera pas.Quoi qu'il en soit, j'espère que cela vous aidera dans votre cas
la source
- name: No pdb
dans un fichier yaml.Cette réponse conservera les couleurs rouges / vertes d'origine pour plus de lisibilité. J'ai fourni quelques variations de syntaxe:
Explication:
git diff --color
est nécessaire pour empêcher git de désactiver la couleur lors de la mise en réseau.grep --color=never
est d'empêcher grep de supprimer la couleur d'origine et de mettre en évidence la chaîne correspondante.\e[31m
) ou vert (\e[32m
).$'...'
(syntaxe des guillemets ANSI-C) ou la-P
(syntaxe perl) est à laissergrep
interpréter\e
ou\033
comme unESC
caractère.la source
$''
rôle m'a particulièrement aidé. stackoverflow.com/a/61929887/4561887Comment utiliser
awk
pour afficher uniquement les lignes+
et-
, en tenant compte de toute couleur ou de la mise en forme du textegit diff
:Pas une seule des autres réponses ici (y compris mon autre réponse ) ne fera exactement ce que vous voulez à 100% correctement. Cette réponse, cependant, le sera. Voici un 1-liner que vous pouvez copier et coller dans votre terminal.Je viens de le faire en plusieurs lignes pour plus de lisibilité - vous pouvez le copier-coller de la même manière, donc je ferais aussi bien de le rendre lisible! Il repose sur le
awk
langage de programmation:Voici ses caractéristiques. Toutes ces fonctionnalités, prises ensemble, résolvent les lacunes de toutes les autres réponses ici:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
paramètres . C'est pourquoi le regex ci-dessus a;?
et{1,10}
: s'il détecte le début d'un code de formatage de couleur ou de texte, il correspondra à jusqu'à 10 séquences de ces codes ANSI combinés.Il n'inclut PAS également les lignes commençant par
@@
et le motdiff
, comme le fait la réponse acceptée . Si vous voulez ces lignes (qui, franchement, je pense qu'elles sont utiles :)), faites ceci à la place:ou
Il affiche la sortie de la même manière exacte que le
git diff
ferait: dans leless
pager avec sortie couleur optionnelle (-R
), et seulement si le texte est> 1 page (-F
), et tout en conservant la page de texte actuelle à l'écran lorsque vousq
uit (-X
) .Il a également l'avantage d'être puissant et facilement configurable car il utilise le langage de programmation awk.
Si vous souhaitez apprendre awk , voici quelques ressources:
gawk
(GNUawk
) manuel: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
et commentaires y afférents : https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
aussi, qui estgit diff
avec les numéros de ligne, voir ici: Git diff avec les numéros de ligne (Git log avec les numéros de ligne)En prime, j'ai également résumé ce qui précède pour être utilisé comme
git diffc
, ce qui signifie "git diff pour afficher UNIQUEMENT les 'c'hanges". L'utilisation est identique àgit diff
; utilisez simplement à lagit diffc
place! Il prend en charge TOUTES les options. La couleur est activée par défaut. Pour le désactiver, utilisez simplementgit diffc --no-color
ougit diffc --color=never
. Voirman git diff
pour plus de détails.Depuis que je viens de terminer
git diffn
(un outil à affichergit diff
avec des numéros de lignes) hier soir, l'écrituregit diffc
était triviale. J'ai pensé que je ferais mieux de le faire maintenant pendant que les connaissances sont fraîches dans ma tête.Installer
git diffc
:Suivez les instructions à la fin de cette réponse ici , sauf partout où vous voyez
git-diffn
dans les instructions, utilisezgit-diffc
plutôt. Cela inclut aussi dans lawget
commande. Le téléchargement et l'installationgit diffc
sont faciles: il ne s'agit que de quelques commandes.la source
Voici un autre moyen plus simple de rechercher uniquement les lignes qui ont été modifiées, et donc de commencer par un seul
+
ou-
, tout en conservant la sortie couleur:-U0
dit d'inclure 0 lignes de contexte autour des lignes modifiées - c'est-à-dire: inclure uniquement les lignes modifiées elles-mêmes. Voirman git diff
.-E
for grep lui permet de travailler avec des expressions régulières étendues$''
syntaxe autorise apparemment les guillemets ANSI, qui interprètent correctement le caractère ESC (escape ou 0x1b). Regardez ici .^
correspond au début de la ligne,\e
correspond au caractère d'échappement, qui est le début d'un code de couleur dans le terminal,\[
correspond au caractère suivant dans le code de couleur, qui est[
, puis la(this|that)
syntaxe correspond à "ceci" ou "cela" , où "this" est32m+
, qui est une ligne + verte, et31m-
est une ligne rouge.\e[32m
est vert et\e[31m
est rouge.+
affiche les lignes marquées pargit diff
comme ajoutées, bien sûr, et-
affiche les lignes marquées pargit diff
comme supprimées.--color=never
est obligatoire dans la 2èmegrep
expression afin de l'empêcher de mettre en évidence ses correspondances, ce qui sinon bousillerait les codes de couleur venant degit diff
la gauche.+
doit également être échappé\+
car sinon, il+
s'agit d'un caractère d'expression régulière (regex) spécial 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:
En relation:
git-filechange-search.sh
- un script qui vous permet de rechercher dans un fichier un nom de variable ou de fonction et de déterminer quels commits 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 commits avec les modifications apportées à file.cpp qui les contiennentvariable_name
. Ceci est utile pour voir où et quand certaines fonctionnalités ont été modifiées. C'est comme s'il s'agissait d'une recherche permettant d'observer des sections d'un fichier affichées via augit blame
fil du temps.la source