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 retirarlos 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 hacer que funcione 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 origin/my_branch
, a continuación, me gustaría tirar origin/my_branch
hacia my_branch
? ¿Cómo puedo hacer que este sea el comportamiento predeterminado?
git
git-branch
Ram Rachum
fuente
fuente
branch.autosetupmerge
significa que la configuración ascendente para una nueva rama solo se establece automáticamente cuando se crea una rama desde una rama de seguimiento remoto (por ejemplo<remote-name>/<branch-name>
) (consulte git-config (1) ). Probablemente esté creando sus sucursales a partir de sucursales locales existentes. Si está bifurcando directamente desde la punta de una bifurcación remota (a pesar de estar en una bifurcación local), puede usargit branch my_branch <remote-name>/<branch-name>
para configurar automáticamente la configuración ascendente.--set-upstream
opción está en desuso. Deberías usar--track
o en su--set-upstream-to
lugar.--set-upstream
está en desuso, ¿quizás los desarrolladores de git deberían eliminarlo del mensaje de ayuda que se muestra cuando se ejecutagit push
sin opciones y no se establece ningún flujo ascendente?git branch --set-upstream
está en desuso.git push --set-upstream
no es.Respuestas:
Un atajo, que no depende de recordar la sintaxis para
git branch --set-upstream
1 es hacer:... la primera vez que empujas esa rama. O, para pasar a la rama actual a una rama del mismo nombre (útil para un alias):
Solo necesita usar
-u
una vez, y eso establece la asociación entre su rama y laorigin
de la misma manera que logit 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 diferentes para
git push
ygit pull
.1 Puede sonar tonto, pero con frecuencia olvido especificar la rama actual, suponiendo que sea la predeterminada, no lo es, y los resultados son muy 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 presenta lo más obvio
git branch --set-upstream-to
, que puede usarse de la siguiente manera, si está en la ramamy_branch
:... o con la opción corta:
Este cambio y su razonamiento se describen en las notas de la versión de git 1.8.0, versión candidata 1 :
fuente
-u
primera vez que presiona, puede volver a ejecutar el comando con esa bandera y comenzará a seguir.alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
Puede hacer que esto suceda con menos tipeo. Primero, cambie la forma en que funciona su empuje:
Esto inferirá la
origin my_branch
parte, por lo que puede hacer:Lo cual creará la rama remota con el mismo nombre y la rastreará.
fuente
origin
ejecutegit push -u
para una rama recién creada en un repositorio recién creado? ¿Es la suposición de que el repositorio ha sido clonado, por lo que la rama actual tiene su control remoto configuradoorigin
?pull
tendrás que especificar desde dónde. Los-u
conjuntos de hasta el seguimiento de la rama entre el origen y tu repositorio local.push
, lo que anula todo el punto de esta pregunta. En resumen, no hay una buena respuesta. Que los desarrolladores de Git insistan en retener esta experiencia de usuario incómoda (AUX) frente al disenso generalizado de la comunidad es ... esclarecedor. Y desalentador. (Mayormente desalentador.)Puedes simplemente
en primer lugar. Si establece
branch.autosetupmerge
obranch.autosetuprebase
(mi favorito) enalways
(predeterminado estrue
),my-branch
se realizará un seguimiento automáticoorigin/whatever
.Ver
git help config
.fuente
git checkout -t origin/whatever
, que también eligewhatever
como el nuevo nombre de rama. ¡Muy conveniente!-u
/--set-upstream
.git checkout -t origin/whatever
no funciona para mí cuando intento crear una nueva sucursal:fatal: Cannot update paths and switch to branch 'whatever' at the same time.
git checkout -b my-branch origin/whatever
también tiene el mismo error (estoy tratando de crear una nueva rama que no existe en local o remota):fatal: Cannot update paths and switch to branch 'whatever' at the same time.
Este es mi uso más común para The Fuck .
Además, es divertido escribir palabras groseras en su terminal.
fuente
Puede configurar upstream más simple de dos maneras. Primero cuando creas la rama:
o después de haber creado una rama, puede usar este comando.
También puede ramificar, verificar y configurar en un solo comando:
Mi preferencia personal es hacer esto en un comando de dos pasos:
fuente
git branch -u origin/my-branch
, puedo corrergit pull
para bajar mis cambios.git checkout -t origin/my-branch
prescindir de-b my-branch
, simplemente deducirá automáticamentemy-branch
el nombre de la sucursal local. Sin embargo, como mencionó @Spongman, este comando no funciona siorigin/my-branch
no existe primero.git push -u origin/my-branch
me falla confatal: 'origin/my-branch' does not appear to be a git repository
. Esto funciona:git push -u origin my-branch
Puedes usar:
que vinculará la rama ascendente cada vez que cree o finalice una nueva rama.
Ver https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/
Esto también funciona
branch.autosetuprebase
si sigue un flujo de trabajo más centrado en rebase, pero no lo use a menos que sepa lo que está haciendo, ya que su comportamiento de extracción cambiará a rebase, lo que puede causar resultados extraños.fuente
--set-upstream
mensajemaster
. 2. Corregit checkout -b new_branch
. 3. Agregue un commit a esa rama. 4git push origin new_branch
.. Esto empuja ese compromiso con lamaster
rama en origen (en lugar de una nueva rama en origen llamadanew_branch
).Por cierto, el atajo para empujar la rama actual a un control remoto con el mismo nombre:
fuente
Yo personalmente uso estos siguientes alias en bash
en el archivo ~ / .gitconfig
y en el archivo ~ / .bashrc o ~ / .zshrc
fuente
git pushup
que siempre empuja la rama actual al origen. Siempre puedo usar engit pushup
lugar degit push
👍Si lo siguiente no funciona:
También debe actualizar la configuración local de su proyecto, ya que es posible que su proyecto tenga configuraciones locales de git:
fuente
También puede decirle explícitamente a git pull qué rama remota 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 especificación de referencia que extraiga se fusionará con la rama en la que se encuentra.
fuente
Por lo que vale, si está intentando rastrear una rama que ya existe en el control remoto (por ejemplo, origen / alguna rama) pero aún no la ha extraído localmente, puede hacer lo siguiente:
Nota: '-t' es la versión abreviada de la opción '--track'.
Esto establece la misma asociación desde el principio.
fuente
git checkout somebranch
es equivalente.git fetch
inmediatamente?git fetch
ogit pull
. Sin embargo, nunca he encontrado que eso sea un problema.fuente
Uso 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
~/.gitconfig
archivo):fuente
Puede configurar un alias realmente bueno que pueda manejar esto sin la sintaxis demasiado detallada.
Tengo el siguiente alias en
~/.gitconfig
:Después de realizar una confirmación en una nueva rama, puede empujar su nueva rama simplemente escribiendo el comando:
fuente
po
?push origin
? ¿Qué pasa si esto se ejecuta varias veces?git push -f
alias configuradogit pf
, así que lo uso una vez que el origen ya se ha presionado.HEAD
Para aquellos que buscan un alias que funcione
git pull
, esto es lo que uso:Ahora cada vez que obtienes:
Solo corre:
Y eres bueno para ir
fuente
Porque git tiene la capacidad genial de empujar / jalar diferentes ramas a diferentes repositorios "aguas arriba". Incluso podría usar repositorios separados para empujar y tirar, en la misma rama. Esto puede crear un flujo distribuido de varios niveles, puedo ver que esto es útil en proyectos como el kernel de Linux. Git fue originalmente construido para ser usado en ese proyecto.
Como consecuencia, no supone qué repositorio debe 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 generalmente es de bajo nivel y puede ser frustrante. Sin embargo, hay interfaces gráficas de usuario y debería ser fácil escribir scripts de ayuda si todavía desea usarlo desde el shell.
fuente
También puedes hacer
git push -u origin $(current_branch)
fuente
Me re-descubrí
legit
por este problema (solo OS X). Ahora todo lo que uso cuando ramifico son estos dos comandos:legit publish [<branch>]
Publica la rama especificada en el control remoto. (alias:pub
)legit unpublish <branch>
Elimina la rama especificada del control remoto. (alias:unp
)SublimeGit viene con
legit
soporte por defecto, lo que hace que toda la rutina de ramificación sea tan fácil como presionar Ctrl-b.fuente
Usamos phabricator y no empujamos usando git. Tuve que crear bash alias que funciona en Linux / mac
salvar
fuente
Aquí hay un alias bash para git push que es seguro de ejecutar para cada empuje y cambiará automáticamente entre la configuración aguas arriba para el primer empuje y luego hacer los empujes normales después de eso.
Publicación original
fuente