¿Cómo evitar tener que hacer "git branch --setup-upstream" y, en su lugar, configurar automáticamente el seguimiento remoto?

Resuelto Ram Rachum asked hace 13 años • 30 respuestas

Creo una nueva rama en Git:

git branch my_branch

Empujalo:

git push origin my_branch

Ahora digamos que alguien hizo algunos cambios en el servidor y quiero extraerlos origin/my_branch. Sí:

git pull

Pero obtengo:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Aprendí que puedo hacerlo funcionar con:

git branch --set-upstream my_branch origin/my_branch

Pero ¿por qué necesito hacer esto para cada rama que creo? ¿No es obvio que si empujo my_branchhacia adentro origin/my_branch, entonces querría origin/my_branchentrar my_branch? ¿Cómo puedo hacer que este sea el comportamiento predeterminado?

Ram Rachum avatar May 22 '11 23:05 Ram Rachum
Aceptado

Git v2.37.1 y superior

Si está utilizando la versión mencionada o superior, puede utilizar esta nueva entrada de configuración para configurar automáticamente el seguimiento remoto:

git config --global push.autoSetupRemote true

Después de eso, cuando realiza git pushel seguimiento se configura automáticamente. No hay necesidad degit push -u origin my_branch


Un atajo, que no depende de recordar la sintaxis de git branch --set-upstream 1 , es hacer:

git push -u origin my_branch

... la primera vez que empujas esa rama. O bien, para enviar a la rama actual desde una rama del mismo nombre (útil para un alias):

git push -u origin HEAD

Solo necesita usarlo -uuna vez, y eso configura la asociación entre su sucursal y la originde la misma manera que git branch --set-upstreamlo hace.

Personalmente, creo que es bueno tener que configurar explícitamente esa asociación entre su sucursal y una en el control remoto. Es una pena que las reglas sean diferentes para git pushygit pull .


1 Puede parecer una tontería, pero muy frecuentemente me olvido de especificar la rama actual, suponiendo que sea la predeterminada; no lo es, y los resultados son muy confusos.

Actualización 11/10/2012 : ¡Aparentemente no soy la única persona a la que le resultó fácil equivocarse! Gracias a VonC por señalar que git 1.8.0 introduce lo más obvio git branch --set-upstream-to, que puede usarse de la siguiente manera, si estás en la rama my_branch:

git branch --set-upstream-to origin/my_branch

...o con la opción corta:

git branch -u origin/my_branch

Este cambio y su razonamiento se describen en las notas de la versión de git 1.8.0, versión candidata 1 :

Fue tentador decir git branch --set-upstream origin/master, pero eso le dice a Git que organice la sucursal local origin/masterpara integrarla con la sucursal actualmente desprotegida, lo cual es muy poco probable que sea lo que quiso decir el usuario. La opción está en desuso; utilice la nueva opción --set-upstream-to(con una breve y sencilla -u) en su lugar.

Mark Longair avatar May 22 '2011 16:05 Mark Longair

Puedes hacer que esto suceda escribiendo menos. Primero, cambia la forma en que funciona tu push:

git config --global push.default current

Esto inferirá la origin my_branchpieza, por lo que puedes hacer:

git push -u

Lo que creará la rama remota con el mismo nombre y la rastreará.

Zamith avatar Apr 08 '2014 10:04 Zamith

Este es mi uso más común para The Fuck .

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

Además, es divertido escribir malas palabras en tu terminal.

Tamlyn avatar Nov 15 '2017 17:11 Tamlyn
git config --global push.autoSetupRemote true

El OP pregunta:

Aprendí que puedo hacerlo funcionar con:

git branch --set-upstream my_branch origin/my_branch

Pero ¿por qué necesito hacer esto para cada rama que creo?

No es necesario configurar el flujo ascendente todo el tiempo.
Ya no (once años después).

Con Git 2.37 (tercer trimestre de 2022), a git config --global push.autoSetupRemote truese encargará de eso por usted.

Consulte el compromiso 05d5775 , el compromiso 8a649be , el compromiso bdaf1df (29 de abril de 2022) de Tao Klerks ( TaoK) .
(Fusionado por Junio ​​C Hamano -- gitster-- en el compromiso f49c478 , 26 de mayo de 2022)

push: nueva opción de configuración " push.autoSetupRemote" admite " simple" push

Firmado por: Tao Klerks

En algunos " simple" flujos de trabajo centralizados, los usuarios esperan que los nombres de las sucursales de seguimiento remoto coincidan con los nombres de las sucursales locales.
" git push" ( man ) envía a la versión/instancia remota de la rama, y ​​" git pull" ( man ) extrae cualquier cambio a la rama remota (cambios realizados por el mismo usuario en otro lugar o por otros usuarios).

Esta expectativa está respaldada por la push.defaultopción predeterminada " simple", que rechaza una inserción predeterminada para un nombre de sucursal de seguimiento que no coincide, y por la nueva branch.autosetupmergeopción, " simple", que solo configura el seguimiento remoto para sucursales remotas con el mismo nombre.

Cuando el usuario crea una nueva rama y aún no se ha enviado (y push.defaultno está configurada en " current"), se le muestra al usuario un The current branch %s has no upstream brancherror " " e instrucciones sobre cómo enviar y agregar seguimiento.

Este error es útil porque seguir el consejo una vez por rama "resuelve" el problema para esa rama para siempre, pero es inconveniente porque para el flujo de trabajo centralizado "simple", esto siempre es lo correcto, por lo que sería mejor simplemente hazlo.

Admite este flujo de trabajo con una nueva configuración, push.autoSetupRemoteque provocará una inserción predeterminada, cuando no hay una rama de seguimiento remoto configurada, para enviar al mismo nombre en el control remoto y --set-upstream.

También agregue una sugerencia que ofrezca esta nueva opción cuando The current branch %s has no upstream branchse encuentre el error " " y agregue las pruebas correspondientes.

La nueva pista es:

Para que esto suceda automáticamente para las sucursales sin seguimiento
ascendente, consulte ' push.autoSetupRemote' en 'git help config'

git configahora incluye en su página de manual :

push.autoSetupRemote

Si se establece en " true", se asume --set-upstreamla inserción predeterminada cuando no existe seguimiento ascendente para la rama actual;

Esta opción surte efecto con push.defaultlas opciones ' simple', ' upstream' y ' current'.

Es útil si, de forma predeterminada, desea enviar nuevas ramas al control remoto predeterminado (como el comportamiento de ' push.default=current') y también desea configurar el seguimiento ascendente.
Los flujos de trabajo que más probablemente se beneficiarán de esta opción son los " simpleflujos de trabajo centrales donde se espera que todas las sucursales tengan el mismo nombre en el control remoto.

VonC avatar May 27 '2022 07:05 VonC