web-dev-qa-db-fra.com

Prévisualiser un push Git

Comment puis-je voir quels commits sont en fait qui vont être poussés vers un référentiel distant?

Autant que je sache, chaque fois que je tire le maître du référentiel distant, des validations sont susceptibles d'être générées, même si elles sont vides.

Cela force le maître local à «avancer» même s'il n'y a vraiment rien à pousser.

Maintenant, si j'essaie (du maître):

git cherry Origin master

J'ai une idée de ce qui va être poussé, bien que cela affiche aussi quelques commits que j'ai déjà poussés. Existe-t-il un moyen d’afficher uniquement le nouveau contenu à transmettre?

38
Marcus

Remember Origin/master est une référence qui pointe vers la tête de la branche principale de la télécommande nommée Origin au dernier tirage. Vous pouvez donc utiliser une commande telle que

$ git log Origin/master..master

Vous pouvez utiliser git-preview-Push ci-dessous pour commenter la sortie de 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";
  }
}

Exemple d'utilisation:

$ git preview-Push/tmp/maître nu 
 à /tmp/bare[.____. 3112f8e6bec7af9b2509710eb1ae986a8e97068ec baz 
 4c3d1e89f5d6b0d493c9d0c7d0c7d5c6db
24
Greg Bacon

J'ai écrit un outil appelé git wtf: https://github.com/michaelklishin/git-wtf . Couleurs et tout!

En prime, il vous montrera également la relation entre une branche de fonctionnalité et une branche d'intégration.

5
William Morgan

J'ai ajouté les alias suivants à mon ~/.gitconfig, pour montrer ce qui serait fusionné (pendant un pull), ce qui serait poussé et un alias pour se différencier de la télécommande:

[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}..
2
michael

Si vous déposez ceci dans votre profil Bash, vous pourrez exécuter grin (Git distant entrant) et coulis (Git distant sortant) pour voir les diffs des validations entrantes et sortantes pour 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
}
0
Clintm