42 votes

Prévisualiser un push Git

Comment puis-je voir quels commits sont en fait va être poussé vers un dépôt distant ?

Pour autant que je sache, chaque fois que je tire master du dépôt distant, des commits sont susceptibles d'être générés, même s'ils sont vides.

Ainsi, le maître local est en avance, même s'il n'y a rien à pousser.

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

git cherry origin master

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

25voto

Greg Bacon Points 50449

Souvenez-vous de origin/master est une référence qui pointe vers la tête de la branche principale sur le site distant nommé origin au dernier tirage, vous pouvez donc utiliser une commande telle que

$ git log origin/master..master

Vous pourriez utiliser git-preview-push ci-dessous qui commente 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/bare master
To /tmp/bare
270f8e6bec7af9b2509710eb1ae986a8e97068ec baz
4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 bar

1 votes

+1, mais je vais devoir prendre la parole à propos de #!/usr/bin/env perl, puisque je viens de me faire griller par bugzilla en utilisant #!/usr/bin/perl alors que j'installais des modules dans /usr/local/bin/perl et que j'ai dû temporairement faire de /usr/bin/perl un lien symbolique vers /usr/local/bin/perl.

7 votes

+1 git log origin/master..master est suffisant dans la plupart des cas.

2 votes

git log origin/master..master --oneline --decorate est bon aussi.

5voto

William Morgan Points 31

J'ai écrit un outil pour faire ça, appelé git wtf : https://github.com/michaelklishin/git-wtf . Les couleurs et tout le reste !

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

3voto

michael_n Points 980

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 différencier par rapport au remote :

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

0voto

Clintm Points 832

Si vous ajoutez ceci à votre profil Bash, vous pourrez exécuter grin (Git remote incoming) et grout (Git remote outgoing) pour voir les différences entre les commits entrants et sortants 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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X