web-dev-qa-db-fra.com

Comment puis-je calculer le nombre de lignes changé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 y parvenir, en n'incluant que mes propres commits dans les comptes linéaires.

583
Mike

Vous voulez l'option --stat de git diff ou, si vous souhaitez l'analyser dans un script, l'option --numstat.

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 une mise en page de table agréable que les scripts peuvent facilement interpréter.

J'ai loupé que vous cherchiez à le faire sur plusieurs commits en même temps - c'est une tâche pour git log. Ron DeVera en parle, mais vous pouvez en faire beaucoup plus que ce qu'il mentionne. Étant donné que git log appelle en interne le diff machine afin d'imprimer les informations demandées, vous pouvez lui attribuer l'une des options de diff stat - pas seulement --shortstat. Ce que vous voulez probablement utiliser est:

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

mais vous pouvez aussi utiliser --numstat ou --shortstat. git log peut également sélectionner les commits de différentes manières - jetez un œil à la documentation . Vous pourriez être intéressé par des éléments tels que --since (plutôt que de spécifier des plages de validation, il suffit de sélectionner les validations depuis la semaine dernière) et --no-merges (les validations de fusion n'introduisent pas réellement de modifications), ainsi que les jolies options de sortie (--pretty=oneline, short, medium, full...).

Voici un one-liner pour obtenir le total des modifications au lieu des modifications par validation à partir du journal git (modifiez les options de sélection de validation à votre guise - ceci est une validation de votre part, 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 afficher des informations d'identification sur le commit; j'ai arbitrairement choisi le hachage, puis utilisé awk pour ne sélectionner que les lignes avec trois champs, ceux qui contiennent les informations stat)

891
Cascabel

Pour les paresseux, utilisez git log --stat.

155
Thomas
git diff --shortstat

vous donne juste le nombre de lignes modifiées et ajoutées.

100
orkoden
git diff --stat commit1 commit2

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

git diff --stat HEAD^ HEAD

comparer le parent de HEAD avec HEAD.

38
Matthew Flaschen

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

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(-)
15
Ron DeVera

Un autre moyen d'obtenir tout le journal des modifications dans une période donnée

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

Sortie:

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 dans un fichier pour plus de lisibilité

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

git log --numstat ne vous donne que les chiffres

1
nibinbhaskar