Git: empuje el acceso directo de la rama actual


365

¿Hay un atajo para decirle a Git que empuje la rama de seguimiento actual al origen?
Nota: Sé que puedo cambiar el comportamiento de inserción predeterminado , pero estoy buscando una solución ad-hoc que no cambie el comportamiento predeterminado.

Por ejemplo, supongamos que estoy en la rama feature/123-sandbox-testsque estaría usando

git push origin feature/123-sandbox-tests

lo cual es tedioso Estoy buscando un atajo, algo como

git push origin current

donde git sabe que es la corriente feature/123-sandbox-tests.


Editar : a partir de la versión 2.0, el comportamiento predeterminado de git ha cambiado a un comportamiento más intuitivo, que es lo que quería lograr. Vea esta pregunta SO para más detalles.

Edición 2 : la respuesta de ceztko es la mejor respuesta, ya que permite impulsar la rama actual, independientemente de la configuración.

Respuestas:


703

Según la git pushdocumentación:

git push origin HEAD
    A handy way to push the current branch to the same name on the remote.

Entonces creo que lo que necesitas es git push origin HEAD. También puede ser útil git push -u origin HEADconfigurar la información de seguimiento ascendente en la sucursal local, si aún no ha llegado al origen.


11
Prefiero esto a configurar push.default a simple o actual, porque diferentes máquinas pueden tener diferentes configuraciones. Puede acostumbrarse a git pushempujar solo la rama actual, pero en otras máquinas, puede presionar accidentalmente todas las ramas coincidentes.
wisbucky

1
@wisbucky Tengo varios alias, incluidos co, por lo que si tuviera que intentar incluso desplegar y luego verificar el código sin mi ~/.gitconfigarchivo en esa VM, lo sabré de inmediato. Eso me permite sentirme bastante seguro acerca de cambiar el valor predeterminado de inserción a upstream.
Damon

99
Es interesante que esto no funcione solo con @, que está documentado como un alias válido para HEAD. (p git push -u origin @. ej. )
void.pointer

197

Puede configurar git para empujar a la rama actual usando el siguiente comando

git config --global push.default current

entonces solo haz

git push 

esto empujará el código a su rama actual.


¿Tiene sentido agregar push = refs/heads/current:refs/for/master/currenta una sección 'remota' en .git / config? Es decir, ¿es "actual" una palabra especial aquí? ¿O buscará una rama llamada "actual"?
David Doria

66
@DavidDoria 'current' no es una rama nombrada aquí.
Mahesh

¡Lo mejor es git push -u origin feature_branch_nameconfigurar upstream / tracking! Si usa un repositorio remoto al menos.
Flo

40

Debería echar un vistazo a una pregunta similar en Comportamiento predeterminado de "git push" sin una rama especificada

Básicamente, explica cómo configurar el comportamiento predeterminado para impulsar la rama actual que se está ejecutando git push. Probablemente lo que necesitas es:

git config --global push.default current

Otras opciones:

  • nada : no empujes nada
  • coincidencia : empuje todas las ramas coincidentes
  • upstream / tracking : empuje la rama actual a lo que sea que esté rastreando
  • current : empuja la rama actual

11

Yo uso ese alias en mi configuración .bashrc

alias gpb='git push origin `git rev-parse --abbrev-ref HEAD`'

En el comando $gpbtoma el nombre de la rama actual y lo empuja al origen.

Aquí están mis otros alias:

alias gst='git status'
alias gbr='git branch'
alias gca='git commit -am'
alias gco='git checkout'

8

Por lo que vale, el último atajo:

En mi .bash_profiletengo alias push="git push origin HEAD", así que cuando el tipo i pushSé que estoy empujando a la rama actual estoy.


6

Si está utilizando git 1.7.x, puede ejecutar el siguiente comando para configurar la rama de seguimiento remoto.

git branch --set-upstream feature/123-sandbox-tests origin/feature/123-sandbox-tests

Luego, simplemente puede usar git pushpara empujar todos los cambios. Para obtener una respuesta más completa, consulte la respuesta aceptada a una pregunta similar aquí.

Si solo desea impulsar la rama actual con el comando de inserción, puede cambiar el comportamiento de inserción hacia arriba:

git config --global push.default upstream

Gracias, sin embargo, en este caso, ¿TODAS las ramas de seguimiento no se enviarían a origen?
Elad

He modificado la respuesta, por favor vea el enlace, la respuesta está más completa allí.
Faruk Sahin

Nuevamente, el problema es que todas las ramas que están rastreando están siendo empujadas de esa manera. Como escribí en mi pregunta, la rama es una rama rastreada en primer lugar, por lo que creo que configurar la rama ascendente como sugirió es redundante. ¿O estoy equivocado?
Elad

Luego puede configurar git para empujar solo la rama actual cambiando el comportamiento de git push. git config --global push.default upstreamconfigurará el comportamiento de empuje para empujar solo la rama actual.
Faruk Sahin

5

La forma más simple: correr git push -u origin feature/123-sandbox-testsuna vez. Eso empuja la rama de la forma en que está acostumbrado a hacerlo y también establece la información de seguimiento ascendente en su configuración local. Después de eso, solo puede git pushempujar las ramas rastreadas a sus controles remotos aguas arriba.

También puede hacer esto en la configuración usted mismo configurando branch.<branch name>.mergeel nombre de la rama remota (en su caso, el mismo que el nombre local) y, opcionalmente, branch.<branch name>.remoteel nombre del control remoto al que desea enviar (por defecto el origen). Si busca en su configuración, lo más probable es que ya haya uno de estos conjuntos master, por lo que puede seguir ese ejemplo.

Finalmente, asegúrese de considerar la push.defaultconfiguración. El valor predeterminado es "coincidencia", que puede tener resultados no deseados e inesperados. La mayoría de las personas que conozco encuentran que "upstream" es más intuitivo, lo que empuja solo a la rama actual.

Los detalles sobre cada una de estas configuraciones se pueden encontrar en la página de manual de git-config .

Pensándolo bien, al releer tu pregunta, creo que sabes todo esto. Creo que lo que realmente estás buscando no existe. ¿Qué tal una función bash algo como (no probado):

function pushCurrent {
  git config push.default upstream
  git push
  git config push.default matching
}

1

Con la ayuda de la respuesta de ceztko, escribí esta pequeña función auxiliar para hacerme la vida más fácil:

function gpu()
{
    if git rev-parse --abbrev-ref --symbolic-full-name @{u} > /dev/null 2>&1; then
        git push origin HEAD
    else
        git push -u origin HEAD
    fi
}

Empuja la rama actual al origen y también establece la rama de seguimiento remoto si aún no se ha configurado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.