¿Cómo se puede extraer solo la rama actual?

81

¿Hay alguna forma de configuración para configurar esto sin tener que especificar qué rama?

qodeninja
fuente

Respuestas:

82

Git ya solo extrae la rama actual. Si ha configurado una rama como una rama de seguimiento, no es necesario que especifique la rama remota. git branch --set-upstream localbranch reponame/remotebranchestablecerá la relación de seguimiento. Luego emite git pull [--rebase]y solo se actualizará esa rama.

Por supuesto, se actualizarán todas las sucursales de seguimiento remoto y todas las referencias del control remoto, pero solo se modificará su sucursal de seguimiento local.

Útil alias de Bash para reducir la escritura de esta operación común:

# Add an alias to pulling latest git changes into your same branch
alias pullhead='git pull origin $(git rev-parse --abbrev-ref HEAD)'

Función Powershell que hace lo mismo:

Function pullhead {
    $cur_head="$(git rev-parse --abbrev-ref HEAD)"
    & git pull origin ${cur_head}
}
Seth Robertson
fuente
así es, y quizás un poco extraño porque "git push" (por defecto) intenta empujar todas las ramas (con el mismo nombre remoto).
Alessandro De Simone
2
@AlessandroDs Bueno, configuré push.default en upstream solo por esa razón. El nuevo valor predeterminado de push.default es "simple", que de nuevo solo actualiza la rama actual, por lo que es mucho más paralelo a lo que hace pull.
Seth Robertson
1
@Danjah: Todos los cambios se extraen del repositorio remoto (en ramas de seguimiento remoto, por ejemplo, origen / origen maestro / foo, etc.). Si está registrado en una sucursal local con un upstream definido, solo se actualizará esa sucursal local. Si está registrado en una sucursal local sin un flujo ascendente, debe especificar más información o configurar el flujo ascendente. No intente modificar un pago no local, cree una sucursal local y continúe. Si desea reducir lo que transfiere, puede actualizar la especificación de referencia de su control remoto en su configuración de git local.
Seth Robertson
1
¿Existe una forma incorporada de no actualizar todas las referencias solo para recuperar la rama actual?
Aditya MP
1
@aditya menon: No es fácil. Debería actualizar refspec (por ejemplo, git config remote.origin.fetch) para obtener solo las referencias específicas (ramas, etiquetas, etc.) que desee. Consulte stackoverflow.com/questions/15507264/… para ver ejemplos más específicos.
Seth Robertson
61

Solo lo hice de esta manera:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

o

git pull origin $(git rev-parse --abbrev-ref HEAD)

Esto extrae la rama actual git branchy extrae esa rama del origen remoto.

Tenga en cuenta que, como dijo Seth Robertson, cuando no se dan argumentos, solo se modifica la rama actual, pero se obtienen todas las ramas remotas. No quiero buscar todas las ramas remotas, así que lo hice de esta manera.

ayke
fuente
3
git branchen realidad, no debería analizarse para obtener información de sucursales. Esa información está disponible al git rev-parsehacer el comando:git pull origin $(git rev-parse --abbrev-ref HEAD)
Paul DelRe
@ayke Agregué la respuesta de Paul DelRe a la suya, ya que también funcionó, espero que a ambos no les importe
Timo Huovinen
1
Simplemente curioso: ¿Cuál es la diferencia entre un simple "git pull" (habiendo comprobado la rama que quiero extraer) y tu sugerencia? Su sustitución de comando da como resultado git pull origin <current-branch>cuál es el predeterminado de todos modos, ¿no es así? ¿Está insinuando que las otras ramas remotas (por ejemplo, origen / otra rama, etc.) no se actualizan, por lo que se reduce el tráfico?
Peter - Reincorpora a Monica el
Respondí esto hace años, realmente ya no lo sé. Probablemente deberías ir con la respuesta aceptada ...
ayke
@ PeterA.Schneider Si solo escribe git pull, podría terminar con un mensaje como There is no tracking information for the current branch. Please specify which branch you want to merge with.. Entonces siempre terminas escribiendo git pull origin my-feature-branch. Realmente me gustaría saber cómo llega esta situación de que no hay información de seguimiento.
Alfe
18

ACTUALIZAR

La respuesta anterior que agregué ya no funciona: /. Pero después de recibir algunos votos positivos sobre la versión PUSH que coloqué, para mí significa que esta respuesta en realidad está ayudando a alguien que termina viniendo aquí desde los motores de búsqueda, así que guardaré esta respuesta.

Prueba esto para la nueva versión de git:

$ git config --global push.default current
Bruno Casali
fuente
9
No creo que exista pull.default. Consulte git-scm o kernel.org .
Mort
2
Si. git 2.3.4 en Linux recupera todas las ramas incluso con lo anterior pull.default=current. Veo que mi git clonetambién se agregó por defecto, remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*pero eso es bastante estándar.
Mort
6
No hay ninguna pull.defaultvariable de configuración. Poner eso en tu configuración de git no hará nada.
David Sanders
5
La pregunta trata sobre git pull, y la respuesta contiene git push con muchos votos positivos. Esto es engañoso @BrunoCasali ¿Por qué editaste tu respuesta y la eliminaste si funcionó para ti? Si se da cuenta de que la respuesta es incorrecta, elimínela en lugar de guardarla con información irrelevante para mantener los votos a favor.
TJ
5

Sí, hay una configuración que se puede cambiar .gitconfig, por ejemplo:

[push]
  default = current

lo que empujaría a la rama actual para actualizar una rama con el mismo nombre en el extremo receptor.

Corregido por:

git config --global --get push.default

Ver: git-config .

Kenorb
fuente
3

La --set-upstreambandera está obsoleta y se eliminará. Por lo tanto, use --tracko--set-upstream-to

Ejemplo: si desea configurar la información de seguimiento para esta rama, puede hacerlo con:

git branch --set-upstream-to=<remote>/<branch> develop
biniam
fuente
Puede que esté obsoleto (¿fuente?), Pero --set-upstream-to=git lo sigue mencionando cuando no conoce tu información de seguimiento. Sin mención de desaprobación.
Adrien
@AdrienGiboire Aquí hay información sobre la desaprobación: jira.atlassian.com/browse/SRCTREEWIN-588
biniam
0

Aquí hay un alias de git que no asume que el control remoto es originy maneja si la rama no está rastreando un control remoto.

pullh = "!f() { set -e; set -o pipefail; arr=($(git rev-parse --abbrev-ref @{u} | sed 's/\\//\\n/')); git pull ${arr[0]} ${arr[1]}; }; f"

(Descargo de responsabilidad: soy un novato en bash y lo anterior probablemente podría simplificarse mucho).

Scobi
fuente