¿Cómo ‘git pull’ sin cambiar de rama (git checkout)?

6 minutos de lectura

Avatar de usuario de Diana Saunders
diana saunders

estoy acostumbrado a correr git pull y otros comandos desde dentro de una rama en la que estoy trabajando. Pero he configurado un servidor de desarrollo en el que trabajan varias personas, por lo que no quiero tener que cambiar de sucursal cuando lo haga.

Si quiero actualizar una rama existente en el servidor de desarrollo desde el repositorio de github que todos usamos, ¿cuál sería la forma correcta de hacerlo?

Si ejecuto el comando git pull github branchname ¿Eso simplemente empujará la rama hacia la rama actual?

Todos los ejemplos de git que puedo encontrar parecen indicar que ejecutas checkout branchname primero, luego haz el tirón. Estoy tratando de evitar eso. Como dije, esta es una rama existente y solo quiero actualizar a la última versión.

  • git fetch deberías hacer lo que quieras.

    – brad

    17/09/2013 a las 18:47


  • git fetch actualizaría la copia local de la sucursal remota, pero no cualquier sucursal local, incluso si una está configurada para rastrear esa sucursal remota específica. Puede o no ser lo que se busca. (Editar: de forma predeterminada, de todos modos. Es posible llamarlo con argumentos para que se comporte de manera diferente, pero en ese caso, los argumentos realmente deberían señalarse).

    usuario743382

    17/09/2013 a las 18:50


  • No entiendo muy bien… ¿todos usan el mismo repositorio local en el servidor de desarrollo? ¿Es por eso que no quieres cambiar de sucursal? ¿Por qué no hacer que todos hagan su propio clon privado en el que puedan trabajar? Ver también git: ¿actualizar una sucursal local sin revisarla?.

    usuario456814

    18 de septiembre de 2013 a las 3:03


  • Posible duplicado de fusionar, actualizar y extraer ramas de Git sin usar pagos

    – Michael Mrozek

    15 de abril de 2019 a las 15:20

avatar de usuario de koral
coral

Estaba buscando lo mismo y finalmente encontré la respuesta que funcionó para mí en otra publicación de stackoverflow: fusionar, actualizar y extraer ramas de Git sin usar pagos

Básicamente:

git fetch <remote> <srcBranch>:<destBranch>

Ejemplo:

git fetch origin branchname:branchname

  • ¿Hay alguna manera de usar la rama ascendente en lugar de especificar la rama de origen?

    – cambuntuoso

    22 de noviembre de 2019 a las 14:52

  • Tristemente, pero el pull tiene parámetros que el fetch no es: -s <strategy>, -Xsubtree=... que era vital para mí, por lo que este no es un reemplazo equivalente. Tuve el problema descrito aquí: congruityservice.com/blog/… pero en el caso mío no quería pagar en absoluto.

    – andry

    8 dic 2019 a las 19:46

  • Teniendo en cuenta que la pregunta es sobre la atracción, parece que la respuesta debería ser git pull <remote> <srcBranch>:<destBranch>.

    – marmota

    12 dic 2019 a las 20:46


  • Si las confirmaciones ya están en tu repositorio local: git fetch . origin/master:master

    – Evan

    24 de abril de 2020 a las 15:32

  • Si todo lo que desea es fusionar la sucursal (origen | en línea) en su sucursal local, puede usar git merge origin/master

    – Abdul Rehman

    11 oct 2021 a las 6:36

Tuve el mismo problema con la necesidad de confirmar o ocultar los cambios de funciones actuales, pagar maestro rama, hacer pull el comando obtiene todo, desde remoto a local master área de trabajo, luego cambie nuevamente a una rama de función y realice una rebase para ponerlo al día con el maestro.

Para hacer todo esto, mantenga el espacio de trabajo en la rama de funciones y evite todos los cambios, hago esto:

git fetch origin master:master

git rebase master

Y hace el truco muy bien.

  • Este es un buen consejo pero entierra el lede: según las respuestas a continuación, si está en feature y TODO lo que quiere hacer es actualizar su local master estar en línea con el origen, SIN tocar featuresolo haz git fetch origin master:master… y es como si hicieras stash-checkoutMaster-pull-checkoutFeature-stashPop!

    – ciudad b

    26 de julio de 2019 a las 16:25


  • Para fusionar el maestro de origen en su sucursal local, no necesita extraer el maestro local. Puedes usar git merge origin/master

    – Dan

    16 de agosto de 2019 a las 11:32

  • Un pull es solo una búsqueda seguida de una fusión/reorganización, por lo que debería poder hacer lo mismo en 1 línea: git pull origin main:main --rebase

    – jor

    15 de enero de 2021 a las 6:39

Usé el siguiente comando para actualizar la rama de origen a la rama local sin pagar. git buscar origen [BranchName]:[BranchName]

si quieres el local consejos de rama para volver a apuntar después git fetchnecesita algunos pasos adicionales.

Más concretamente, supongamos que el repositorio de github tiene sucursales D, B, Cy master (La razón de este extraño conjunto de nombres de rama se aclarará en un momento). estás en el anfitrión devhost y estás en un repositorio donde origin es el repositorio de github. Tú haces git fetchque trae todos los objetos y actualizaciones origin/D, origin/B, origin/Cy origin/master. Hasta ahora, todo bien. Pero ahora dices que quieres que pase algo, en devhosta local sucursales D, B, Cy/o master?

Tengo estas preguntas obvias (para mí de todos modos):

  1. Por qué quieres los consejos de todo sucursales actualizadas?
  2. ¿Qué pasa si alguna rama (por ejemplo, B) tiene confirmaciones de las que carece el repositorio remoto (github)? ¿Deberían fusionarse, reorganizarse o…?
  3. ¿Qué pasa si estás en alguna rama (p. ej., C) y el directorio de trabajo y/o el índice se modifican pero no se confirman?
  4. ¿Qué pasa si el repositorio remoto tiene nuevas sucursales agregadas (A) y/o sucursales eliminadas (D)?

Si la respuesta a (1) es “porque devhost no es en realidad para el desarrollo, sino que es un espejo local que simplemente mantiene una copia disponible localmente del repositorio de github para que todos nuestros desarrolladores reales puedan leerlo rápidamente en lugar de leer lentamente desde github”, entonces desea un “espejo” en lugar de un repositorio “normal”. No debería tener un directorio de trabajo, y quizás tampoco debería aceptar empujes, en cuyo caso las preguntas restantes simplemente desaparecen.

Si hay alguna otra respuesta, (2-4) se vuelven problemáticas.

En cualquier caso, aquí hay una forma de abordar la actualización de referencias locales basadas en referencias remotas (después de ejecutar git fetch -p por ejemplo):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

que va en el ... code here ... sección depende de las respuestas a las preguntas (2-4).

Usar

git fetch

en cambio. Actualiza las referencias remotas y los objetos en su repositorio, pero deja las ramas locales, HEAD y el árbol de trabajo solos.

  • Pero eso no actualiza las sucursales locales de su servidor de desarrollo… solo actualiza las sucursales de “origen” en esa carpeta de git, que corresponden al repositorio de github del autor de la pregunta.

    – ANeves

    3 oct 2017 a las 10:52

  • O, si quieres mi versión del problema: quiero fusionar mi rama de trabajo con “maestro”, y no con “origen/maestro de ssh://bla bla bla”. Hacer fetch actualizará origin/master, pero no master.

    – ANeves

    3 oct 2017 a las 10:53

  • Pero eso no actualiza las sucursales locales de su servidor de desarrollo… solo actualiza las sucursales de “origen” en esa carpeta de git, que corresponden al repositorio de github del autor de la pregunta.

    – ANeves

    3 oct 2017 a las 10:52

  • O, si quieres mi versión del problema: quiero fusionar mi rama de trabajo con “maestro”, y no con “origen/maestro de ssh://bla bla bla”. Hacer fetch actualizará origin/master, pero no master.

    – ANeves

    3 oct 2017 a las 10:53

¿Ha sido útil esta solución?