tipos - git set upstream branch
¿Por qué necesito hacer `--set-upstream` todo el tiempo? (18)
Creo una nueva sucursal en Git:
git branch my_branch
Empujalo:
git push origin my_branch
Ahora digamos que alguien hizo algunos cambios en el servidor y quiero extraer de origin/my_branch
. Hago:
git pull
Pero me sale:
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 my_branch
en origin/my_branch
, entonces querría arrastrar origin/my_branch
en my_branch
? ¿Cómo puedo hacer que este sea el comportamiento predeterminado?
De alguna manera, volví a descubrirlo legit
debido a este problema (solo OS X). Ahora todo lo que uso cuando bifurco son estos dos comandos:
legit publish [<branch>]
Publica una rama especificada en el control remoto. (alias: pub
)
legit unpublish <branch>
Elimina la rama especificada del control remoto. (alias: unp
)
SublimeGit viene con soporte legit
por defecto, lo que hace que la rutina de bifurcación sea tan fácil como presionar Ctrl-b.
Debido a que git tiene la capacidad genial de empujar / tirar de diferentes ramas a diferentes repositorios "ascendentes". Incluso podría usar repositorios separados para empujar y tirar, en la misma rama. Esto puede crear un flujo distribuido de múltiples niveles, puedo ver que esto es útil en proyectos como el kernel de Linux. Git fue construido originalmente para ser utilizado en ese proyecto.
Como consecuencia, no hace suposiciones sobre qué repo debería rastrear su sucursal.
Por otro lado, la mayoría de las personas no usan git de esta manera, por lo que podría ser un buen caso para una opción predeterminada.
Git es generalmente de bajo nivel y puede ser frustrante. Sin embargo, hay GUIs y debería ser fácil escribir scripts de ayuda si aún desea usarlos desde el shell.
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.
Para aquellos que buscan un alias que funcione con git pull
, esto es lo que uso:
alias up="git branch | awk ''/^//* / { print /$2 }'' | xargs -I {} git branch --set-upstream-to=origin/{} {}"
Ahora cada vez que obtenga:
$ git pull
There is no tracking information for the current branch.
...
Solo corre:
$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull
Y eres bueno para ir
Para lo que vale la pena, si está intentando rastrear una rama que ya existe en el control remoto (por ejemplo, origen / somebranch) pero aún no lo ha comprobado localmente, puede 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.
Personalmente uso estos alias en bash
en el archivo ~ / .gitconfig
[alias]
pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"
y en el archivo ~ / .basehrc o ~ / .zshrc
alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
Por cierto, el acceso directo para empujar la rama actual a un control remoto con el mismo nombre:
$ git push -u origin HEAD
Puede configurar un alias realmente bueno que pueda manejar esto sin la sintaxis demasiado verbosa.
Tengo el siguiente alias en ~/.gitconfig
:
po = "!git push -u origin /"$(git rev-parse --abbrev-ref HEAD)/""
Después de realizar una confirmación en una nueva rama, puede empujar su nueva rama simplemente escribiendo el comando:
git po
Puede hacer que esto suceda con menos escritura. Primero, cambia la forma en que funciona tu empuje:
git config --global push.default current
Esto origin my_branch
el origin my_branch
, por lo que puedes hacer:
git push -u
Que creará la rama remota con el mismo nombre y la seguirá.
Puedes configurar el upstream más simple de dos maneras. Primero cuando crees la rama:
git branch -u origin/my-branch
o después de crear una rama, puede usar este comando.
git push -u origin my-branch
También puede bifurcar, desproteger y configurar en sentido 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
Puedes usar:
git config --global branch.autosetupmerge siempre
que vinculará la rama ascendente cada vez que cree o contrate una nueva rama.
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 enfocado en la rebase, pero no lo uses a menos que sepas lo que estás haciendo, ya que su comportamiento de pull se ajustará de manera predeterminada, lo que puede causar resultados extraños.
También puede indicar explícitamente a git pull qué rama remota debe extraer (como se menciona en el mensaje de error):
git pull <remote-name> <remote-branch>
Sin embargo, tenga cuidado con esto: si se encuentra en una rama diferente y realiza una extracción explícita, la ref. Espec. Que extraiga se fusionará con la rama en la que se encuentra.
También puedes hacer git push -u origin $(current_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, para pasar a la rama actual a una rama del mismo nombre (útil para un alias):
git push -u origin HEAD
Solo necesitas usar -u
una vez, y eso configura la asociación entre tu rama y la de origin
de la misma manera que git branch --set-upstream
.
Personalmente, creo que es bueno tener que establecer esa asociación explícitamente entre su sucursal y una en el control remoto. Es una pena que las reglas sean diferentes para git push
y git pull
.
1 Puede sonar tonto, pero a menudo me olvido de especificar la rama actual, asumiendo 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 resultó fácil equivocarse! Gracias a VonC por señalar que git 1.8.0 introduce la git branch --set-upstream-to
más obvia de git branch --set-upstream-to
, que se puede usar 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 elorigin/master
localorigin/master
para integrarlo con la rama actualmente seleccionada, lo que es muy poco probable a que se refiriera el usuario. La opción está en desuso; use la nueva--set-upstream-to
(con una opción corta y dulce-u
) en su lugar.
Usamos phabricator y no presionamos usando git. Tuve que crear un alias de bash que funcione en Linux / mac
vim ~/.bash_aliases
new_branch() {
git checkout -b "$1"
git branch --set-upstream-to=origin/master "$1"
}
salvar
source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
Usted puede simplemente
git checkout -b my-branch origin/whatever
en primer lugar. Si configura branch.autosetupmerge
o branch.autosetuprebase
(mi favorito) como always
(el valor predeterminado es true
), my-branch
rastreará automáticamente el origin/whatever
.
Ver git help config
.
Utilizo este alias de Git en lugar de copiar / pegar la sugerencia de Git cada vez: https://gist.github.com/ekilah/88a880c84a50b73bd306
Fuente copiada a continuación (agregue esto a su archivo ~/.gitconfig
):
[alias]
pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"
git branch --set-upstream-to=origin/master<branch_name>