2009-11-24 18 views
33

Digamos que hice varios commits y deseo elegir de forma inteligente cuáles presiono para el repositorio remoto. ¿Cómo puedo hacer eso (en ascii: C1-> C2-> C3-> C4 y quiero presionar C2 y C4). ¿Reordenarán con rebase, restablecer, presionar y luego restablecer el trabajo? (C1-> C2-> C3-> C4 => C2-> C4-> C1-> C3 => restablecer C4 => pulsar => restablecer C3). ¿Hay una manera más agradable?git: push a single commit

+0

sí, se puede reescribir la historia (o crear rama separada con la historia es necesario) y luego empuje. Esta es la única manera. –

+3

Yo también estaba buscando el mismo problema. Este recurso podría ser útil https://miteshshah.github.io/linux/git/how-to-push-single-commit-with-git/ –

Respuesta

20

Si tiene sus confirmaciones en una sucursal privada, puede seleccionar las confirmaciones de la sucursal privada y aplicarlas a la sucursal oficial. En este punto, ahora puede enviar todas sus confirmaciones a la sucursal oficial (que es el subconjunto que seleccionó previamente).

+2

O si confirma que estaba en la sucursal oficial, puede seleccionar una sucursal temporal y enviarla a la sucursal oficial remota. ummm ... ¿verdad? – andho

+0

en mi humilde opinión La técnica más simple y más útil. – Benj

3

IIRC, debido a que git considera que se compromete a trabajar, C4 incluye inherentemente C3, por lo que el concepto de "presionar C4 pero no C3" no tiene sentido para git (y también C2 relativo a C1). (Consulte la respuesta al this previous question.)

+2

¡Falso! C4 hace referencia a C3 como su elemento primario, pero la otra respuesta es más correcta: puede elegir cometas del historial y aplicarlas a diferentes padres. –

+0

¿No es más como que C4 aplica intrínsecamente sus cambios a C3 pero los cambios de C4 son propios? – andho

+7

El uso de 'git cherry-pick' en' C4' para aplicarlo a una rama diferente no dará como resultado 'C4' en la nueva rama, sino' C4'', una confirmación diferente (pero similar). Si alguien más tarde se fusionó en la sucursal con 'C4', podrían surgir problemas. – Amber

49

Lo que estamos buscando:

git push origin commit-id:master 

crédito va a: http://blog.dennisrobinson.name/push-only-one-commit-with-git/

Notas:

  • Empujar una confirmación empuja todos los envíos antes de que (como dijo ámbar). La clave es reordenar sus confirmaciones (git rebase -i) primero, por lo que son en el orden en que desea aplicarlos.
  • El método sugerido branch + cherry-pick (sugerido por midtiby) funciona también, pero ¿por qué crear ramas desechables cuando no es necesario?
  • commit-id no tiene que ser un sha1. Para enviar todo antes de las últimas N confirmaciones, use "HEAD ~ N" en lugar de commit-id.
+5

Esta debería ser la respuesta aceptada. +1 gracias. –

6
$ git push <remote name> <commit hash>:<remote branch name> 

# Example: 
$ git push origin 2dc2b7e393e6b712ef103eaac81050b9693395a4:master 
+2

por favor agregue algunos comentarios con su respuesta, esto hará que sea fácil de leer ... –