2010-02-01 12 views
38

¿Cómo puedo ver qué confirmaciones son realmente que se enviarán a un repositorio remoto?Vista previa de un empuje de Git

Hasta donde yo sé, cada vez que retiro el maestro del repositorio remoto, es probable que se generen confirmaciones, incluso si están vacías.

Esto hace que el maestro local sea "reenviado" incluso si realmente no hay nada que empujar.

Ahora, si intento (de maestro):

git cherry origin master 

tengo una idea de lo que va a ser empujado, aunque esto también muestran algunas confirmaciones que ya he empujado. ¿Hay alguna manera de mostrar solo el nuevo contenido que se va a impulsar?

Respuesta

24

Recuerde origin/master es una referencia que apunta a la cabeza de la rama principal en la llamada remota origin en el último tirón, lo que podría utilizar un comando como

$ git log origin/master..master 

Usted podría utilizar git-preview-push a continuación que los comentarios en la salida del git push --dry-run --porcelain: uso

#! /usr/bin/env perl 

use warnings; 
use strict; 

die "Usage: $0 remote refspec\n" unless @ARGV == 2; 
my($origin,$refspec) = @ARGV; 
my @cmd = qw/ git push --dry-run --porcelain /; 
no warnings 'exec'; 
open my $fh, "-|" => @cmd, $origin, $refspec or die "$0: exec: $!"; 
# <flag> \t <from>:<to> \t <summary> (<reason>) 
my $update = qr/^ (.*)   \t # flag (optional) 
        (\S+):(\S+) \t # from:to 
        (.+)    # summary 
        (?:[ ] \((.+)\))? # reason 
       $/x; 

while (<$fh>) { 
    next unless my($flag,$from,$to,$summary,$reason) = /$update/; 
    if ($flag eq "!") { 
    print "$0: $refspec rejected:\n", $_; 
    } 
    elsif ($flag eq "=") { 
    print "$0: $refspec up-to-date\n"; 
    } 
    if ($summary =~ /^[0-9a-f]+\.\.[0-9a-f]+$/) { 
    system("git log --pretty=oneline $summary") == 0 
     or warn "$0: git log exited " . ($? >> 8); 
    } 
    elsif ($summary eq "[new branch]") { 
    print "$0: $refspec creates a new branch.\n"; 
    } 
} 

Ejemplo:

$ git preview-push /tmp/bare master 
To /tmp/bare 
270f8e6bec7af9b2509710eb1ae986a8e97068ec baz 
4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 bar
+1

+1, pero tendré que ponerme en mi tribuna sobre #!/Usr/bin/env perl, ya que me acabo de quemar por bugzilla usando #!/Usr/bin/perl cuando estaba instalando módulos en/usr/local/bin/perl y tuvo que hacer temporalmente/usr/bin/perl un enlace simbólico a/usr/local/bin/perl –

+5

+1 'git log origin/master..master' es suficiente en la mayoría de los casos. –

+0

@William ¡Solucionado! –

0

Si se le cae esto en su perfil Bash podrás ejecutar sonrisa (Git entrante a distancia) y la lechada (Git saliente a distancia) para ver las diferenciaciones de confirmaciones que son de entrada y salida para el amo origen:

function parse_git_branch { 
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' 
} 

function gd2 { 
    echo branch \($1\) has these commits and \($2\) does not 
    git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local 
} 

function grin { 
    git fetch origin master 
    gd2 FETCH_HEAD $(parse_git_branch) 
} 

function grout { 
    git fetch origin master 
    gd2 $(parse_git_branch) FETCH_HEAD 
} 
5

Escribí una herramienta para hacer esto llamada git wtf: https://github.com/michaelklishin/git-wtf. Colores y todo!

Como beneficio adicional, también le mostrará la relación entre una rama de características y una rama de integración.

2

He añadido los siguientes alias a mi ~/.gitconfig, para mostrar lo que se fusionaría (durante un tirón), lo que podría ser empujado, y un alias para diff contra el mando a distancia:

[alias] 
     # diff remote branch (e.g., git diff origin/master master) 
     difr = "diff @{u}" 

     # similar to hg incoming/outgoing, showing what would be pulled/pushed 
     # use option "-p" to see actual patch 
     incoming = "!git remote update -p; git log [email protected]{u}" 

     # showing what would be pushed (see also alias difr) 
     outgoing = log @{u}..