¿Cómo empujas una sola rama de Git (y ninguna otra rama)?

247

Estoy trabajando en un repositorio git local. Hay dos ramas, mastery feature_x.

Quiero empujar feature_xal repositorio remoto, pero no quiero empujar los cambios en la masterrama.

¿Funcionará una git push origin feature_xde mi feature_xsucursal (la feature_xsucursal ya existe en remoto)?

No quiero probar esto en mi caja, porque no puedo presionar para dominar en este momento.

Rafael Mueller
fuente
Eche un vistazo aquí: remoto y aquí: empuje una rama a github Parece que funcionaría.
al.

Respuestas:

376

si, solo haz lo siguiente

git checkout feature_x
git push origin feature_x
cpjolicoeur
fuente
54
Con git moderno, debería poder simplemente "git push origin HEAD", o incluso "git push HEAD" para empujar solo la rama actualmente retirada.
Jakub Narębski
2
¿Es necesario pagar a feature_x?
hd.
55
sí, porque si está en el maestro, tratará de empujar la rama maestra local a la rama remota feature_x. para no tener que pagar primero, tendría que hacer "git push origin feature_x: feature_x"
cpjolicoeur
1
@cpjolicoeur que vi en otras preguntas (por ejemplo: aquí ) que están haciendo git push -u origin <branch-name>. Sin embargo, no lo mencionaste. Es necesario ?
riroo
3
@miss_R la -uopción en un git-pushcomando establecerá la referencia aguas arriba para rastrear la rama que se acaba de presionar. Esto hará que cosas como git-pullesa rama en el futuro ya sepan de qué rama extraer sin especificarlo. No se requiere como una opción para impulsar una sola rama, pero se usa ampliamente porque mucha gente quiere hacer que la rama local rastree la rama remota que están presionando.
cpjolicoeur
74

Por defecto git pushactualiza todas las ramas remotas. Pero puede configurar git para actualizar solo la rama actual a su flujo ascendente.

git config push.default upstream

Significa que git actualizará solo la rama actual (desprotegida) cuando haga git push.

Otras opciones válidas son:

  • nothing: No presione nada (error fuera) a menos que se especifique explícitamente una refspec . Esto está destinado principalmente a las personas que desean evitar errores siendo siempre explícitos.
  • matching: Empuje todas las ramas que tengan el mismo nombre en ambos extremos. (opción predeterminada anterior a la versión 1.7.11)
  • upstream: Empuje la rama actual a su rama aguas arriba. Este modo solo tiene sentido si está presionando al mismo repositorio desde el que normalmente extraería (es decir, flujo de trabajo central ). No es necesario tener el mismo nombre para sucursal local y remota.
  • tracking: Desaprobado, use upstreamen su lugar.
  • current: Empuje la rama actual a la rama remota del mismo nombre en el extremo receptor. Funciona en flujos de trabajo centrales y no centrales.
  • simple: [disponible desde la versión 1.7.11] en el flujo de trabajo centralizado, trabaje como upstreamcon una seguridad adicional para negarse a presionar si el nombre de la rama ascendente es diferente del local. Cuando empuje a un control remoto que sea diferente del control remoto desde el que normalmente tira, trabaje como current. Esta es la opción más segura y es adecuada para principiantes. Este modo se ha convertido en el predeterminado en Git 2.0.
Karthik Bose
fuente
2
Gracias, currentera lo que estaba buscando, por defecto git pushen la foorama lo empujará a la origin/foorama.
Dorian
@ Dorian gracias, estoy de acuerdo en que currenttiene más sentido por defecto.
Zoltán
@Dorian, @ Zoltán: creo que simpletiene más sentido por defecto. He actualizado la respuesta con 'cuándo usar qué'. Por favor, eche un vistazo.
Karthik Bose
1
Nota: desde git versión 2, el valor predeterminado ha cambiado a simple.
Danijel
8

Actualización menor además de la respuesta de Karthik Bose : puede configurar git globalmente, para afectar a todos sus espacios de trabajo para que se comporten de esa manera:

git config --global push.default upstream
Bhaskar
fuente
aguas arriba no fue reconocido como un ajuste válido para mí, tuve que poner 'actual' en su lugar
grasshopper
-2

Entonces, supongamos que tiene una sucursal local foo, un origen remoto llamado y un origen / maestro de sucursal remota.

Para empujar el contenido de foo a origin / master, primero debe configurar su flujo ascendente:

git checkout foo
git branch -u origin/master

Entonces puede empujar a esta rama usando:

git push origin HEAD:master

En el último comando puede agregar --force para reemplazar todo el historial de origen / maestro con el de foo.

CodeKid
fuente