884 votes

Comment calculer le nombre de lignes modifiées entre deux commits dans Git ?

Existe-t-il un moyen simple de calculer le nombre de lignes modifiées entre deux commits dans Git ?

Je sais que je peux faire un git diff et compter les lignes, mais cela semble fastidieux. J'aimerais également savoir comment je peux faire cela, en incluant uniquement mes propres commits dans le décompte des lignes.

1304voto

Jefromi Points 127932

Vous voulez le --stat option de git diff ou si vous cherchez à l'analyser dans un script, la fonction --numstat option.

git diff --stat <commit-ish> <commit-ish>

--stat produit la sortie lisible par l'homme que vous avez l'habitude de voir après les fusions ; --numstat produit un joli tableau que les scripts peuvent facilement interpréter.

Je n'ai pas vu que vous cherchiez à faire cela sur plusieurs commits en même temps - c'est une tâche à confier à git log . Ron DeVera en parle, mais vous pouvez en fait faire beaucoup plus que ce qu'il mentionne. Depuis git log appelle en interne la machine diff afin d'imprimer les informations demandées, vous pouvez lui donner n'importe laquelle des options de la stat diff - pas seulement --shortstat . Ce que vous voulez probablement utiliser est :

git log --author="Your name" --stat <commit1>..<commit2>

mais vous pouvez utiliser --numstat o --shortstat également. git log peut également sélectionner des commits de diverses autres façons - jetez un coup d'œil à la section documentation . Vous pourriez être intéressé par des choses comme --since (plutôt que de spécifier des plages de commits, il suffit de sélectionner les commits depuis la semaine dernière) et --no-merges (les commits de fusion n'introduisent pas réellement de changements), ainsi que les jolies options de sortie ( --pretty=oneline, short, medium, full... ).

Voici une ligne simple pour obtenir les changements totaux au lieu des changements par commit à partir du journal git (changez les options de sélection des commits comme vous le souhaitez - ce sont les commits par vous, de commit1 à commit2) :

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(vous devez laisser git log imprimer des informations d'identification sur le commit ; j'ai choisi arbitrairement le hash, puis j'ai utilisé awk pour ne retenir que les lignes avec trois champs, qui sont celles avec les informations stat)

4 votes

Cela ne répond pas à la question initiale sur les "lignes modifiées". Un changement de ligne est calculé à la fois comme une ligne insérée et une ligne supprimée. Le calcul du nombre de lignes modifiées nécessite plus de travail que celui décrit ici.

13 votes

@VilleLaitila : C'est le plus proche que vous pouvez obtenir sans une quantité absurde d'effort, et c'était assez bon pour le PO et 15 autres. (Comment définir quand une ligne modifiée devient une ligne ajoutée et une ligne supprimée ? Par la distance d'édition entre la ligne - et la ligne +, en tant que fraction de la longueur de la ligne) ? Nous savons tous que les changements sont doublés ; nous pouvons simplement appeler cela une mesure utile de la quantité de changement, et continuer nos vies.

239 votes

git diff --shortstat <commit1> <commit2> était celui que je voulais.

286voto

orkoden Points 2262
git diff --shortstat

vous donne juste le nombre de lignes modifiées et ajoutées. Cela ne fonctionne qu'avec les modifications non indexées. Pour comparer avec une branche :

git diff --shortstat some-branch

221voto

Thomas Points 518

Pour les paresseux, utilisez git log --stat .

50voto

Matthew Flaschen Points 131723
git diff --stat commit1 commit2

EDIT : Vous devez également spécifier les commits (sans paramètres, il compare le répertoire de travail avec l'index). Par exemple

git diff --stat HEAD^ HEAD

pour comparer le parent de HEAD con HEAD .

1 votes

Il n'y a jamais vraiment besoin d'utiliser diff-index - le diff peut tout gérer ; le cas de diff-index est couvert par le --cached/--staged je crois. (Et il n'y a aucun moyen d'utiliser diff-index pour comparer deux commits arbitraires comme le demande le PO).

0 votes

Le résultat n'est rien pour moi.

0 votes

@Mike : Avez-vous omis un carat ? Est-ce que ton commit le plus récent était un commit de fusion ? Si git dit qu'il n'y a pas de différence, c'est parce qu'il n'y a pas de différence.

19voto

Ron DeVera Points 9085

En supposant que vous voulez comparer tous vos commits entre abcd123 (le premier commit) et wxyz789 (le dernier commit), inclus :

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

Cela donne un résultat succinct comme :

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

0 votes

Le résultat n'est rien pour moi (j'ai fait des commits et vérifié que --author est correct en l'utilisant avec git log et sans autre argument).

0 votes

Cela m'est arrivé aussi. Les deux commits étaient dans le mauvais ordre, les intervertir a réglé le problème.

1 votes

Mise à jour de l'ordre de commit et clarification de ce que les deux SHAs représentent. Merci de l'avoir remarqué :)

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