【问题标题】:Preview a Git push预览 Git 推送
【发布时间】:2011-01-11 16:30:26
【问题描述】:

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

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

这会导致本地主机“前进”,即使真的没有什么要推送的。

现在,如果我尝试(来自大师):

git cherry origin master

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

【问题讨论】:

    标签: git push


    【解决方案1】:

    记住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 条

    【讨论】:

    • +1,但我必须在我的肥皂盒上讨论#!/usr/bin/env perl,因为我刚被 bugzilla 烧毁,当时我使用 #!/usr/bin/perl正在 /usr/local/bin/perl 中安装模块,并且不得不暂时使 /usr/bin/perl 成为 /usr/local/bin/perl 的符号链接
    • +1 git log origin/master..master 在大多数情况下就足够了。
    • git log origin/master..master --oneline --decorate 也不错。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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}..
      

      【讨论】:

        【解决方案4】:

        如果你将它放到你的 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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-09
          • 2014-10-15
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          相关资源
          最近更新 更多