2017-01-13 2 views
0

Imaginez que vous examiniez les modifications de code. On a déplacé une fonction d'un fichier à l'autre. Le commit montre deux fichiers, un avec un bloc supprimé et un autre avec un bloc ajouté.Git: détecter les modifications effectuées pendant le déplacement du bloc (diff le bloc supprimé et le bloc ajouté)

Comment puis-je, avec Git, faire un diff des deux blocs pour voir les changements effectués dans ce bloc de code?

Exemple simplifié, diff minimal:

+++ a/modules/foo.js 
--- b/modules/foo.js 
@@ -314,15 +314,12 


-function foo() { 
- returns 42; 
-} 


+++ a/modules/bar.js 
--- b/modules/bar.js 
@@ -271,82 +271,85 


+function foo() { 
+ returns 43; 
+} 

Il y a un léger changement. Je voudrais comparer les deux blocs les uns contre les autres pour voir ceci:

function foo() { 
- returns 42; 
+ returns 43; 
} 

Je ne veux pas détecter si elle a déménagé mais je veux voir la différence dans le bloc déplacé (que vous déjà reconnu comme mouvement).

Actuellement, je découpe les blocs de code intéressants dans les anciens et nouveaux fichiers, les stocke dans des fichiers temporaires et les compare manuellement, mais je voudrais le faire avec un outil à la place. Jusqu'à présent, je créerais mon propre programme ou script pour le faire automatiquement, mais je me demande si cela est déjà possible avec Git.

Répondre

0

Cette réponse n'aborde pas complètement votre production/flux de production attendu, mais elle répondra à l'exigence de suivre les modifications effectuées en même temps que les mouvements. Il utilise la détection de copie (-C) dans git blame. Contrairement à -M, ce commutateur détecte les copies avec de légères modifications.

Prenez cette histoire:

9f3c95c Moved isApplicable() from Foo => Bar 
cff47ee Added bar.js 
e0efec3 Added foo.js 

isApplicable() déplacé, il produit ce blâme (uniquement lignes pertinentes indiquées):

$ git blame -C 9f3c95c3 -- bar.js 
cff47ee4 bar.js (John Doe 2017-01-13 20:28:51 +0100 36)   }, 
cff47ee4 bar.js (John Doe 2017-01-13 20:28:51 +0100 37) 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 38)   isApplicable: function(){ 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 39)     if (!this._depends) { 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 40)       // no depends expression defined, default to "yes, it's applicable" 
9f3c95c3 bar.js (John Doe 2017-01-13 20:26:47 +0100 41)       return false; 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 42)     } 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 43) 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 44)     // pass the survey model and the expression 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 45)     return Evaluator.evaluate(this.model.toJSON(), this._depends); 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 46)   }, 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 47) 
cff47ee4 bar.js (John Doe 2017-01-13 20:28:51 +0100 48)   render: function(){ 

Le mouvement commit est montré dans la ligne 41 depuis un return true; changé return false; ainsi que le déménagement. Les autres lignes liées à isApplicable() sont étiquetées avec le commit e0efec3b, qui est celui qui les a initialement introduites (la colonne filename désigne aussi le nom de fichier d'origine).

Un pur blame, d'autre part, ressemblerait à ceci (uniquement les lignes pertinentes indiquées):

$ git blame 9f3c95c3 -- bar.js 
cff47ee4 (John Doe 2017-01-13 20:28:51 +0100 36)   }, 
cff47ee4 (John Doe 2017-01-13 20:28:51 +0100 37) 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 38)   isApplicable: function(){ 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 39)     if (!this._depends) { 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 40)       // no depends expression defined, default to "yes, it's applicable" 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 41)       return false; 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 42)     } 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 43) 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 44)     // pass the survey model and the expression 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 45)     return Evaluator.evaluate(this.model.toJSON(), this._depends); 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 46)   }, 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 47) 
cff47ee4 (John Doe 2017-01-13 20:28:51 +0100 48)   render: function(){ 

Le mouvement commit apparaît comme un bloc depuis Git considère comme un ajout fait à 9f3c95c3.

git blame -C <REV> -- <FILE> fonctionne également pour les mouvements dans un seul fichier.

Le commutateur -C peut être spécifié plusieurs fois pour étendre le suivi à tous les fichiers de ce commit ou à tous les validés trouvés.La page de manuel dit:

-C|<num>|
En plus de -m, détectez les lignes déplacés ou copiés à partir d'autres fichiers qui ont été modifiés dans le même engagement. Ceci est utile lorsque vous réorganisez votre programme et déplacez le code à travers les fichiers. Lorsque cette option est donnée deux fois, la commande recherche en outre des copies d'autres fichiers dans le commit qui crée le fichier. Lorsque cette option est donnée trois fois, la commande recherche en outre des copies d'autres fichiers dans n'importe quel commit.

(moi qui souligne.)