2008-10-07 20 views
156

¿Es posible?Cómo previsualizar git-pull sin hacer fetch?

Básicamente, hay un repositorio remoto de la que me tire simplemente usando:

git pull 

Ahora, me gustaría una vista previa de lo que cambiaría este tirón (un diff) sin tocar nada de mi lado. La razón es que lo que estoy sacando puede no ser "bueno" y quiero que alguien más lo solucione antes de hacer que mi repositorio sea "sucio".

+2

Tu edición es rara. Hacer una "búsqueda de git" 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 recuperación quieres deshacer, ya que no toca tu árbol de trabajo. – dkagedal

+0

Gracias dkagedal, escribí esto antes de entender completamente cómo funciona Git. Eliminé esa edición. –

Respuesta

177

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

Normalmente no es necesario deshacer una búsqueda, ya que al realizar una búsqueda solo se actualiza la rama remota y ninguna de sus ramas.Si no está preparado para hacer un pull y fusionarse en todas las confirmaciones remotas, puede usar git cherry-pick para aceptar solo las confirmaciones remotas específicas que desee. Más tarde, cuando esté listo para obtener todo, un git pull se combinará en el resto de los commits.

Actualización: No estoy del todo seguro de por qué quieres evitar el uso de git fetch. Todo lo que git fetch hace es actualizar su copia local de una rama remota. 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 de cron porque es muy seguro.

+0

Supongo que me perdí esa parte de "nada que ver con MIS sucursales" mientras leo los documentos. Gracias. –

+0

Por alguna razón, eso no funciona para mí. Probé git diff HEAD ... origin/master y aún no he enumerado ningún cambio cuando hago 'pull origin master' capta y fusiona los cambios. ¿Eso es porque configuré el repositorio remoto usando git remote add? – screenm0nkey

+0

@ screenm0nkey: No lo sé (sin saber más información). Recomiendo abrir una nueva pregunta para preguntar sobre esto si todavía no está seguro. –

37

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

Se extraerán los cambios y los objetos sin comprometerlos con el índice del repositorio local.

Se pueden combinar más tarde con git merge.

Man Page

Editar: Además explination

Directamente desde el git- SVN Crash Courselink

Ahora, ¿cómo se consigue cualquier nuevo cambio de un repositorio remoto? Se les tomará:

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

En este momento están en su repositorio y se puede examinar usando:

git log origin 

También puede comparar los cambios. También puede usar git log HEAD ..origin para ver solo los cambios que no tiene en su sucursal. Entonces, si le gustaría combinarlos - acaba de hacer:

git merge origin 

Tenga en cuenta que si no se especifica una rama a buscar, es convenientemente de forma predeterminada la distancia de seguimiento.

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

Estoy tratando de hacer esto por ejemplos y memoria, actualmente no tengo una caja para probar. Usted debe buscar en:

git log -p //log with diff 

una zona de alcance se puede deshacer con git restablecer --hard (link), sin embargo todos los cambios no confirmados en su árbol se perderán, así como los cambios que ha exagerado.

+0

Si explica dos cosas, eso podría ser bueno: 1. ¿Cómo deshago git-fetch? 2. ¿Cómo veo el diff? –

+1

1) deshacer git-fetch? 2) git diff HEAD..origin –

+0

El diff se hace como dijo Christian, una búsqueda se puede deshacer con el restablecimiento de git --hard, sin embargo, se perderán todos los cambios no confirmados en su árbol así como los cambios que haya realizado. –

17

Puede obtener de un repositorio remoto, ver las diferencias y luego tirar o fusionar.

Este es un ejemplo de un acuerdo de recompra remoto llamado origin y una rama llamada master seguimiento de la rama remota origin/master:

git checkout master             
git fetch           
git diff origin/master 
git pull --rebase origin master 
5

he creado un alias de git costumbre de hacer eso por mí:

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

con eso puede hacer esto:

$git fetch 
$git changes origin 

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

+0

eres DIOS. esto debería venir dentro de Git –

-1

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

0

Puede llegar tarde a la fiesta, pero esto es algo que me molestó demasiado. En mi experiencia, yo preferiría que desee ver qué cambios están pendientes, que actualizar mi copia de trabajo y hacer frente a esos cambios ...

esto va al archivo ~/.gitconfig:

[alias] 
     diffpull=!git fetch && git diff origin/`git rev-parse --abbrev-ref HEAD`..HEAD 

se obtiene el bifurcación actual - que hace una diferencia entre la copia de trabajo y esta bifurcación recuperada. por lo que solo debería ver los cambios que vendrían con git pull.

1

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

  1. Primera ejecución git fetch, que da salida como esta (parte de la producción):

    ... 
    72f8433..c8af041 develop -> origin/develop 
    ...

Esta operación nos da dos cometer identificadores, en primer lugar es el antiguo, y el segundo será el nuevo.

  1. Luego comparar estos dos confirmaciones utilizando diff git

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

Este comando mostrará una lista de los archivos que serán actualizados:

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 aplicación/controlador/xxxx.php y aplicación/view/aaaa.php se actualizará.

La comparación de dos confirmaciones utilizando git diff imprime todos los archivos actualizados con líneas cambiadas, pero con grep que busca y recibe sólo las líneas contiene diff --git de salida.

Cuestiones relacionadas