【发布时间】:2011-01-11 16:30:26
【问题描述】:
我如何查看哪些提交实际上将被推送到远程存储库?
据我所知,每当我从远程存储库中拉出 master 时,都可能会生成提交,即使它们是空的。
这会导致本地主机“前进”,即使真的没有什么要推送的。
现在,如果我尝试(来自大师):
git cherry origin master
我对将要推送的内容有所了解,尽管这也显示了一些我已经推送的提交。有没有办法只显示要推送的新内容?
【问题讨论】:
我如何查看哪些提交实际上将被推送到远程存储库?
据我所知,每当我从远程存储库中拉出 master 时,都可能会生成提交,即使它们是空的。
这会导致本地主机“前进”,即使真的没有什么要推送的。
现在,如果我尝试(来自大师):
git cherry origin master
我对将要推送的内容有所了解,尽管这也显示了一些我已经推送的提交。有没有办法只显示要推送的新内容?
【问题讨论】:
记住origin/master 是一个引用,它指向最后一次拉取时名为origin 的远程主分支的头部,因此您可以使用诸如
$ git log origin/master..master
您可以在 git push --dry-run --porcelain 的输出中使用该 cmets 下方的 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 preview-push /tmp/bare master 到 /tmp/bare 270f8e6bec7af9b2509710eb1ae986a8e97068ec baz 4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 条
【讨论】:
git log origin/master..master 在大多数情况下就足够了。
git log origin/master..master --oneline --decorate 也不错。
我为此编写了一个名为 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
}
【讨论】: