¿Cómo puedo ver lo que estoy a punto de empujar con git?

588

¿Hay alguna manera de ver qué se empujaría si hiciera un git pushcomando?

Lo que estoy imaginando es algo así como la pestaña "Archivos modificados" de la función "solicitud de extracción" de Github. Cuando publico una solicitud de extracción, puedo ver y ver qué se extraerá si aceptan mi solicitud de extracción:ejemplo de github de cambios agregados

La línea de comando está bien, pero preferiría algún tipo de GUI (como la captura de pantalla anterior).

cmcculloh
fuente
Muchas preguntas / respuestas relacionadas; aquí hay otro: stackoverflow.com/questions/2176278/preview-a-git-push/…
michael

Respuestas:

665

Para obtener una lista de los archivos que se enviarán, ejecute:

git diff --stat --cached [remote/branch]

ejemplo:

git diff --stat --cached origin/master

Para el código diff de los archivos a empujar, ejecute:

git diff [remote repo/branch]

Para ver las rutas completas de los archivos que cambiarán, ejecute:

git diff --numstat [remote repo/branch]

Si desea ver estas diferencias en una GUI, deberá configurar git para eso. Consulte ¿Cómo veo la salida 'git diff' con un programa visual diff? .

Ionuț G. Stan
fuente
8
Ambas variaciones de git diff --cached sin un commit dado solo mostrarán las diferencias con respecto a HEAD. Creo que te referías a git diff [--stat] - origen en caché / maestro, suponiendo que la rama principal del origen sea maestra
mfontani
52
Esto no es exactamente lo que quieres. Debe diferenciar HEAD, no el índice, contra origin ( git diff origin/master HEAD). Diferenciar el índice dará los mismos resultados si y solo si no tiene cambios organizados para la confirmación. Si tiene cambios organizados, se incluirán en el diff, pero claramente no se enviarán, ya que aún no se han confirmado.
Cascabel
55
Esta respuesta necesita ser editada para incluir la información en el comentario de @Jefromi git diff --stat origin/master HEADes la respuesta correcta.
Tony Topper
2
@mfontani tiene la respuesta correcta para mí. Quiero comprobar qué se verá afectado por lo que ya he cometido, no qué se comprometerá si confirmo todo lo que he cambiado. git diff --cached [remote/branch]hace el truco :)
poshaughnessy
2
en lugar de escribir origin / master, puede usar @ {u} por ejemplo, git diff @ {u} o git diff HEAD @ {u} Tenga en cuenta que esto solo funciona si tiene una rama de seguimiento ascendente ya creada y vinculada. Me resulta útil cuando tengo muchas ramas y muchos controles remotos para no tener que pensar en qué está vinculado.
Damien Sawyer
192

Siempre hay marcha en seco:

git push --dry-run

Hará todo excepto el envío real de los datos.

Si desea una vista más gráfica, tiene muchas opciones.

Tig y el script gitk que viene con git muestran la rama actual de su copia local y la rama del remoto u origen.

texto alternativo

Por lo tanto, las confirmaciones que realice después del origen son las confirmaciones que se enviarán.

Abra gitk desde el shell mientras está en la rama que desea empujar escribiendo gitk&, luego para ver la diferencia entre lo que está en el control remoto y lo que está a punto de empujar al control remoto, seleccione su confirmación local no presionada y haga clic derecho en el control remoto y elija "Difundir esto -> seleccionado": texto alternativo

Brian Gianforcaro
fuente
18
git push --dry-run no me muestra nada como lo que espero ver. gitk está más cerca, pero no me muestra el total agregado de todos los cambios que se impulsarán. Entonces, si estoy empujando 6 commits a control remoto, quiero ver la suma total de lo que se empujará. No me importa lo que cada commit tiene individualmente porque un commit puede ser completamente negado por el siguiente
cmcculloh
1
Si necesita una diferencia de lo que se empujará, haga git diff --stat HEAD origin/mastero git diff HEAD origin/master. Importante es la CABEZA , de lo contrario se incluyen cambios en su uncommited diff
Daniel Alder
¿Hay alguna razón por la que git no realiza una ejecución en seco automáticamente antes de intentar enviar datos a un control remoto? Si está empujando una gran cantidad de datos, carga todos los datos y luego muestra cualquier error. Acaba de perder el tiempo y el ancho de banda cargando datos que ahora tiene que volver a cargar. Esto parece un comportamiento extraño.
zeusstl
1
El problema git push --dry-runes que todavía requiere permiso de escritura en el control remoto. Por lo tanto, si tiene un clon sin permiso para avanzar, pero le gustaría ver cuáles son sus cambios locales no acelerados, --dry-runno lo hará.
Ed Avis
Esta es una buena solución, pero debe tenerse en cuenta que requiere conectarse al control remoto (incluida la introducción de la clave SSH si corresponde). Si solo quiere ver la diferencia entre branchy origin/branch, iría con la respuesta de Ionuț G. Stan, ya que en realidad no requiere conectarse al repositorio remoto. Esto puede ser bueno o malo, dependiendo de lo que necesite.
Sean the Bean
169

Para simplemente enumerar los commits que esperan ser empujados: ( este es el que recordará )

git cherry -v

Muestra los temas de compromiso junto a los SHA1.

Alex Nolasco
fuente
55
Una cosa interesante es que puede especificar un control remoto para comparar: git cherry -v heroku/remoteen caso de que mantenga su código en más de un control remoto.
fagiani
¿Cuál es el mejor comando complementario que nos permite realmente correlacionar las diferencias que contienen estas confirmaciones?
Hassan Baig
Este comando es bueno, pero me gustaría tener más detalles, como los nombres de los archivos que se cambiarán durante la inserción.
LS
21

Probablemente quieras correr git difftool origin/master.... eso debería mostrar la diferencia unificada de lo que está en su rama actual que aún no está en la rama de origen / maestra y mostrarla en la herramienta de diferencia gráfica de su elección. Para estar más actualizado, ejecute git fetchprimero.

Scott Chacon
fuente
2
git difftool -d origin/master, Tengo mi difftool configurado para fusionarse, así que funciona muy bien, ¡gracias!
Acuario Power
git difftool -des mucho mejor, gracias Aquarius Power. El único problema es que no detecta los archivos movidos y los muestra como eliminados y agregados.
EM0
8

Una forma de comparar su versión local antes de enviarla al repositorio remoto (tipo de inserción en ejecución en seco):

Utilice TortoiseGit:
haga clic con el botón derecho en el proyecto de carpeta raíz> TortoiseGit> Diferenciar con la versión anterior>
para la Versión 2, elijarefs/remotes/origin/master

usuario1921207
fuente
8

Inténtalo git diff origin/master..master(suponiendo que ese origin/mastersea ​​tu flujo ascendente). A diferencia de git push --dry-runesto, esto aún funciona incluso si no tiene permiso de escritura en la parte superior.

Ed Avis
fuente
5

Use git gui, allí puede ver una lista de lo que cambió en su confirmación real. También puede usar gitkwich que proporciona una interfaz fácil para los registros. Simplemente compare entre remotes/...y masterpara ver qué se empujará. Proporciona una interfaz similar a su captura de pantalla.

Ambos programas están incluidos en git.

fuz
fuente
1
No veo ningún lugar en git gui que muestre todo lo que se ha comprometido pero no se ha presionado.
cmcculloh
En git gui puedes ver qué se modifica pero no se compromete. En gik (a través de gitk --allusted obtiene una lista completa de todos los comentarios. Ahora puede comparar el estado real de su rama de desarrollo con su control remoto para empujar.
fuz
4

Para ver qué archivos se cambian y ver los cambios de código reales en comparación con la masterrama que podría usar:

git diff --stat --patch origin master

NOTA : Si utiliza cualquiera de los IDE de Intellij, puede hacer clic con el botón derecho en su proyecto de nivel superior, seleccionar Git > Comparar con rama > y elegir el origen que desee, por ejemplo origin/master. En el árbol de archivos que aparecerá, puede hacer doble clic en los archivos para ver una diferencia visual. A diferencia de la opción de línea de comandos anterior, puede editar sus versiones locales desde la ventana de diferencias.

ccpizza
fuente
3

Puede enumerar las confirmaciones por:

git cherry -v

Y luego compare con el siguiente comando donde el número de ^ es igual al número de confirmaciones (en el ejemplo, sus 2 confirmaciones):

git diff HEAD^^
DavidS
fuente
Simplemente es bueno ver la lista de los últimos commits. Esto no dará el nombre de los archivos. Por lo tanto, como alguien respondió usando opciones de ejecución en seco y opciones de parche es mejor. git diff --stat --patch origin master git push --dry-run
Sree Rama
2

Si está utilizando Mac OS X, le recomendaría que obtenga Tower, es un programa maravilloso que ha hecho que tratar con Git sea un placer para mí. Ahora ya tengo que recordar los comandos del terminal y ofrece una gran interfaz gráfica de usuario para ver, rastrear y resolver diferencias en los archivos.

Y no, no estoy afiliado a ellos, solo uso su software y realmente me gusta.

http://www.git-tower.com/

kakubei
fuente
2
Yo uso Tower, pero ¿cómo puede ver los archivos que se han confirmado pero no se han enviado?
Michael Irey
Esto no responde la pregunta.
reinierpost
1

Solo para agregar mis dos centavos ... Quería implementar esto al ejecutar trabajos en una tubería de gitlab en un corredor de gitlab. La mejor manera de hacer esto era usar este script:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

También en mi caso quería filtrar archivos por extensión, para lograr esto utilicé:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Después de eso, puede, por ejemplo, reenviar esta lista a otro lugar, un linter quizás;)

Espero que esto ayude a alguien.

Michal Mikolajczyk
fuente
1
  1. Si tiene permisos de escritura en remoto
git push --dry-run
  1. Si no tiene permisos de escritura en remoto
git diff --stat HEAD remote/branch
vkg
fuente
0

Después git commit -m "{your commit message}", obtendrá un hash de confirmación antes del empuje. Para que pueda ver con qué está presionando gitejecutando el siguiente comando:

git diff origin/{your_branch_name} commit hash

p.ej: git diff origin/master c0e06d2

Chandra
fuente
Gracias por responder, pero creo que este esfuerzo no fue necesario ya que la pregunta es bastante antigua y muy votada. Es mejor gastar esfuerzos en diferentes preguntas.
Pbd