¿Git pull sin pagar?

133

Estoy acostumbrado a ejecutar git pull y otros comandos desde 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 hago. 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 arrastrará la rama a la rama actual?

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

Diana Saunders
fuente
66
git fetchDebes hacer lo que quieras.
Brad
11
git fetchactualizaría la copia local de la rama remota, pero no cualquier rama local, incluso si una está configurada para rastrear esa rama remota específica. Puede o no ser lo que se quiere. (. Editar: por defecto, de todos modos Es posible llamar con argumentos para hacer que se comporte de manera diferente, pero en ese caso, los argumentos realmente deben señalarse.)
2
No entiendo bien ... ¿todos usan el mismo repositorio local en el servidor de desarrollo? ¿Es por eso que no quieres cambiar de rama? ¿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 verificarlo? .

Respuestas:

221

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

Básicamente:

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

koral
fuente
¿Hay alguna manera de usar la rama ascendente en lugar de especificar la rama fuente?
Cambunctious
Por desgracia, pero la pulltiene parámetros que el fetchno: -s <strategy>, -Xsubtree=...lo cual fue un vital para mí, así que esto no es un reemplazo equivalente. Tuve el problema descrito aquí: congruityservice.com/blog/… pero en el caso mío no quería un pago en absoluto.
Andry
2
Teniendo en cuenta que la pregunta es acerca de tirar, parece que la respuesta debería serlo git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck
Si los commits ya están en su repositorio local:git fetch . origin/master:master
Evan
74

Tuve el mismo problema con la necesidad de comprometer o esconder los cambios actuales de las funciones, pagar la rama maestra , hacer el pullcomando, obtener todo, desde el masterespacio de trabajo remoto al local , luego cambiar de nuevo a una rama de la función y realizar una rebaseactualización para actualizar Maestro.

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

git fetch origin master:master

git rebase master

Y hace el truco muy bien.

Marcin TP Łuczyński
fuente
19
Este es un buen consejo, pero oculta el lede: según las respuestas a continuación, si está conectado featurey TODO lo que quiere hacer es actualizar su local masterpara que esté en línea con el origen, SIN tocar feature, simplemente haga git fetch origin master:master... y es como si lo hiciera stash-checkoutMaster-pull-checkoutFeature-stashPop!
btown
77
Para fusionar el maestro de origen en su sucursal local, no necesita extraer el maestro local. Puedes usar git merge origin/master
Dan
-1

Si desea que las sugerencias de sucursales locales se vuelvan a señalar después git fetch, necesita algunos pasos adicionales.

Más concretamente, supongamos que el repositorio GitHub tiene ramas D, B, C, y master(la razón de este nombre-sucursal-conjunto impar serán claras en un momento). Estás en el host devhosty estás en un repositorio donde originestá el repositorio de Github. Que haces git fetch, lo que aporta más de todos los objetos y actualizaciones origin/D, origin/B, origin/C, y origin/master. Hasta aquí todo bien. Pero ahora usted dice que quiere que pase algo, sobre devhost, a locales ramas D, B, C, y / o master?

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

  1. ¿Por qué quieres que se actualicen los consejos de todas las sucursales?
  2. ¿Qué pasa si alguna rama (por ejemplo, B) tiene compromisos que le faltan al repositorio remoto (github)? ¿Deberían fusionarse, rebasearse o ...?
  3. ¿Qué sucede si se encuentra en alguna rama (por ejemplo, C) y el directorio de trabajo y / o el índice se modifican pero no se confirman?
  4. ¿Qué sucede si el repositorio remoto tiene nuevas ramas agregadas ( A) y / o ramas eliminadas ( D)?

Si la respuesta a (1) es "porque en devhostrealidad no es 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 leerlo lentamente github ", entonces quieres un" espejo "en lugar de un repositorio" normal ". No debería tener un directorio de trabajo, y quizás tampoco debería aceptar inserciones, en cuyo caso las preguntas restantes simplemente desaparecen.

Si hay alguna otra respuesta, (2-4) se vuelve problemática.

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

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

Lo que se incluye en la ... code here ...sección depende de las respuestas a las preguntas (2-4).

torek
fuente
-5

Utilizar

git fetch

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

SzG
fuente
17
Pero eso no actualiza las ramas locales de su servidor de desarrollo ... solo actualiza las ramas de "origen" en esa carpeta git, que corresponden al repositorio github del autor de la pregunta.
ANeves
1
O, si desea mi versión del problema: quiero fusionar mi rama de trabajo con "master", y no con "origin / master of ssh: // bla bla bla". Hacer fetch actualizará origen / maestro, pero no maestro.
ANeves
-6

EDITAR: Use 'git pull' Recuperará todas las ramas del repositorio y también se actualizará a la última si la rama sale del sistema local solo para la rama actual. Nota: git pull es equivalente a fetch + merge que busca todas las ramas pero combina solo la rama actual.

Anuj Aneja
fuente
66
Mejor decir: pullrealiza una búsqueda (que, sí, recupera todo desde el control remoto) pero luego combina solo la rama actual .
torek
Sin ánimo de ofender con mi voto negativo, sé que lo que estás diciendo es correcto y real, y el OP de hecho solicitó confirmación sobre lo que hace (y le has dado esa explicación), pero no aborda el quid de lo que buscaba: ¿Hay alguna manera de actualizar una de sus sucursales locales a los últimos commits en su sucursal remota asociada sin tener que pagar primero la sucursal?
Gurce