para - git windows xp
Comportamiento predeterminado de "git push" sin una rama especificada (12)
(Marzo de 2012)
Cuidado: la política de " matching
" predeterminada puede cambiar pronto
(A veces después de git1.7.10 +) :
Consulte " Discutir: ¿qué debe hacer" git push "cuando no dice qué presionar? "
En la configuración actual (es decir,
push.default=matching
),git push
sin argumento empujará todas las ramas que existen localmente y remotamente con el mismo nombre .
Esto suele ser apropiado cuando un desarrollador empuja a su propio repositorio público, pero puede ser confuso, si no peligroso, al usar un repositorio compartido.La propuesta es cambiar el valor predeterminado a ''
upstream
'' , es decir, empujar solo la rama actual, y empujarla a la rama de la que tiraría.
Otro candidato es ''current
''; esto empuja solo la rama actual a la rama remota del mismo nombre.Lo que se ha discutido hasta ahora se puede ver en este hilo:
http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694
Las discusiones relevantes anteriores incluyen:
- http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541
- http://thread.gmane.org/gmane.comp.version-control.git/166743
Para unirse a la discusión, envíe sus mensajes a: [email protected]
Utilizo el siguiente comando para enviar a mi rama remota:
git push origin sandbox
Si yo digo
git push origin
¿eso empuja cambios en mis otras sucursales también, o solo actualiza mi rama actual? Tengo tres ramas: master
, production
y sandbox
.
La documentación de git push
no es muy clara al respecto, por lo que me gustaría aclarar esto para siempre.
¿Qué ramas y controles remotos hacen los siguientes comandos de git push
actualizan exactamente?
git push
git push origin
origin
arriba es un control remoto.
Entiendo que git push [remote] [branch]
solo enviará esa rama al control remoto.
Acabo de ingresar mi código a una rama y lo empujé a github, así:
git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments
Acabo de poner esto en mi sección de alias de .gitconfig y me encanta cómo funciona:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
Empujará la rama actual al origen con git pub
u otro repositorio con git pub repo-name
. Sabroso.
Aquí hay una información muy útil y útil sobre Git Push : Git Push: solo la punta
El uso más común de git push es enviar los cambios locales a su repositorio público anterior. Suponiendo que el upstream es un remoto llamado "origen" (el nombre remoto predeterminado si su repositorio es un clon) y la rama que se actualizará a / desde se llamará "master" (el nombre de la rama predeterminada), esto se hace con: git push origin master
git push origin
empujará los cambios de todas las ramas locales a las ramas coincidentes con el origen remoto.
git push origin master
empujará los cambios desde la rama maestra local a la rama maestra remota.
git push origin master:staging
impulsará los cambios de la rama maestra local a la rama de la puesta en marcha remota si existe.
En lugar de usar alias, prefiero crear scripts git-XXX para poder controlarlos con más facilidad (todos nuestros desarrolladores tienen un determinado directorio controlado por fuente en su camino para este tipo de cosas).
Este script (llamado git-setpush
) establecerá el valor de configuración para el valor de remote.origin.push
en algo que solo empujará la rama actual:
#!/bin/bash -eu
CURRENT_BRANCH=$(git branch | grep ''^/*'' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH
echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF
nota, ya que estamos usando Gerrit
, establece el objetivo en refs/for/XXX
para ingresar a una rama de revisión. También asume que el origen es su nombre remoto.
Invocarlo después de revisar una rama con
git checkout your-branch
git setpush
Obviamente, podría adaptarse para hacer el pago, pero me gustan los scripts para hacer una cosa y hacerlo bien
He agregado las siguientes funciones en mi archivo .bashrc para automatizar estas tareas. Hace git push / git pull + nombre de la rama actual.
function gpush()
{
if [[ "x$1" == "x-h" ]]; then
cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
else
set -x
local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
git push ${bname}
set +x
fi
}
function gpull()
{
if [[ "x$1" == "x-h" ]]; then
cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
else
set -x
local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
git pull ${bname}
set +x
fi
}
Puede cambiar ese comportamiento predeterminado en su .gitconfig
, por ejemplo:
[push]
default = current
Para verificar la configuración actual, ejecute:
git config --global --get push.default
Puede configurar el comportamiento predeterminado para su git con push.default
git config push.default current
o si tienes muchos repositorios y quieres lo mismo para todos entonces
git config --global push.default current
La corriente en esta configuración significa que, de forma predeterminada, solo empujará la rama actual cuando haga git push
Otras opciones son:
- nada: no empujar nada
- coincidencia: empujar todas las ramas coincidentes (predeterminado)
- seguimiento: empuje la rama actual a lo que sea seguimiento
- actual: empuje la rama actual
ACTUALIZACIÓN - NUEVA FORMA DE HACER ESTO
A partir de Git 1.7.11 haga lo siguiente:
git config --global push.default simple
Esta es una nueva configuración introducida que funciona de la misma manera que la actual, y se hará predeterminada a git desde v 2.0 según los rumores.
Puede controlar el comportamiento predeterminado configurando push.default en su configuración de git. De la documentación de git-config (1) :
push.default
Define la acción que debe realizar git push si no se proporciona refspec en la línea de comandos, no se configura refspec en el control remoto, y ninguna de las opciones indicadas en la línea de comandos implica ninguna refspec. Los valores posibles son:
nothing
: no empujar nadamatching
: empujar todas las ramas coincidentesSe considera que todas las ramas que tienen el mismo nombre en ambos extremos coinciden.
Este es el predeterminado en Git 1.x.
upstream
: lleva la rama actual a su rama upstream (eltracking
es un sinónimo en desuso para upstream)current
: empuje la rama actual a una rama del mismo nombresimple
: (nuevo en Git 1.7.11) como upstream, pero se niega a presionar si el nombre de la sucursal upstream es diferente del localEsta es la opción más segura y es adecuada para principiantes.
Esto se convertirá en el predeterminado en Git 2.0.
Los modos simple, actual y ascendente son para aquellos que desean expulsar una sola rama después de terminar el trabajo, incluso cuando las otras ramas aún no están listas para ser expulsadas
Ejemplos de línea de comando:
Para ver la configuración actual:
git config --global push.default
Para establecer una nueva configuración:
git config --global push.default current
Puede empujar rama actual con comando
git push origin HEAD
(tomado de here )
Un git push intentará enviar todas las sucursales locales al servidor remoto, esto es probablemente lo que no desea. Tengo un par de conveniencias configuradas para lidiar con esto:
Alias "gpull" y "gpush" apropiadamente:
En mi ~ / .bash_profile
get_git_branch() {
echo `git branch 2> /dev/null | sed -e ''/^[^*]/d'' -e ''s/* /(.*/)//1/''`
}
alias gpull=''git pull origin `get_git_branch`''
alias gpush=''git push origin `get_git_branch`''
Por lo tanto, ejecutar "gpush" o "gpull" empujará solo mi rama "actualmente en".
git push origin
empujará todos los cambios en las sucursales locales que tengan ramas remotas coincidentes en el origin
Como para git push
Funciona como
git push <remote>
, donde<remote>
es el<remote>
la rama actual (u origen, si no hay un control remoto configurado para la rama actual).
De la sección de ejemplos de la página del manual de git-push
.