预览Git推送

我怎样才能看到哪些提交实际上将被推送到远程存储库?

据我所知,无论何时从远程存储库中取出master,即使是空的,也可能会生成提交。

这使得当地的主人即使没有任何推动力,也会“前进”。

现在,如果我尝试(从主):

git cherry origin master 

我有一个想要推动什么,虽然这也显示了我已经推动了一些提交。 有没有办法只显示将被推送的新内容?

记住origin/master是在最后一次拉动时指向远程命名origin的master分支的头部的一个ref,所以你可以使用一个命令,比如

 $ git log origin/master..master 

你可以在git push --dry-run --porcelain输出的下面使用git-preview-push

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

用法示例:

  $ git预览推/ tmp /裸主
到/ tmp /裸
 270f8e6bec7af9b2509710eb1ae986a8e97068ec baz
 4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7酒吧 

我写了一个工具来做这个叫做git wtf: https : //github.com/michaelklishin/git-wtf 。 颜色和一切!

作为奖励,它也会向您展示一个function分支和一个整合分支之间的关系。

我在〜/ .gitconfig中添加了以下别名,以显示合并的内容(在拉取过程中),将要推送的内容以及与远程进行比较的别名:

 [alias] # diff remote branch (eg, 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 ..@{u}" # showing what would be pushed (see also alias difr) outgoing = log @{u}.. 

如果你把它放到你的Bashconfiguration文件中,你可以运行grin(Git remote incoming)和grout(Git remote outgoing)来查看原始主机的传入和传出提交的差异:

 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 }