Question 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 cherche un comparer fonctionnalité comme celle dans Visual SourceSafe (VSS) ou Team Foundation Server (TFS). Est-ce possible dans Git?


881
2017-07-26 19:10


origine


Réponses:


Du git-diff manpage:

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

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

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

1171
2017-07-26 19:13



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

git diff <révision_1>:<fichier_1> <révision_2>:<file_2>


212
2017-07-27 12:18



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

git difftool revision_1:file_1 revision_2:file_2

Exemple: Comparaison d'un fichier de son dernier commit à son commit précédent sur la même branche: En supposant que si vous êtes dans votre dossier racine du 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 projet / .git / config. Installez le p4merge [Ceci est mon outil de comparaison 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\"

68
2018-01-03 11:45



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

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


36
2017-07-26 20:50



Vérifier $ git log, puis copiez l'ID SHA de 2 validations différentes, puis exécutez git diff commande avec ces identifiants, par exemple:

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

35
2018-04-19 00:14



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 peut ensuite être coupé N collé dans une session de fenêtre shell ou redirigé vers / 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 être accepté aux deux endroits (vous pouvez l'inclure dans une fonction shell pour fournir le même fichier aux deux endroits) ou le placer dans un répertoire bin comme 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
2017-07-11 22:24



Si vous avez plusieurs fichiers ou répertoires et que vous voulez comparer des commits non continus, vous pouvez le faire:

Faire une branche temporelle

git checkout -b revision

Rembobiner vers la première cible de validation

git reset --hard <commit_target>

Cerise choisissant ceux qui sont intéressés

git cherry-pick <commit_interested> ...

Appliquer diff

git diff <commit-target>^

Quand tu as fini

git branch -D revision

12
2017-08-25 14:08



Si vous voulez faire un diff avec plus d'un fichier, avec la méthode spécifiée par @mipadi:

Par exemple. diff entre HEAD et ton master, pour tout trouver .coffee des dossiers:

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

Cela recherchera récursivement votre your_search_folder/ pour tous .coffee fichiers et faire un diff entre eux et leur master versions.


11
2017-11-30 15:04



Juste une autre façon d'utiliser awesomeness git ...

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

8
2017-08-02 20:13