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?
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
_
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>
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\"
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)
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
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:
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;
}
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
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
.
Juste une autre façon d'utiliser la génialité de git ...
git difftool HEAD HEAD@{N} /PATH/FILE.ext
Si vous voulez une comparaison visuelle simple sur Windows telle que celle que vous pouvez obtenir dans VSS ou TFS, essayez ceci:
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.