web-dev-qa-db-fra.com

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 (maître par exemple)?

Je recherche une fonction compare comme celle de Visual SourceSafe = (VSS) ou Team Foundation Server (TFS). Est-ce possible dans Git?

1040
systempuntoout

Depuis la page de manuel git-diff :

_git diff [--options] <commit> <commit> [--] [<path>...]
_

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

_$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
_
1367
mipadi

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>

256
Jakub Narębski

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

git difftool revision_1:file_1 revision_2:file_2

Exemple: comparer un fichier de sa dernière validation à sa précédente sur la même branche: à supposer que si vous vous trouvez 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 fichier ~/.gitconfig ou dans le fichier project/.git/config. Installer le p4merge [Ceci 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\"
80
Anver Sadhat

Vérifiez $ git log, puis copiez SHA id de 2 validations différentes, puis exécutez la commande git diff avec ces identifiants, par exemple:

$ git diff (sha-id-one) (sha-id-two)
43
Vibhuti

Si vous souhaitez voir toutes les modifications apportées au fichier entre les deux validations, validation par validation, vous pouvez également le faire.

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

39
cxreg

Voici un script Perl qui imprime les commandes git diff pour un fichier donné, comme dans une commande git log.

par exemple.

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

Rendements:

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é N collé dans une session de fenêtre Shell ou transmis à/bin/sh.

Remarques:

  1. le nombre (3 dans ce cas) spécifie le nombre de lignes à imprimer
  2. le fichier (pom.xml dans ce cas) doit correspondre aux deux emplacements (vous pouvez l'envelopper dans une fonction Shell pour fournir le même fichier aux deux endroits) ou le placer dans un répertoire bin en tant que 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;
}
21
user2520657

Si vous avez plusieurs fichiers ou répertoires et que vous souhaitez comparer des validations non continues, vous pouvez procéder comme suit:

Faire une branche temporelle

git checkout -b revision

Revenir à la première cible de validation

git reset --hard <commit_target>

Cherry picking sur les commets intéressés

git cherry-pick <commit_interested> ...

Appliquer diff

git diff <commit-target>^

Quand tu as fait

git branch -D revision
13
dvdvck

Si vous voulez créer un diff avec plusieurs fichiers, avec la méthode spécifiée par @mipadi:

Par exemple. diff entre HEAD et votre master, pour trouver tous les fichiers .coffee:

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

Ceci recherchera récursivement votre your_search_folder/ pour tous les fichiers .coffee et fera un diff entre eux et leurs versions master.

11

Juste une autre façon d'utiliser la génialité de git ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext
8
Eddie B

Si vous voulez une comparaison visuelle simple sur Windows telle que celle que vous pouvez obtenir dans VSS ou TFS, essayez ceci:

  • clic droit sur le fichier dans l'explorateur de fichiers
  • sélectionnez 'Histoire Git'

Remarque: après la mise à niveau vers Windows 10, j'ai perdu les options du menu contextuel de git. Cependant, vous pouvez obtenir le même résultat en utilisant "gitk" ou "nom de fichier gitk" dans une fenêtre de commande.

Une fois que vous avez appelé "Historique Git", l'outil graphique Git démarre, avec un historique du fichier dans le volet supérieur gauche. Sélectionnez l'une des versions que vous souhaitez comparer. Puis faites un clic droit sur la deuxième version et choisissez soit

Diff this -> sélectionné

ou

Diff sélectionné -> this

Les différences de couleur apparaissent dans le volet inférieur gauche.

1
Resource