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.
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
.
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.
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.
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.
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.
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
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.
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
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.
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:
Définissez vimdiff en tant que difftool de git:
git config --global diff.tool vimdiff
Configurer ~/.vimrc
pour afficher automatiquement les numéros de ligne lors de l’utilisation de vimdiff:
if &diff
set number
endif
Exécutez git difftool, qui utilisera vimdiff avec les numéros de ligne:
git difftool
Vous pouvez toujours utiliser le chat. L'inconvénient est que vous allez perdre les couleurs.
Exemple:
git diff yourfile.cpp | cat -n