Comment puis-je calculer le nombre de lignes modifiées entre deux commits dans git?


748

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 aussi savoir comment je peux faire cela, y compris uniquement mes propres commits dans les linecounts.


3
Vous regardez BitBucket.
Alex78191

Réponses:


1114

Vous voulez l' --statoption git diff, ou si vous cherchez à analyser ceci dans un script, l' --numstatoption.

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; --numstatproduit une belle disposition de table que les scripts peuvent facilement interpréter.

J'ai en quelque sorte manqué que vous cherchiez à faire cela sur plusieurs commits en même temps - c'est une tâche pour git log. Ron DeVera en parle, mais vous pouvez en fait faire bien plus que ce qu'il mentionne. Dans git logla mesure où il appelle en interne la machine diff pour imprimer les informations demandées, vous pouvez lui donner n'importe laquelle des options de statistiques diff - pas seulement --shortstat. Ce que vous voudrez probablement utiliser, c'est:

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

mais vous pouvez également utiliser --numstatou --shortstat. git logpeut également sélectionner les validations de différentes manières - consultez la documentation . Vous pourriez être intéressé par des choses comme--since (plutôt que de spécifier des plages de validation, sélectionnez simplement les validations depuis la semaine dernière) et --no-merges(les validations de fusion n'introduisent pas de changements), ainsi que les jolies options de sortie ( --pretty=oneline, short, medium, full...).

Voici une ligne pour obtenir les modifications totales au lieu des modifications par validation du journal git (modifiez les options de sélection de validation comme vous le souhaitez - c'est la validation 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 la validation; j'ai choisi arbitrairement le hachage, puis utilisé awk pour ne sélectionner que les lignes avec trois champs, qui sont ceux avec les informations statistiques)


2
Cela ne répond pas à la question d'origine sur les "lignes modifiées". Un changement de ligne est calculé en tant que ligne insérée et supprimée. Le calcul du nombre de lignes modifiées nécessite plus de travail que celui décrit ici.
Ville Laitila

12
@VilleLaitila: C'est aussi proche que possible sans un effort absurde, et c'était assez bon pour l'OP et 15 autres. (Comment définissez-vous quand une ligne modifiée devient une ligne ajoutée et une ligne supprimée? En modifiant la distance entre la ligne - et +, 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 métrique utile de quantité de changement, et continuer notre vie.
Cascabel

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

9
Pour référence, le format de date --sinceet --untilest quelque chose comme: yesterday, 1 month 2 weeks 3 days 1 hour 1 second agoou1979-02-26 18:30:00
juanmirocks

4
@Bryson Oui, c'est pourquoi cette ligne dit <commit-ish>- cela fonctionne avec tout ce qui représente une validation, y compris les validations littérales, les branches, les balises et les références en général. Voir aussi stackoverflow.com/questions/23303549/…
Cascabel

193

Pour les paresseux, utilisez git log --stat.


14
J'ai trouvé cela utile, a ajouté un -10pour montrer les dix commits précédents.
Choylton B. Higginbottom

2
Lorsque vous avez terminé de consulter l'historique des validations, tapez Qpour revenir au terminal.
Stevoisiak

180
git diff --shortstat

vous donne juste le nombre de lignes modifiées et ajoutées. Cela ne fonctionne qu'avec des modifications non mises en scène. Pour comparer avec une branche:

git diff --shortstat some-branch

3
Cool! mais .. sachez que cela ne fonctionne qu'avec des modifications non
mises en scène

3
Si vous avez effectué des modifications avec git add, assurez-vous de le fairegit diff --shortstat --cached
TomNash

2463 fichiers modifiés, 39745 insertions (+), 21383 suppressions (-) J'ai en fait supprimé environ 5k à 10k le mois dernier. C'est presque tout ce que je fais, à part bouger les choses. Quelque chose ne va pas. Il n'inclut pas les fichiers supprimés ou quelque chose?
jgmjgm

46
git diff --stat commit1 commit2

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

git diff --stat HEAD^ HEAD

pour comparer le parent de HEADavec HEAD.


1
Il n'y a jamais vraiment besoin d'utiliser diff-index- le difffrontend peut tout gérer; le cas de diff-indexest couvert par le --cached/--staged, je crois. (Et il n'y a aucun moyen d'utiliser diff-indexpour comparer deux commits arbitraires comme l'OP l'a demandé.)
Cascabel

La sortie de ceci n'est rien pour moi.
Mike

@Mike: Avez-vous laissé un carat? Votre dernier commit était-il un commit de fusion? Si git dit qu'il n'y a pas de diff, c'est parce qu'il n'y a pas de diff.
Cascabel

6
ou si non engagégit diff --stat HEAD
wieczorek1990

1
En outre, vous pouvez comparer plus loin que le parent en utilisant HEAD~n, où nest la distance que vous souhaitez parcourir. git diff --stat HEAD~5 HEADaffichera les statistiques combinées pour les 5 derniers commits par rapport à HEAD.
Nathan Beck

18

En supposant que vous souhaitez comparer toutes vos validations entre abcd123 (le premier commit) et wxyz789 (le dernier commit), inclus:

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

Cela donne une sortie succincte comme:

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

La sortie de ceci n'est rien pour moi (j'ai fait des commits et vérifié - l'auteur est correct en l'utilisant avec git log et aucun autre argument).
Mike

Cela m'est arrivé aussi. Les deux commits étaient dans le mauvais ordre, les échanger les a corrigés.
bob esponja

1
Mise à jour de l'ordre de validation et clarification de ce que représentent les deux SHA. Merci de l'avoir attrapé :)
Ron DeVera

3
Le --shortstatdrapeau est génial, il fonctionne git diffbien (pas git log).
lucke84

Comment les résumer?
jusqu'au

13

Une autre façon d'obtenir tous les journaux des modifications dans une période de temps spécifiée

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

Production:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

Avec un long contenu de sortie, vous pouvez exporter vers un fichier pour plus de lisibilité

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

Bien que toutes les réponses ci-dessus soient correctes, celle ci-dessous est pratique à utiliser si vous avez besoin du nombre de dernières validations

ci-dessous est d'obtenir le décompte des 5 derniers commits

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

pour compter les 10 derniers commits

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

générique - changez N en comptant les derniers commits dont vous avez besoin

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

pour compter toutes les validations depuis le début

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


Cela donne "'tail' n'est pas reconnu comme une commande interne ou externe, un programme exploitable ou un fichier batch."
Charles Roddie


1

Je viens de résoudre ce problème par moi-même, donc je vais partager ce que j'ai trouvé. Voici le résultat final:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

La commande sous-jacente ressemble à ceci:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

Notez la $@dans la commande log pour transmettre vos arguments tels que --author="Brian"ou --since=yesterday.

Échapper à l'awk pour le mettre dans un alias git était compliqué, donc à la place, je l'ai mis dans un script exécutable sur mon chemin ( ~/bin/git-stat-sum), puis j'ai utilisé le script de l'alias dans mon .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

Et ça marche vraiment bien. Une dernière chose à noter est file changesle nombre de modifications apportées aux fichiers, et non le nombre de fichiers uniques modifiés. C'est ce que je cherchais, mais ce n'est peut-être pas ce que vous attendez.

Voici un autre exemple ou deux

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

Vraiment, vous devriez pouvoir remplacer n'importe quelle git logcommande par git summary.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.