42

如何查看哪些提交实际上将被推送到远程存储库?

据我所知,每当我从远程存储库中拉出 master 时,都可能会生成提交,即使它们是空的。

即使真的没有什么可以推动的,这也会导致本地主机“前进”。

现在,如果我尝试(来自主人):

git cherry origin master

我对将要推送的内容有所了解,尽管这也显示了我已经推送的一些提交。有没有办法只显示将要推送的新内容?

4

4 回答 4

25

请记住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 酒吧
于 2010-02-01T12:18:53.227 回答
5

我为此编写了一个名为 git wtf 的工具:https ://github.com/michaelklishin/git-wtf 。颜色和一切!

作为奖励,它还将向您展示功能分支和集成分支之间的关系。

于 2011-04-11T20:36:21.607 回答
3

我在我的 ~/.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}..
于 2012-12-05T21:11:18.397 回答
0

如果你把它放到你的 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
}
于 2010-05-14T00:28:14.383 回答