如何查看哪些提交实际上将被推送到远程存储库?
据我所知,每当我从远程存储库中拉出 master 时,都可能会生成提交,即使它们是空的。
即使真的没有什么可以推动的,这也会导致本地主机“前进”。
现在,如果我尝试(来自主人):
git cherry origin master
我对将要推送的内容有所了解,尽管这也显示了我已经推送的一些提交。有没有办法只显示将要推送的新内容?
请记住origin/master
,这是一个 ref,它指向origin
在最后一次拉取时命名的远程主分支的头部,因此您可以使用如下命令
$ git log origin/master..master
您可以git-preview-push
在下面对输出的注释使用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";
}
}
示例用法:
$ git preview-push /tmp/bare master 到 /tmp/bare 270f8e6bec7af9b2509710eb1ae986a8e97068ec baz 4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 酒吧
我为此编写了一个名为 git wtf 的工具:https ://github.com/michaelklishin/git-wtf 。颜色和一切!
作为奖励,它还将向您展示功能分支和集成分支之间的关系。
我在我的 ~/.gitconfig 中添加了以下别名,以显示将合并的内容(在拉取期间)、将推送的内容以及用于区分远程的别名:
[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 ..@{u}"
# showing what would be pushed (see also alias difr)
outgoing = log @{u}..
如果你把它放到你的 Bash 配置文件中,你将能够运行 grin(Git 远程传入)和 grout(Git 远程传出)来查看 origin master 的传入和传出提交的差异:
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
}