Pregunta ¿Cómo diferencio el mismo archivo entre dos commits diferentes en la misma rama?


En Git, ¿cómo podría comparar el mismo archivo entre dos commits diferentes (no contiguos) en la misma rama (master, por ejemplo)?

Estoy buscando un comparar característica como la de Visual SourceSafe (VSS) o Team Foundation Server (TFS). ¿Es posible en Git?


881
2017-07-26 19:10


origen


Respuestas:


Desde el git-diff página de manual:

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

Por ejemplo, para ver la diferencia de un archivo "main.c" entre ahora y dos confirmaciones, aquí hay tres comandos equivalentes:

$ 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



También puede comparar dos archivos diferentes en dos revisiones diferentes, como esta:

git diff <revision_1>:<file_1> <revision_2>:<archivo_2>


212
2017-07-27 12:18



Si ha configurado el "difftool", puede usar

git difftool revision_1:file_1 revision_2:file_2

Ejemplo: Comparando un archivo de su último compromiso con su confirmación anterior en la misma rama: Suponiendo que si estás en la carpeta raíz de tu proyecto

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

Debería tener las siguientes entradas en su ~ / .gitconfig o en el archivo project / .git / config. Instala el p4merge [Esta es mi herramienta preferida de diff y merge]

[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 desea ver todos los cambios en el archivo entre las dos confirmaciones en una base de compromiso por compromiso, también puede hacer

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


36
2017-07-26 20:50



Comprobar $ git log, luego copie SHA id de 2 commits diferentes y luego ejecute git diff comando con esos identificadores, por ejemplo:

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

35
2018-04-19 00:14



Aquí hay una secuencia de comandos de Perl que imprime los comandos de git diff para un archivo dado como se encuentra en un comando de registro de git.

p.ej.

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

Rendimientos:

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

que luego podría cortarse N pegado en una sesión de ventana de shell o transferirse a / bin / sh.

Notas:

  1. el número (3 en este caso) especifica cuántas líneas imprimir
  2. el archivo (pom.xml en este caso) debe estar de acuerdo en ambos lugares (puede envolverlo en una función de shell para proporcionar el mismo archivo en ambos lugares) o ponerlo en un directorio bin como un script de shell

Código:

# 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 tiene varios archivos o directorios y desea comparar compromisos no continuos, puede hacer esto:

Hacer una rama temporal

git checkout -b revision

Rebobinar al primer objetivo de compromiso

git reset --hard <commit_target>

Cherry escogiendo a los comprometidos interesados

git cherry-pick <commit_interested> ...

Aplicar diff

git diff <commit-target>^

Cuando terminaste

git branch -D revision

12
2017-08-25 14:08



Si desea hacer una diferencia con más de un archivo, con el método especificado por @mipadi:

P.ej. diferencia entre HEAD y tu master, para encontrar todo .coffee archivos:

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

Esto buscará recursivamente su your_search_folder/ para todos .coffee archivos y hacer una diferencia entre ellos y su master versiones.


11
2017-11-30 15:04