2009-10-17 3 views
4

J'écris du code pour exécuter par programme des commandes git et apprendre git en même temps. Est-ce que je lis mal les pages man ou est ce que je veux faire n'est pas faisable?Qu'est-ce que la syntaxe "git" pour obtenir seulement le diff unifié de la façon dont un seul commit X a changé un seul fichier Y?

Ce qui suit va me dire comment changé MYFILE entre les deux commits:

git diff COMMIT1..COMMIT2 - MYFILE

Bon. Mais, disons que je veux juste demander comment COMMITX a changé le fichier, sans spécifier la validation préalable. Dans mon imagination la syntaxe serait quelque chose comme ceci:

git diff COMMITX -- MYFILE 

ou ceci:

git diff COMMITX^..COMMITX -- MYFILE 

Mais les commandes ci-dessus ne fonctionnent pas (pour moi). Ce qui suit fonctionne dans le sens où il me donne le diff unifié montrant comment COMMITX a changé MYFILE, mais il inclut aussi d'autres choses que je dois enlever - comme auteur, date, le checkin msg. Retirer les trucs supplémentaires est facile, mais j'ai l'impression que c'est quelque chose que je ne devrais pas avoir à faire. Est-ce que le commandement existe? Suis-je mal compris quelque chose de simple?

git show COMMITX -- MYFILE 

EDIT1: Je montre ici la sortie réelle de ma fenêtre "bash git". J'ai changé le "show" en "diff", et n'a obtenu aucune sortie.

 
$ git show 789e9 -- dir1/file3.txt 
commit 789e948bce733dab9605bf8eb51584e3b9a2eba3 
Author: corey 
Date: Sun Oct 11 21:54:14 2009 -0500 

    my msg 

diff --git a/dir1/file3.txt b/dir1/file3.txt 
index a351259..cf2bd35 100644 
--- a/dir1/file3.txt 
+++ b/dir1/file3.txt 
@@ -4,5 +4,7 @@ c 
ddd 
e 
f 
+a new line 
+another new line 
g 
h 

[email protected] /c/temp/mygit (master) 
$ git diff 789e9 -- dir1/file3.txt 

[email protected] /c/temp/mygit (master) 
+0

Je sais que vous avez déjà accepté une réponse, mais je veux être sûr que vous le savez - c'est totalement faisable avec 'git-diff'. Voir ci-dessous! – Cascabel

+2

"git diff COMMIT - FILE" compare la version de FILE dans COMMIT avec la version de FILE dans votre espace de travail ... ce qui n'est pas ce que vous vouliez. –

+0

@Jerromi - voir mon commentaire à votre réponse. Ne fonctionne pas pour moi. –

Répondre

5

Essayez:

git show --pretty=format: <commitid> -- <file> 

Voilà comment il ressemble:

diff --git a/config.y b/config.y 
index 7750514..f051b99 100644 
--- a/config.y 
+++ b/config.y 
@@ -454,8 +454,8 @@ definegame : TYPE_DEFINE_GAME '{' 
     } 
     game_definitions '}' 
     { 
-   num_games = ncnf; 
      ncnf++; 
+   num_games = ncnf; 
     } 
     ; 

Il y a encore une ligne blanche au début (non représenté ici en raison des limitations de démarques), mais patch sera heureusement ignorer cela (en effet, il va ignorer les choses en-tête dans la sortie par défaut git show aussi). Vous pouvez également passer par tail -n +2 pour laisser tomber cette ligne.

--pretty=oneline est également utile:

3ed347de4c6e0e3230f651f82aabf964c6d16100 Fix a bug where more than one defined game didn't show up or showed gibberish 
diff --git a/config.y b/config.y 
index 7750514..f051b99 100644 
--- a/config.y 
+++ b/config.y 
@@ -454,8 +454,8 @@ definegame : TYPE_DEFINE_GAME '{' 
     } 
     game_definitions '}' 
     { 
-   num_games = ncnf; 
      ncnf++; 
+   num_games = ncnf; 
     } 
     ; 

Cela dit, si vous formatez un patch pour la soumission quelque part, ne le font pas bande ce genre de choses. En fait, utilisez git format-patch et appréciez-le. Les outils de correctifs tierce ignoreront volontiers les métadonnées supplémentaires et, pour les projets utilisant git, git apply utilisera votre message de validation et votre ligne d'auteur, ce qui facilitera leur application.

+0

On dirait que ça fonctionne. J'ai pris votre réponse, je suis retourné à la page de manuel "git show", et dans mon état nouvellement éclairé j'ai essayé de voir si je pouvais "voir" la réponse à votre réponse dans la page en sachant exactement ce que je cherchais. Toujours difficile-> Le "format:" sans spécification de format du tout. Pour un crédit supplémentaire, quelle est la différence entre "l'auteur" et le "committer"? –

+0

J'ai trouvé une explication de la différence auteur/auteur ici: http://book.git-scm.com/1_the_git_object_model.html –

+0

C'est vraiment pas mal, à moins que vous n'essayiez vraiment de créer un patch pour la soumission. est peu probable si vous ne faites que différencier un seul fichier. 'git-diff' est conçu pour faire beaucoup de choses, y compris cette tâche. – Cascabel

5

git diff COMMIT^..COMMIT file ou git diff COMMIT^..COMMIT -- file deux fonctionnent parfaitement bien pour moi avec git 1.6.3.3. Mise à jour gracieuseté de Jakub Narębski: vous pouvez également écrire git diff COMMIT^! -- file.

$ git log --oneline b8ad655^! 
b8ad655 Bring in the "SimpleMenu" loader plugin 


$ git diff b8ad655^! lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm 
diff --git a/WWW-MenuGrinder/lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm b/WWW-MenuGrinder/lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm                               
new file mode 100644                           
index 0000000..14f6cd8                           
--- /dev/null                             
+++ b/WWW-MenuGrinder/lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm 
[...] 
+0

git diff montre les différences entre l'arbre de travail actuel et le commit, pas les changements de commit à son parent – bdonlan

+0

Vous avez raison, mon erreur. Corrigé ci-dessus. – hobbs

+0

Il serait vraiment mignon s'il y avait une extension pour permettre 'git diff^.. COMMIT' comme un analogue de' svn diff -c rev' bien que :) – hobbs

1

Vous ne devez pas utiliser une solution de contournement comme git-show - vous êtes légèrement en décalage sur votre syntaxe. git-diff montre la différence entre deux commits nommés. Le .., d'autre part, signifie "la gamme de commits entre ...". La syntaxe correcte est:

git diff COMMITX^ COMMIT -- MYFILE 

Cela dit, il ne fonctionne réellement pour moi avec le ... (J'ai testé git diff master^..master -- git-add--interactive.perl dans git.git) Cela n'a probablement pas toujours été le cas, mais cela a fonctionné au moins depuis que git est passé à l'index version 2 (entre v1.5.1 et v1.5.2) - ce serait pénible pour moi de tester avant cela.

+0

En fait "git diff A..B" fonctionne comme "git diff A B" depuis un certain temps, principalement pour qu'on puisse couper et coller la révision [portée] à dif, par exemple depuis la sortie git-fetch. –

+0

La documentation "git diff", http://www.kernel.org/pub/software/scm/git/docs/git-diff.html, indique que "COMMIT..COMMIT" est "synonyme de la forme précédente" " COMMIT COMMIT ". Ni travailler pour moi quand j'écris "COMMIT ^". Les deux fonctionnent de la même manière lorsque je spécifie le commit précédent directement. J'utilise msysgit sur windows, git version 1.6.4. –

+0

Intéressant - Je me demande si c'est un bug msysgit! – Cascabel

0

que je fais habituellement ceci:

git diff > unified.diff 

puis l'ouvrir dans mon lecteur diff unifié préféré.

Questions connexes