¿Cómo obtener una vista previa de git-pull sin obtener fetch?

204

¿Es posible?

Básicamente, hay un repositorio remoto del que extraigo usando solo:

git pull

Ahora, me gustaría ver una vista previa de lo que cambiaría este tirón (una diferencia) sin tocar nada de mi lado. La razón es que lo que estoy tirando podría no ser "bueno" y quiero que alguien más lo arregle antes de hacer que mi repositorio esté "sucio".

Milan Babuškov
fuente
44
Tu edición es rara. Hacer un "git fetch" no altera su árbol de trabajo de ninguna manera, por lo que no importa si tiene cambios locales no confirmados. Y no está claro qué parte de la búsqueda desea deshacer, ya que no toca su árbol de trabajo.
dkagedal
Gracias dkagedal, escribí esto antes de entender completamente cómo funciona Git. Eliminé esa edición.
Milan Babuškov

Respuestas:

234

Después de hacer una git fetch, haga una git log HEAD..origin/masterpara mostrar las entradas de registro entre su última confirmación común y la rama maestra del origen. Para mostrar los diferenciales, use git log -p HEAD..origin/masterpara mostrar cada parche o git diff HEAD...origin/master(tres puntos, no dos) para mostrar un solo diferencial.

Normalmente no hay necesidad de deshacer una búsqueda, porque hacer una búsqueda solo actualiza las ramas remotas y ninguna de sus ramas. Si no está preparado para hacer una extracción y combinar todas las confirmaciones remotas, puede usar git cherry-pickpara aceptar solo las confirmaciones remotas específicas que desee. Más tarde, cuando esté listo para obtener todo, git pullse fusionará en el resto de los commits.

Actualización: no estoy completamente seguro de por qué quieres evitar el uso de git fetch. Todo lo que hace git fetch es actualizar su copia local de las ramas remotas. Esta copia local no tiene nada que ver con ninguna de sus sucursales, y no tiene nada que ver con los cambios locales no confirmados. He oído hablar de personas que ejecutan git fetch en un trabajo cron porque es muy seguro. (Sin embargo, normalmente no recomendaría hacerlo).

Greg Hewgill
fuente
Supongo que me perdí esa parte de 'nada que ver con MIS ramas' mientras leía los documentos. Gracias.
Milan Babuškov
1
Por alguna razón, eso no funciona para mí. Intenté git diff HEAD ... origin / master y todavía no enumeró ningún cambio cuando hago 'pull origin master' recupera y combina los cambios. ¿Es porque configuré el repositorio remoto usando git remote add?
screenm0nkey
@ screenm0nkey: No lo sé (sin saber más información). Recomiendo abrir una nueva pregunta para preguntar sobre esto si aún no está seguro.
Greg Hewgill
1
Lo que funciona para mí (después de la búsqueda de git): git log origin / master
slaman
2
git diff ...@{u}es lo mismo que git diff HEAD...origin/mastersi origin / master es la rama aguas arriba
ruinas el
47

Creo que git fetch es lo que estás buscando.

Extraerá los cambios y los objetos sin comprometerlos con el índice de su repositorio local.

Pueden fusionarse más tarde con git merge .

Página de hombre

Editar: Explicación adicional

Directamente desde el git- SVN Crash Course enlace

Ahora, ¿cómo se obtienen nuevos cambios desde un repositorio remoto? Los traes:

git fetch http://host.xz/path/to/repo.git/ 

En este punto, están en su repositorio y puede examinarlos usando:

git log origin 

También puede diferenciar los cambios. También puede usar git log HEAD..origin para ver solo los cambios que no tiene en su rama. Entonces, si desea fusionarlos, solo haga:

git merge origin

Tenga en cuenta que si no especifica una rama para buscar, convenientemente se configurará de forma predeterminada el control remoto de seguimiento.

La lectura de la página del manual honestamente le dará la mejor comprensión de las opciones y cómo usarla.

Solo estoy tratando de hacer esto con ejemplos y memoria, actualmente no tengo un cuadro para probar. Deberías mirar:

git log -p //log with diff

Una recuperación se puede deshacer con git reset --hard ( enlace ), sin embargo, todos los cambios no confirmados en su árbol se perderán, así como los cambios que haya obtenido.

Brian Gianforcaro
fuente
Si explica dos cosas, eso podría ser bueno: 1. ¿Cómo deshago git-fetch? 2. ¿Cómo veo el diff?
Milan Babuškov
1
1) deshacer git-fetch? 2) git diff HEAD..origin
Chris Vest
La diferencia se realiza como Christian dijo, una recuperación se puede deshacer con git reset --hard, sin embargo, todos los cambios no confirmados en su árbol se perderán, así como los cambios que haya obtenido.
Brian Gianforcaro
¿Estás buscando git reset --softo --mixed? Verifique la página de manual.
Aristóteles Pagaltzis
1
Si entiendo bien, entonces no hay necesidad de deshacer un "git fetch" porque no toca su copia de trabajo y tampoco su repositorio. "git fetch" almacena objetos y referencias en .git / FETCH_HEAD
Thorsten Niehues
21

Puede buscar desde un repositorio remoto, ver las diferencias y luego extraer o fusionar.

Este es un ejemplo para un repositorio remoto llamado originy una rama llamada masterseguimiento de la rama remota origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
Antonio Bardazzi
fuente
8

Creé un alias de git personalizado para hacer eso por mí:

alias.changes=!git log --name-status HEAD..

con eso puedes hacer esto:

$git fetch
$git changes origin

Esto le dará una manera agradable y fácil de previsualizar los cambios antes de hacer un merge.

Matías
fuente
Tú eres Dios. esto debe venir dentro de sí git
Z. Khullah
3

Utilizo estos dos comandos y puedo ver los archivos para cambiar.

  1. Primero ejecutando git fetch , da una salida como esta (parte de la salida):

    ...
    72f8433..c8af041 desarrollar -> origen / desarrollar
    ...

Esta operación nos da dos ID de confirmación, la primera es la anterior y la segunda será la nueva.

  1. Luego compare estos dos commits usando git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Este comando enumerará los archivos que se actualizarán:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Por ejemplo, app / controller / xxxx.php y app / view / aaaa.php se actualizarán.

La comparación de dos confirmaciones usando git diff imprime todos los archivos actualizados con líneas cambiadas, pero con grep busca y obtiene solo las líneas que contienen diff --git de la salida.

cowboycb
fuente
3

Puede que llegue tarde a la fiesta, pero esto es algo que me molestó durante demasiado tiempo. En mi experiencia, preferiría ver qué cambios están pendientes que actualizar mi copia de trabajo y tratar con esos cambios.

Esto va en el ~/.gitconfigarchivo:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Obtiene la rama actual, luego hace una diferencia entre la copia de trabajo y esta rama obtenida. Por lo tanto, solo debería ver los cambios que vendrían con git pull.

Andy P
fuente
1
¿Podría cambiar la cadena de referencia por HEAD..@{u}? Es más simple y no requiere que el control remoto se llame "origen" o que su rama se llame igual que en el control remoto.
Michael - ¿Dónde está Clay Shirky?
Este es un alias bien hecho, pero no estoy seguro de por qué querrías hacer esto en primer lugar. Tendrás que lidiar con los cambios alguna vez, ¿verdad? Debería poder abortar la parte de fusión git pullsi no le gusta lo que está haciendo ... así que no estoy seguro de cuál es el caso de uso para esto.
Marnen Laibow-Koser
Sé que tengo que lidiar con los cambios en algún momento, pero como escribí, a veces no quiero. Solo quiero saber si algo se va a romper y tengo que reservar un poco más de tiempo para esto, o si puedo hacer algo más git pulltarde. También creo que de eso se trataba la pregunta de op.
Andy P
-1

Si no desea que git-fetch actualice su .git local, simplemente copie su repositorio local en un directorio temporal y realice una extracción allí. Aquí hay una mano corta:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ex.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
Laboratorios AX
fuente
'gtp' debe ejecutarse en la raíz del repositorio local, donde se encuentra .git.
AX Labs
-2

¿Qué hay de clonar el repositorio en otro lugar y hacer git log tanto en el pago real como en el clon nuevo para ver si obtuviste lo mismo?

Ed Greenberg
fuente
Una copia local refleja mejor el estado que otro clon. Vea mi publicación principal para más detalles .
AX Labs