tipos tag remove practices etiquetas crear commits commands best git push

remove - git tag commits



Vista previa de un empuje de Git (4)

Agregué los siguientes alias a mi ~ / .gitconfig, para mostrar qué se fusionaría (durante una extracción), qué se empujaría y un alias para diferenciar con el control remoto:

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

¿Cómo puedo ver qué compromisos realmente se enviarán a un repositorio remoto?

Hasta donde yo sé, cada vez que retiro el maestro del repositorio remoto, es probable que se generen confirmaciones, incluso si están vacías.

Esto hace que el maestro local sea "reenviado" incluso si realmente no hay nada que empujar.

Ahora, si intento (desde el maestro):

git cherry origin master

Tengo una idea de lo que se va a impulsar, aunque esto también muestra algunos compromisos que ya he aplicado. ¿Hay alguna manera de mostrar solo el nuevo contenido que se va a impulsar?


Escribí una herramienta para hacer esto llamada git wtf: https://github.com/michaelklishin/git-wtf . Colores y todo!

Como beneficio adicional, también le mostrará la relación entre una rama de características y una rama de integración.


Recuerde que origin/master es un ref que apunta al encabezado de la rama master en el origin remoto designado en la última extracción, por lo que podría usar un comando como

$ git log origin/master..master

Puede usar git-preview-push debajo de los comentarios en la salida 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"; } }

Ejemplo de uso:

$ git preview-push /tmp/bare master To /tmp/bare 270f8e6bec7af9b2509710eb1ae986a8e97068ec baz 4c3d1e89f5d6b0d493c9d0c7a06420d6b2eb5af7 bar


Si coloca esto en su perfil de Bash, podrá ejecutar grin (entrada remota de Git) y lechada (salida remota de Git) para ver las diferencias de confirmaciones entrantes y salientes para el maestro de origen:

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 }