Existe-t-il un moyen d'ajouter des lignes git show, des lignes modifiées et des lignes supprimées?

110

"git diff --stat" et "git log --stat" affichent la sortie comme:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

Mais ce qui s'est réellement passé dans ce commit, c'est que 4 lignes ont été modifiées et 26 lignes ont été supprimées, ce qui est différent de l'ajout de 4 lignes et de la suppression de 30.

Existe-t-il un moyen d'obtenir les LOC delta (26 dans ce cas)? Je ne me soucie pas vraiment de différencier les lignes ajoutées ou supprimées.

Juan Alonso
la source

Réponses:

127

Vous pouvez utiliser:

git diff --numstat

pour obtenir des informations numériques sur les différences.

En ce qui concerne la séparation de la modification d'une paire d'ajout et de suppression, cela --word-diffpeut aider. Vous pouvez essayer quelque chose comme ceci:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

C'est un peu long, vous voudrez peut-être l'analyser dans votre propre script à la place.

quornian
la source
2
Merci quornian mais numstat donne exactement les mêmes informations que stat, ajouts et suppressions.
Juan Alonso
J'ai mis à jour ma réponse pour inclure un exemple d'utilisation de --word-diff. Cela pourrait être plus utile.
quornian
14
La sortie de git diff --numstatest ventilée par fichier. Pour voir le total ajouté / supprimé pour le diff, vous pouvez le diriger vers awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
hughes
15
@hughes Une manière plus simple d'obtenir les mêmes informations serait git diff --shortstat. D'après mon expérience, cela équivaut à accumuler la sortie de git diff --numstat.
klaus triendl
1
Aussi FWIW pour voir les statistiques des changements par étapes, ajoutez simplement--cached
xlm
65
  1. Si vous voulez connaître les lignes ajoutées / modifiées / supprimées par un commit avec id commit-id, vous pouvez utiliser

    git show commit-id --stat
    

    ou

    git diff commit-id-before commit-id --stat
    
  2. Si vous voulez connaître les lignes ajoutées / modifiées / supprimées par une plage de commits, vous pouvez utiliser

    git diff commit-id1 commit-id2 --stat
    
  3. Si vous voulez connaître les lignes ajoutées / modifiées / supprimées par chaque commit, vous pouvez utiliser

    git log --stat
    
yhluo
la source
Cette solution ne répond pas à la question, "git --stat" compte une seule ligne modifiée comme "1 insertion et 1 suppression". La question demande comment obtenir "1 changé".
Juan Alonso
6

Si tous vos fichiers sont préparés pour la validation, pour voir la --numstatprocédure comme ceci:

git diff --numstat HEAD~
Falieson
la source
4

git utilise un diff "unifié", qui n'a que des lignes ajoutées et supprimées, comme format de diff. Vous devez faire quelque chose d'extérieur pour obtenir un diff qui affiche les informations d'ajout, de suppression et de modification.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git donne des liens vers un script qui permet d'exécuter de vieux "diff" réguliers - et à partir de cela, vous pouvez générer une sortie de diff "context" . Les différences de contexte affichent les lignes ajoutées, supprimées et modifiées, ce qui devrait vous permettre d'obtenir les données souhaitées.

Daniel Pittman
la source
3

Vous pouvez utiliser diffstatpour afficher le nombre de lignes modifiées. Par exemple:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

L' -Coption est d'obtenir une sortie colorisée; l' -moption est d'afficher le nombre de lignes modifiées. Exemple de sortie:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

Le décompte du nombre de lignes modifiées est approximatif, comme man diffstatdit:

-m fusionne les comptages d'insertion / suppression de chaque "morceau" du fichier patch pour approximer un nombre de lignes modifiées.

Une différence majeure entre git diff --statet diffstat: diffstatn'affiche pas les déplacements / renommages de fichiers (par exemple app/{a.rb => b.rb}).

Flux
la source