Предварительный просмотр Git push
Как я могу увидеть, какие коммиты действительно будут отправлены в удаленный репозиторий?
Насколько я знаю, всякий раз, когда я извлекаю master из удаленного хранилища, коммиты, скорее всего, будут генерироваться, даже если они пусты.
Это приводит к тому, что локальный мастер "вперед", даже если толкать нечего.
Теперь, если я попробую (от мастера):
git cherry origin master
У меня есть представление о том, что будет выдвигаться, хотя это также отображает некоторые коммиты, которые я уже выдвинул. Есть ли способ отобразить только новый контент, который будет добавлен?
4 ответа
Помните origin/master
ссылка, указывающая на главу ветки 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 К / тмп / голый 270f8e6bec7af9b2509710eb1ae986a8e97068ec baz 4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 bar
Я написал инструмент для этого под названием 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), чтобы увидеть различия в коммитах, которые являются входящими и исходящими для мастера источника:
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
}