¿Cómo decir los resultados de la confirmación de git antes de la inserción de git?

Soy nuevo en git. Entiendo que una vez que agregue nuevos files usando git add , tengo que ejecutar git commit y luego git push .

El otro día, hice esto y me sorprendí al descubrir que no todos mis files estaban registrados, por lo que me gustaría hacer la siguiente pregunta:

Una vez que hago git commit , ¿cómo puedo saber con certeza exactamente qué va a registrar antes de hacer git push ? ¿Puedo hacer una copy de mi proyecto, ya que será enviado a git?

Si ejecuta el git status antes de la git commit , le dirá qué cambios se includeán en la confirmación y cuáles no.

Una vez que haya ejecutado git commit los cambios ya están registrados en su repository local. Al presionar no se registran, simplemente actualiza otro repository con las confirmaciones que tienes en tu repository local. Esto es diferente de un VCS centralizado como Subversion.

Antes de presionar hay varias forms de ver lo que se empujará:

  • git diff origin/master mostrará las diferencias entre su estado actual y su origin/master .
  • git log origin/master..master los commits que se enviarán, pero no mostrará sus contenidos.
 git show 

mostrará los detalles de la última confirmación de compromiso.

Si hubo más de una confirmación, también puede usar

 git diff origin/master 

suponiendo que su control remoto se llame origin y la twig a la que desea presionar sea master .

  1. git diff le dará una buena idea de los cambios que está realizando. Por ejemplo, puede usar git diff origin/master (si el control remoto al que está presionando se llama origen) para ver las diferencias entre su twig actual y su control remoto.

  2. Otra forma de hacerlo es usar git show . Si has realizado 3 confirmaciones localmente, puedes usar git show HEAD...HEAD~3 para ver el contenido de tus últimas tres confirmaciones.

  3. Un medio más complejo (pero fácilmente accesible) es usar lo que whatchanged :

    git whatchanged -p --abbrev-commit --pretty=medium

    Utilizo un relleno de git alias donde esto está asignado a gwc en mi caparazón.

Yo uso un alias para un script bash para esto:

Guardo el script a continuación en ~/bin/git-outgoing directory ~/bin/git-outgoing en mi directory personal. Mi ~/bin/ está en mi PATH ; asegúrate de que sea donde sea que pones esto es accesible si planeas alias.

git-saliente :

 #!/bin/sh # Usage: git-outgoing [<upstream>] [<head> [<limit>]] # Show commits on current branch that do not exist on branch <upstream>. # bail out with message to stderr and exit status 1 die() { echo "$(basename $0):" "$@" 1>&2 exit 1 } # colors SHA=$(git config --get-color 'color.branch.local') ADD=$(git config --get-color 'color.diff.new') REM=$(git config --get-color 'color.diff.old') RESET=$(git config --get-color '' 'reset') # get the current branch in refs/heads/<branch> form ref=$(git symbolic-ref -q HEAD) test -n "$ref" || die "you're not on a branch" # just the branch name please branch=$(echo "$ref" | sed 's@^refs/heads/@@') test -n "$branch" || die "you're in a weird place; get on a local branch" # use tracking branch if no upstream given if [ $# -eq 0 ] then remote=$(git config --get "branch.$branch.remote" || true) merge=$(git config branch.$branch.merge) || die "branch $branch isn't tracking a remote branch and no <upstream> given" set -- "$remote/$(echo "$merge" |sed 's@^refs/heads/@@')" fi git cherry -v "$@" | cut -c1-9,43- | sed -e "s/^\(.\) \(.......\)/\1 $SHA\2$RESET/" | sed -e "s/^-/$REM-$RESET/" -e "s/^+/$ADD+$RESET/" 

Y esta secuencia de commands entrante entra en ~/bin/git-incoming :

git-entrante :

 #!/bin/sh # Usage: git-incoming [--diff] [<upstream>] [<head> [<limit>]] # Show commits on <upstream> that do not exist on current branch. # bail out with message to stderr and exit status 1 die() { echo "$(basename $0):" "$@" 1>&2 exit 1 } # colors SHA=$(git config --get-color 'color.branch.local') ADD=$(git config --get-color 'color.diff.new') REM=$(git config --get-color 'color.diff.old') RESET=$(git config --get-color '' 'reset') # check for -d / --diff argument diff=false if [ "$1" = '-d' -o "$1" = '--diff' ] then diff=true shift fi # use tracking branch if no upstream given if [ $# -eq 0 ] then # get the current branch in refs/heads/<branch> form ref=$(git symbolic-ref -q HEAD) test -n "$ref" || die "you're not on a branch" # just the branch name please branch=$(echo "$ref" | sed 's@^refs/heads/@@') test -n "$branch" || die "you're in a weird place; get on a local branch" # grab remote name for current branch remote=$(git config --get "branch.$branch.remote" || true) # grab tracked branch name for current branch merge=$(git config branch.$branch.merge) || die "branch $branch isn't tracking a remote branch and no <upstream> given" # make it so set -- "$remote/$(echo "$merge" |sed 's@^refs/heads/@@')" fi if $diff then git diff HEAD..."$1" else git cherry -v HEAD "$@" | cut -c1-9,43- | sed -e "s/^\(.\) \(.......\)/\1 $SHA\2$RESET/" | sed -e "s/^-/$REM-$RESET/" -e "s/^+/$ADD+$RESET/" fi 

En mi .gitconfig , creo un alias como este:

 [alias] out = !git-outgoing in = !git-incoming 

Ahora puedo hacer git out en mi raíz del proyecto para ver qué se empujará, o entrar para ver qué se extraerá.

Estos son guiones que encontré que fueron mejores que los míos. No puedo encontrar al autor, pero lo editaré cuando lo haga.

Puede hacerlo de varias maneras, pero lo más fácil es usar git log --stat . Le mostrará un resumen de los files que cambiaron:

 $ git log -2 --stat commit 85318f521f6c0b9843d6da12abf67f2de7608431 Author: Junio C Hamano <gitster@pobox.com> Date: Wed Jun 26 15:10:17 2013 -0700 Update draft release notes to 1.8.4 Signed-off-by: Junio C Hamano <gitster@pobox.com> Documentation/RelNotes/1.8.4.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) commit ad76feb55eb7645661421e213796129efcbb7d56 Merge: 12dd2f6 212eb96 Author: Junio C Hamano <gitster@pobox.com> Date: Wed Jun 26 15:08:09 2013 -0700 Merge branch 'tr/maint-apply-non-git-patch-parsefix' Fix for the codepath to parse patches that add new files, generated by programs other than Git. THis is an old breakage in v1.7.11 and will need to be merged down to the maintanance tracks. * tr/maint-apply-non-git-patch-parsefix: apply: carefully strdup a possibly-NULL name 

Este es un ejemplo del repository de git. Nota: las asignaciones de fusión no mostrarán nada por defecto. Si desea ver las statistics en ellos, debe pasar la opción --cc (que significa "compacto combinado"):

 $ git log -2 --stat --cc commit 85318f521f6c0b9843d6da12abf67f2de7608431 Author: Junio C Hamano <gitster@pobox.com> Date: Wed Jun 26 15:10:17 2013 -0700 Update draft release notes to 1.8.4 Signed-off-by: Junio C Hamano <gitster@pobox.com> Documentation/RelNotes/1.8.4.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) commit ad76feb55eb7645661421e213796129efcbb7d56 Merge: 12dd2f6 212eb96 Author: Junio C Hamano <gitster@pobox.com> Date: Wed Jun 26 15:08:09 2013 -0700 Merge branch 'tr/maint-apply-non-git-patch-parsefix' Fix for the codepath to parse patches that add new files, generated by programs other than Git. THis is an old breakage in v1.7.11 and will need to be merged down to the maintanance tracks. * tr/maint-apply-non-git-patch-parsefix: apply: carefully strdup a possibly-NULL name builtin/apply.c | 2 +- t/t4111-apply-subdir.sh | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 

Para ver el contenido real que cambió, puede usar la opción -p en el git log , o mirar la confirmación directamente con git show COMMIT_ID . Yo prefiero este último git show acepta la opción --stat .

Ejecute gitk o cualquier otro explorador de historial visual: muestra su sucursal y el origen, la diferencia en las confirmaciones y proporciona todas las demás herramientas para realizar una revisión post hoc.