¿Cómo evitar tener que hacer "git branch --setup-upstream" y, en su lugar, configurar automáticamente el seguimiento remoto?
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_branch
hacia adentro origin/my_branch
, entonces querría origin/my_branch
entrar my_branch
? ¿Cómo puedo hacer que este sea el comportamiento predeterminado?
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 push
el 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 -u
una vez, y eso configura la asociación entre su sucursal y la origin
de la misma manera que git branch --set-upstream
lo 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 push
ygit 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 localorigin/master
para 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.
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_branch
pieza, por lo que puedes hacer:
git push -u
Lo que creará la rama remota con el mismo nombre y la rastreará.
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.
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 true
se 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
" pushFirmado 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.default
opción predeterminada "simple
", que rechaza una inserción predeterminada para un nombre de sucursal de seguimiento que no coincide, y por la nuevabranch.autosetupmerge
opció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.default
no está configurada en "current
"), se le muestra al usuario unThe current branch %s has no upstream branch
error " " 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.autoSetupRemote
que 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 branch
se 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 config
ahora incluye en su página de manual :
push.autoSetupRemote
Si se establece en "
true
", se asume--set-upstream
la inserción predeterminada cuando no existe seguimiento ascendente para la rama actual;Esta opción surte efecto con
push.default
las 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 "simple
flujos de trabajo centrales donde se espera que todas las sucursales tengan el mismo nombre en el control remoto.