1359 votes

Comment différencier le même fichier entre deux commits différents sur la même branche ?

Dans Git, comment pourrais-je comparer le même fichier entre deux commits différents (non contigus) sur la même branche (master par exemple) ?

Je suis à la recherche d'un comparer comme celle de l Visual SourceSafe (VSS) ou Team Foundation Server (TFS).
Est-ce possible dans Git ?

3 votes

Si vous devez le faire dans GitHub - Vérifiez ceci

1722voto

mipadi Points 135410

De la git-diff page de manuel :

git diff [--options] <commit> <commit> [--] [<path>...]

Par exemple, pour voir la différence pour un fichier "main.c" entre maintenant et deux commits en arrière, voici trois commandes équivalentes :

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

48 votes

El .. n'est pas vraiment nécessaire, bien qu'il fonctionne avec (sauf dans les versions assez anciennes, peut-être). Vous pouvez également utiliser git log o gitk pour trouver les SHA1s à utiliser, si les deux commits sont très éloignés. gitk a également un "diff selected -> this" et "diff this -> selected" dans son menu contextuel.

21 votes

Cela fonctionnera-t-il même si le nom du fichier a été modifié entre les 2 commits ?

32 votes

Alors quel est le but du "--"

349voto

Jakub Narębski Points 87537

Vous pouvez également comparer deux fichiers différents dans deux révisions différentes, comme ceci :

git diff <_revision_1_>:<_file_1_> <_revision_2_>:<_file_2_>

28 votes

Notez qu'il semble que si <file_1> y <file_2> sont dans le répertoire courant, et non dans le répertoire de premier niveau géré par git, on doit ajouter en préambule ./ sur Unix : <revision_1>:./filename_1

7 votes

<revision> : peut être omis, ainsi vous pouvez diff avec un fichier qui n'a pas encore été committé.

2 votes

Notez que sous Windows, il faut utiliser '/' pour les chemins de fichiers, et non '\'.

102voto

Anver Sadhat Points 805

Si vous avez configuré le "difftool", vous pouvez utiliser

git difftool revision_1:file_1 revision_2:file_2

Exemple : Comparer un fichier de son dernier commit à son précédent commit sur la même branche : En supposant que si vous êtes dans le dossier racine de votre projet

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

Vous devriez avoir les entrées suivantes dans votre ~/.gitconfig ou dans le fichier project/.git/config. Installez p4merge [C'est mon outil de diff et de fusion préféré].

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

43voto

cxreg Points 4067

Si vous voulez voir toutes les modifications apportées au fichier entre les deux commits sur une base commit par commit, vous pouvez également faire

git log -u $start_commit..$end_commit -- path/to/file

0 votes

Que signifient "$start_commit" et "$end_commit" ? Sont-ils littéraux ou, dans le cas contraire, pouvez-vous fournir un exemple ?

1 votes

Ce sont des variables shell qui contiennent la révision de début et de fin, qui peuvent être des littéraux sha1 ou des refs.

22voto

user2520657 Points 61

Voici un script Perl qui imprime les commandes Git diff pour un fichier donné tel que trouvé dans une commande Git log.

Par exemple

git log pom.xml | perl gldiff.pl 3 pom.xml

Rendement :

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

qui pourrait ensuite être coupé et collé dans une session de fenêtre shell ou envoyé par pipeline à l'adresse suivante /bin/sh .

Notes :

  1. le nombre (3 dans ce cas) indique le nombre de lignes à imprimer
  2. le fichier (pom.xml dans ce cas) doit correspondre aux deux endroits (vous pourriez l'envelopper dans une fonction shell pour fournir le même fichier aux deux endroits) ou le mettre dans un répertoire binaire comme un script shell

Code :

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X