Pregunta ¿Por qué tengo que hacer `--set-upstream` todo el tiempo?


Creé una nueva sucursal en Git:

git branch my_branch

Empujalo:

git push origin my_branch

Ahora di que alguien hizo algunos cambios en el servidor y quiero sacar de origin/my_branch. Hago:

git pull

Pero entiendo:

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é tengo que hacer esto para cada rama que creo? ¿No es obvio que si presiono my_branch dentro origin/my_branch, entonces me gustaría tirar origin/my_branch dentro my_branch? ¿Cómo puedo hacer que este sea el comportamiento predeterminado?


1057
2018-05-22 16:39


origen


Respuestas:


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. Solo necesita hacerlo una vez, y eso configura la asociación entre su sucursal y la de origin de la misma forma como git branch --set-upstream hace.

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


1 Puede sonar tonto, pero muy a menudo me olvido de especificar la rama actual, suponiendo que es la predeterminada - no lo es, y los resultados son más confusos :)

Actualización 2012-10-11: ¡Aparentemente, no soy la única persona a la que le resulta fácil equivocarse! Gracias a VonC para señalar que git 1.8.0 introduce el más obvio git branch --set-upstream-to, que se puede usar de la siguiente manera, si estás en la sucursal 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 para git 1.8.0, release candidate 1:

Fue tentador decir git branch --set-upstream origin/master, pero eso le dice a Git que organice la sucursal local origin/master para integrarse con la rama actualmente desprotegida, lo que es muy poco probable que el usuario haya querido decir. La opción está en desuso usa el nuevo --set-upstream-to (con un corto y dulce -u) opción en su lugar.


1199
2018-05-22 16:58



Puede hacer que esto suceda con menos tipeo. Primero, cambie la forma en que funciona su inserción:

git config --global push.default current

Esto inferirá el origin my_branch parte, así puedes hacer:

git push -u

Que ambos crearán la rama remota con el mismo nombre y lo rastrearán.


962
2018-04-08 10:14



Puedes simplemente

git checkout -b my-branch origin/whatever

en primer lugar. Si configura branch.autosetupmerge o branch.autosetuprebase (mi favorito) a always (por defecto es true), my-branch seguirá automáticamente origin/whatever.

Ver git help config.


70
2018-03-17 20:04



Puede configurar upstream más simple de dos maneras. Primero cuando creas la rama:

git branch -u origin/my-branch

o después de haber creado una rama, puede usar este comando.

git push -u origin/my-branch

También puede bifurcar, verificar y establecer el flujo ascendente en un solo comando:

git checkout -b my-branch -t origin/my-branch

Mi preferencia personal es hacer esto en un comando de dos pasos:

git checkout -b my-branch
git push -u origin/my-branch

44
2018-03-17 13:28



Puedes usar:

git config --global branch.autosetupmerge always

que vinculará la rama ascendente cada vez que crees o compras una nueva sucursal.

Ver https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Esto también funciona con autosetuprebase, si sigues un flujo de trabajo más centrado en la rebase, pero no lo uses a menos que sepas lo que estás haciendo, ya que de manera predeterminada restablecerá tu comportamiento de extracción a rebase, lo que puede ocasionar resultados extraños.


36
2018-04-28 20:05



Por cierto, el atajo para empujar la rama actual a un control remoto con el mismo nombre:

$ git push -u origin HEAD

29
2017-09-15 14:20



Este es mi uso más común para La mierda.

$ 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.


27
2017-11-15 17:22



git branch --set-upstream-to=origin/master<branch_name>

11
2018-06-30 04:39



También puede indicar explícitamente a git pull qué rama remota extraer (como se menciona en el mensaje de error):

git pull <remote-name> <remote-branch>

Tenga cuidado con esto, sin embargo: si estás en una rama diferente y realizas una extracción explícita, ¡el refspec que hagas se fusionará en la rama en la que estás!


8
2018-03-20 14:41



Por lo que vale, si estás tratando de rastrear una rama que ya existe en el control remoto (por ejemplo, origen / alguna rama) pero aún no la has verificado localmente, puedes hacer lo siguiente:

$ git checkout --track origin/somebranch

Nota: '-t' es la versión abreviada de la opción '--track'.

Esto establece la misma asociación desde el principio.


8
2017-12-08 16:11



Uso este alias de Git en lugar de copiar / pegar la sugerencia de Git todo el tiempo: https://gist.github.com/ekilah/88a880c84a50b73bd306

Fuente copiada a continuación (agréguela a su ~/.gitconfig archivo):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

7
2017-08-27 23:10