2010-02-01 40 views
38

Làm cách nào tôi có thể xem cam kết nào là thực sự sẽ được đẩy tới một kho lưu trữ từ xa?Xem trước Git push

Theo như tôi biết, bất cứ khi nào tôi kéo chủ từ kho lưu trữ từ xa, các cam kết có khả năng được tạo, ngay cả khi chúng trống.

Điều này làm cho tổng thể địa phương trở thành 'chuyển tiếp' ngay cả khi thực sự không có gì để thúc đẩy.

Bây giờ, nếu tôi cố gắng (từ thạc sĩ):

git cherry origin master 

Tôi có một ý tưởng về những gì đang xảy đến được đẩy, mặc dù điều này cũng hiển thị một số cam kết mà tôi đã đẩy. Có cách nào để chỉ hiển thị nội dung mới sẽ được đẩy không?

Trả lời

24

Ghi origin/master là một ref trỏ đến người đứng đầu chi nhánh tổng thể các tên từ xa origin tại kéo cuối cùng, vì vậy bạn có thể sử dụng một lệnh như

$ git log origin/master..master 

Bạn có thể sử dụng git-preview-push dưới đây ý kiến ​​mà trên đầu ra của git push --dry-run --porcelain:

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

Ví dụ sử dụng:

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

1, nhưng tôi sẽ phải nhận được trên xà phòng của tôi về #!/Usr/bin/env perl, kể từ khi tôi chỉ bị đốt cháy bởi bugzilla sử dụng #!/Usr/bin/perl khi tôi đã cài đặt các mô-đun trong/usr/local/bin/perl và phải tạm thời tạo/usr/bin/perl một liên kết tượng trưng đến/usr/local/bin/perl –

+5

+1 'git log origin/master..master' là đủ trong hầu hết các trường hợp. –

+0

@William Đã sửa lỗi! –

0

Nếu bạn thả này vào Bash của bạn, quý khách sẽ có thể chạy nụ cười (Git từ xa đến) và vữa (Git đi từ xa) để xem diffs các cam kết được gửi và nhận tổng thể nguồn gốc:

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

Tôi đã viết một công cụ để làm điều này được gọi là git wtf: https://github.com/michaelklishin/git-wtf. Màu sắc và mọi thứ!

Là phần thưởng, nó cũng sẽ cho bạn thấy mối quan hệ giữa chi nhánh tính năng và chi nhánh tích hợp.

2

Tôi đã thêm các bí danh sau để tôi ~/.gitconfig, để hiển thị những gì sẽ được sáp nhập (trong một pull), những gì sẽ được đẩy, và một bí danh để diff chống lại điều khiển từ xa:

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