web-dev-qa-db-fra.com

Git diff avec numéros de ligne (journal Git avec numéros de ligne)

Quand je fais un git diff ou un git log -p, comment puis-je obtenir les numéros de ligne du ou des fichiers source alignés avec la sortie?

J'ai essayé de le chercher man git-diff | grep "line numbers" et j'ai essayé de googler mais je n'ai rien obtenu rapidement.

82
Drew LeSueur

Vous ne pouvez pas obtenir de numéros de ligne lisibles par l'homme avec git diff

Il n'y a actuellement aucune option permettant d'afficher les numéros de ligne verticalement sur le côté avec git diff.

Format unifié-diff

Cette information est disponible dans les en-têtes de morceaux (c) pour chaque changement dans le diff, elle est juste dans format unifié-diff :

@@ -start,count +start,count @@

L'état d'origine du fichier est représenté par -, et le nouvel état est représenté avec + (ils ne veulent pas dire d’ajouts ni de suppressions dans l’en-tête du bloc. start représente le numéro de la ligne de départ de chaque version du fichier et count représente le nombre de lignes incluses, à partir de le point de départ.

Exemple

diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
 [color "branch"]
        upstream = cyan
 [color "diff"]
-       meta = yellow
+       meta = cyan
        plain = white dim
        old = red bold
        new = green bold

L'en-tête du morceau

@@ -11,7 +11,7 @@

indique que la version précédente du fichier commence à la ligne 11 et comprend 7 lignes:

11  [color "branch"]
12         upstream = cyan
13  [color "diff"]
14 -       meta = yellow
14 +       meta = cyan
15         plain = white dim
16         old = red bold
17         new = green bold

alors que la prochaine version du fichier commence également à la ligne 11 et comprend également 7 lignes.

Le format unifié-diff n'est pas vraiment destiné à la consommation humaine

Comme vous pouvez probablement le constater, le format unified-diff ne permet pas de comprendre facilement les numéros de ligne (du moins si vous n'êtes pas une machine). Si vous voulez vraiment lire les numéros de ligne, vous devrez utiliser un outil de visualisation qui les affichera pour vous.

Lecture supplémentaire

78
user456814

Voici deux autres solutions, développant le code d'Andy Talkowski.

Texte brut:

  git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
   /^(---|\+\+\+|[^-+ ])/{print;next};\
   {line=substr($0,2)};\
   /^-/{print "-" left++ ":" line;next};\
   /^[+]/{print "+" right++ ":" line;next};\
   {print "(" left++ "," right++ "):"line}'

Texte en couleur, en supposant que \033[66m est le format des codes de couleur:

  git diff --color=always | \
    gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
      match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
      bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
      {line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
      bare~/^-/{print "-"left++ ":" line;next};\
      bare~/^[+]/{print "+"right++ ":" line;next};\
      {print "("left++","right++"):"line;next}'

Le code modifie les lignes commençant par - ou + à -1:- ou +1:+, et les lignes qui commencent par to (5,6):. Les numéros sont les numéros de ligne du fichier respectif.

18
PFudd

Voici un script qui tente de résoudre ce problème - pas testé contre la colère, mais il semble bien. Il se base sur les enregistrements que git diff produit et utilise awk pour maintenir le nombre de lignes.

# Massage the @@ counts so they are usable
function prep1() {
   cat | awk -F',' 'BEGIN { convert = 0; }
       /^@@ / { convert=1; }
       /^/  { if ( convert == 1 ) { print $1,$2,$3;
              } else { print $0;
              }
              convert=0;
             }'
}

# Extract all new changes added with the line count
function prep2() {
  cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
     /^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line;        }
     /^[-]/   { left++; display=left; inc=0; }
     /^[+]/   { line++; display=line; inc=0; }
     /^[-+][-+][-+] / { out=0; inc=0; }
     /^/    { 
               line += inc;
               left += inc;
               display += inc;
               if ( out == 1 ) {
                   print display,$0;
               } else {
                   print $0;
               }
               out = 1;
               inc = 1;
               display = line;
            }'
} 

git diff $1 | prep1 | prep2 
5
Andy Talkowski

Tu peux essayer

git blame

sur le fichier. Il vous indique le committer, l'id de commit et le numéro de ligne pour chaque ligne du fichier.

3
Juan

Un moyen rapide consiste à utiliser git diff -U0. Cela définira les lignes du contexte sur 0, ce qui fera que les valeurs @@ correspondent aux lignes modifiées. Par défaut, les valeurs @@ comprennent 3 lignes de contexte avant/après, ce qui n'est pas pratique pour les humains.

Exemple:

git diff # default
@@ -10,8 +10,8 @@

Il est difficile de calculer les numéros de ligne des lignes modifiées car la ligne 10 fait référence à la première ligne du contexte précédent. Le numéro de ligne actuel de la première ligne modifiée est 10 + 3 = 13. Pour calculer le nombre de lignes modifiées, vous devez également soustraire le contexte avant et après: 8-3-3 = 2.

git diff -U0
@@ -13,2 +13,2 @@

Comme vous pouvez le constater, la définition de context = 0 facilite la lecture des valeurs @@ par les utilisateurs. Vous pouvez voir que les lignes modifiées commencent à la ligne 13 et qu'il y a 2 lignes modifiées.

Ce n'est pas parfait, car il ne montre que le numéro de ligne pour chaque bloc. Si vous voulez voir les numéros de ligne pour chaque ligne, utilisez difftool pour un éditeur externe. Voir https://stackoverflow.com/a/50049752

1
wisbucky

J'aime utiliser git difftool avec meld comme outil de difftool. C'est plus facile à regarder que git diff, présente une comparaison graphique conviviale et affiche les numéros de ligne.

1
Gabriel Staples

Vous pouvez utiliser git difftool faire le diff avec un éditeur externe qui affichera les numéros de ligne. Voici comment faire avec vim/vimdiff:

  1. Définissez vimdiff en tant que difftool de git:

    git config --global diff.tool vimdiff
    
  2. Configurer ~/.vimrc pour afficher automatiquement les numéros de ligne lors de l’utilisation de vimdiff:

    if &diff
        set number
    endif
    
  3. Exécutez git difftool, qui utilisera vimdiff avec les numéros de ligne:

    git difftool
    
1
wisbucky

Vous pouvez toujours utiliser le chat. L'inconvénient est que vous allez perdre les couleurs.

Exemple:

git diff yourfile.cpp | cat -n 
0
george