2011-11-17 16 views
24

me gustaría empujar mi rama actual (HP1) congit push: objetivo establecido para la rama

git push 

y no

git push origin hp1:team/hp1 

La rama remota ya existe.

Mis ramas locales:

develop 
master 
* hp1 

git show de origen remoto me dice:

Remote branches: 
    develop tracked 
    master tracked 
    team/h2 tracked 
    team/hp1 tracked 
    team/n1 tracked 
Local branches configured for 'git pull': 
    develop merges with remote develop 
    master merges with remote master 
    hp1 merges with remote team/hp1 
Local refs configured for 'git push': 
    master pushes to master (up to date) 

ya he intentado

git branch --set-upstream hp1 origin/team/hp1 

y

git branch --set-upstream hp1 refs/remotes/origin/team/hp1 

pero ambos no funcionan.

Mi colega tiene una sucursal local llamada como la sucursal remota (equipo/hp1) y el código anterior funciona para él. Él obtiene al final un adicional

Local refs configured for 'git push': 
    develop pushes to develop (up to date) 
    master pushes to master (up to date) 
    team/hp1 pushes to team/hp1 (up to date) 

Así que tal vez me puede decir lo que está mal y cómo solucionarlo.

EDITAR mi config:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = ***@***:***.git 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
[branch "hp1"] 
    remote = origin 
    merge = refs/heads/team/hp1 

Respuesta

40

primer todas , Cuando se empuja por primera vez, hacer:

git push -u origin hp1:team/hp1 

Sobre opción -u:

-u
-set-aguas arriba

Para todo aquel que está al día o presionada con éxito, agregue en sentido ascendente (seguimiento) de referencia, utilizada por los comandos sin argumento git-pull (1) y . Para obtener más información, consulte branch..merge en git-config (1).

Nota del manual que, en sí mismo, no determinará lo que sucederá cuando haga git push la próxima vez. Cuando haga git pull mientras se encuentra en esta rama, la obtendrá del flujo ascendente que haya establecido. Pero cuando presionas, se desplazará a una rama correspondiente (en este caso hp1 y no a equipo/hp1)

Para que funcione, debes establecer el valor de configuración push.default en upstream.Una vez que se establece que, cuando se presiona de una rama (acaba de hacer git push), empujará a la aguas arriba como se ha mencionado por branch.<name>.merge

Lo mismo ocurre con:

git config push.default upstream 

Sobre push.default:

push.default

Define el empuje acción git debe tomar si no se da refspec en la línea de comandos , no se configura ningún refspec en el mando a distancia, una nd no refspec está implícito en cualquiera de las opciones dadas en la línea de comando. Los valores posibles son:

nada - no empuje nada.

coincidente - presione todas las ramas correspondientes. Se considera que todas las ramas que tienen el mismo nombre en ambos extremos coinciden. Este es el predeterminado.

upstream - empuja la rama actual a su rama de subida.

seguimiento - sinónimo depreciado para el flujo ascendente.

actual: inserte la rama actual en una rama con el mismo nombre.

+0

, gran explicación! Además, ahora entiendo, ¿por qué se está trabajando para mi colega sin ajustar el push.default – m1schka

+0

Otro valor para push.default es sencilla - como aguas arriba, pero se niega a empujar si el nombre de la rama ascendente es diferente de la local. – CodeKid

2

Uso del -u opción de git push:

$ git push -u origin hp1:team/hp1 

Entonces, después de eso, usted puede hacer:

$ git push 
+0

gran consejo! ¡¡Gracias!! –

+2

para mí, sólo cambia la configuración de 'pull' git, git la configuración push'' sigue siendo el mismo (sin objetivo empuje fijado para HP1 rama) – m1schka

+0

Se puede publicar su archivo de configuración? – mipadi

3

(marzo de 2012): Cuidado: que la política de "aguas arriba" podría convertirse en un defecto pronto
(en algún momento después git1.7.10 +)
:

Ver "Please discuss: what "git push" should do when you do not say what to push?"

En la configuración actual (es decir, push.default=matching), git push witho El argumento ut empujará todas las ramas que existen local y remotamente con el mismo nombre.
Esto es generalmente apropiado cuando un desarrollador empuja a su propio repositorio público, pero puede ser confuso si no es peligroso cuando se usa un repositorio compartido.

La propuesta es cambiar el valor predeterminado a 'upstream', es decir, empujar solamente la rama actual, y lo empuja al git pull rama sería tirar de.
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 tema:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

discusiones pertinentes anteriores incluyen:

unirse a la discusión, enviar sus mensajes a: [email protected]

+0

git 2.0 va a cambiar el comportamiento predeterminado de git push, pero sólo para el modo "simple", que no creo que va a hacer lo que quiera. Ver https://www.kernel.org/pub/software/scm/git/docs/git-config.html –

+0

@AlexanderBird Sí, tiene usted razón. Lo he documentado desde: http://stackoverflow.com/a/10002469/6309, http://stackoverflow.com/a/13751847/6309. – VonC

0

El siguiente permitirá a uno para no tener que especificar -u ${branch_name} por primera git push.

git config "branch.${branch_name}.remote" origin 
git config "branch.${branch_name}.merge" "refs/heads/${branch_name}" 

De acuerdo, es mucho más escribiendo, pero no cuando está en un script que configura el espacio de trabajo uno. Tampoco empuja prematuramente la rama hacia el repositorio remoto.