2011-11-10 13 views
9

lo hice:Git: ¿Cómo pasar de "sin rama" a una nueva rama remota?

git co upstream/master # To no branch. 
<then did a trivial edit on some file...> 
git commit -a -m "Trivial edit" 
git push origin NewBranch 

Pero tiene esto:

$ git push origin ignore-netbeans-config 
error: src refspec ignore-netbeans-config does not match any. 

¿Puedo empujar a una nueva rama sin crear una local?

+0

Buena pregunta! Por supuesto, si puede continuar editando aquí, querrá seguir adelante y crear una sucursal para estar seguro. – Cascabel

Respuesta

10

primero vamos:

  1. Una rama es una "referencia" en el espacio de nombres refs/heads. Solo ls .git/refs/heads y cat los archivos para ver lo que quiero decir.
  2. Una etiqueta es "ref" en el espacio de nombre refs/tags. Solo ls .git/refs/tags para verlo usted mismo.
  3. HEAD simplemente otro "ref", pero es especial en el aspecto de que puede ser "simbólico". Solo cat .git/HEAD y vea lo que dice.

A push operación opera en un "ref", y el "mapeo" predeterminado conserva el espacio de nombres. Esto significa que cuando presiono una rama, aparecerá como una rama en el control remoto; cuando presiono una etiqueta, aparecerá como una etiqueta en el control remoto. Considere los siguientes escenarios:

  1. Quiero empujar la etiqueta moo y hacer que parezca como una rama en el servidor remoto (sí, estoy esencialmente "convertir" una etiqueta en una rama). Esta es la forma en que lo haré:

    git push origin moo:refs/heads/moo

  2. Git necesita una forma de diferenciar entre el avance rápido y no empuja y siguientes, por lo que las personas no terminan sobrescribir el trabajo de otras personas por error. Digamos que quiero presionar las ramas master, next y pu, de las cuales solo pu es no-ff. Esta es la forma en que lo haré (recordamos que debe suministrar una asignación explícita cuando se está utilizando +):

    git push origin master next +pu:pu

  3. Ahora, vamos a llegar a su pregunta. Desea insertar su HEAD para que aparezca en el espacio de nombres refs/heads en el control remoto como una rama llamada "ignore-netbeans-config". Si esta rama no existía antes, o si está sobrescribiendo algunos commits en ella (es decir, push no-ff), use +. De lo contrario, no. Resultado final:

    git push origin +HEAD:refs/heads/ignore-netbeans-config

TL; DR versión: git push origin +HEAD:refs/heads/ignore-netbeans-config

+0

¡Gracias por la explicación! –

11

tratar

aclarar algunos pequeños detalles
git push origin HEAD:refs/heads/ignore-netbeans-config 
+0

Ah, eso funcionaría. +1. – manojlds

+0

Debería poder omitir la parte "refs/heads /". –

+0

@ AdamDymitruk, eso fue lo que probé, no funcionó. –

Cuestiones relacionadas