2010-02-01 14 views
38

Come posso vedere quali commit sono in realtà che verrà inviato a un repository remoto?Anteprima di un push Git

Per quanto ne so, ogni volta che estraggo il master dal repository remoto, è probabile che vengano generati commit, anche se sono vuoti.

Ciò fa sì che il master locale sia "in avanti" anche se non c'è davvero nulla da spingere.

Ora, se provo (da master):

git cherry origin master 

ho un'idea di quello che sta per essere spinto, anche se questo mostra anche alcune commit che ho già spinto. C'è un modo per visualizzare solo i nuovi contenuti che verranno inseriti?

risposta

24

Ricordate origin/master è un ref che punta al capo del ramo principale sul remoto denominato origin all'ultimo tiro, così si potrebbe utilizzare un comando come

$ git log origin/master..master 

Si potrebbe utilizzare git-preview-push di seguito che i commenti sull'uscita del git push --dry-run --porcelain: utilizzo

#! /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"; 
    } 
} 

Esempio:

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

+1, ma dovrò prendere il mio soapbox su #!/Usr/bin/env perl, da quando sono appena stato masterizzato da bugzilla usando #!/Usr/bin/perl mentre stavo installando i moduli in/usr/local/bin/perl e dovevano temporaneamente rendere/usr/bin/perl un link simbolico a/usr/local/bin/perl –

+5

+1 'git log origin/master..master' è sufficiente nella maggior parte dei casi. –

+0

@William Risolto! –

0

Se si lascia cadere questo nella vostra Bash profilo sarete in grado di eseguire ghigno (Git remoto in ingresso) e malta (Git remoto in uscita) per vedere diff di commit che sono entrata e in uscita per il padrone origine:

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

Ho scritto uno strumento per fare ciò chiamato git wtf: https://github.com/michaelklishin/git-wtf. Colori e tutto!

Come bonus, mostrerà anche la relazione tra un ramo di funzionalità e un ramo di integrazione.

2

Ho aggiunto i seguenti alias alla mia ~/.gitconfig, per mostrare quello che sarebbe fusa (durante un pull), quello che sarebbe stato spinto, e un alias per diff contro il telecomando:

[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}..