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.

Elad
fuente

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.

ceztko
fuente
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.

Mahesh
fuente
¿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
Najor
fuente
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'
theodor
fuente
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.

Ryan Rebo
fuente
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
Faruk Sahin
fuente
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
}
Ryan Stewart
fuente
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.

Bantak
fuente