Предварительный просмотр Git push - PullRequest
39 голосов
/ 01 февраля 2010

Как узнать, какие коммиты на самом деле будут отправлены в удаленный репозиторий?

Насколько я знаю, всякий раз, когда я извлекаю master из удаленного репозитория, коммиты могут генерироваться, даже если они пусты.

Это приводит к тому, что локальный мастер будет «вперед», даже если на самом деле нечего толкать.

Теперь, если я попытаюсь (от мастера):

git cherry origin master

У меня есть представление о том, что будет выдвигаться, хотя это также отображает некоторые коммиты, которые я уже выдвинул. Есть ли способ отображать только новый контент, который будет добавлен?

Ответы [ 4 ]

24 голосов
/ 01 февраля 2010

Помните, origin/master - это ссылка, указывающая на заголовок главной ветви на пульте с именем 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
To /tmp/bare
270f8e6bec7af9b2509710eb1ae986a8e97068ec baz
4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 bar
5 голосов
/ 12 апреля 2011

Я написал для этого инструмент под названием git wtf: https://github.com/michaelklishin/git-wtf. Цвета и все!

В качестве бонуса он также покажет вам взаимосвязь между функциональной ветвью и интеграционной ветвью.

2 голосов
/ 06 декабря 2012

Я добавил следующие псевдонимы в мой ~ / .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}..
0 голосов
/ 14 мая 2010

Если вы укажете это в своем профиле Bash, вы сможете запускать grin (удаленный вход Git) и grout (удаленный исходящий Git), чтобы увидеть различия коммитов, которые являются входящими и исходящими для мастера источника:

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
}
...