Fusionando parte de la twig de git en el maestro

Tengo una twig simple con cambios multiplipe:

Master ---A---B---C \ Foo E---F---G---H 

Ahora necesito unirme al Maestro solo como parte de mis cambios. Soy nuevo en git (actualmente lo uso con SourceCode en Windows), y estaba pensando en hacerlo así:

 Master ---A---B---C---?---J---?---?--- \ / Foo E---G' \ Bar F'---H'--- 

Solo necesito ciertas partes de la sucursal. He estado trabajando en 4 API de fabricante diferentes para implementar. Ahora, solo 1 necesita entrar en producción y el rest está en espera. Digamos que hay un total de 19 files modificados, pero solo necesito 7 de ellos. Ahora, necesito separar esos 7, sincronizar con el maestro y presionar como una twig diferente, para que el CTO pueda fusionarlos en el Maestro más adelante.

¿Es esa la manera de hacerlo? ¿Y cómo lo hago correctamente?

Si analizamos su problema, debe:

  1. Split 4 (E, F, G, H) se compromete desde Foo en 2 twigs, Foo tendrá solo: E, G, pero Bar tendrá los 4, E -> G -> F -> H.
  2. Eliminar algunos commits: es decir, en Foo, eliminar commit F y H.
  3. No estoy seguro de si desea "Reorderar" las confirmaciones en la Barra de ramificación, es decir, si tiene E, G, F, H -> Supongo que esto no resuelve ningún problema, por lo que lo dejaré fuera de mi respuesta.

Hay muchas forms de hacerlo, pero lo mantendré en el flujo más simple que se me ocurra, ya que eres nuevo en git. entonces, veamos dividir la twig:

Desde tu Foo actual (head = H) do git checkout -b Bar Esto creará la twig Bar con commits E, F, G, H

Ahora, hay dos forms en que puede restablecer su sucursal Foo:
# 1 Descartar Foo y volver a crearlo git branch -D Foo (para eliminar del local) git push origin :Foo (para eliminar del control remoto, si ya lo has empujado)

Entonces necesitas crear un nuevo Foo a partir del compromiso "C" de tu maestro:

 git checkout -b Foo <CommitIdShaForC> 

Luego puedes seleccionar los commit E y G desde git gui haciendo gitk Bar y luego haciendo clic derecho en el commit y eligiendo cherry pick, o desde console por:

 git cherry-pick <Commit Id for E> <Commit Id for G> 

En caso de problemas de fusión, mira esta respuesta

# 2 Revertir commits de Foo Si no te importa tener historial de F y H en tu foo, simplemente puedes revertirlos en git, esencialmente git crea un parche inverso de tus commits F y H y los aplica como nuevos commits:

  • Estás en la twig Foo y tiene E -> F -> G -> H
  • git revert F
  • Su sucursal ahora debería mostrar E -> F -> G -> H -> F' donde F' está deshaciendo lo que el compromiso F agregó
  • git revert H llevaría a: E -> F -> G -> H -> F' -> H' cuyo resultado final en el código fuente sería: lo mismo que tener solo commits E y G.

Alternativamente, puedes usar el indicador –no-commit en git revert para revertir tanto F como H en 1 commit:

 git revert --no-commit F git revert --no-commit H git commit -a -m "reverting commits F and H" 

Esto llevaría a:

E -> F -> G -> H -> I donde estoy el compromiso que deshace F y H

#Update 1 Después de escribir una respuesta larga, veo que OP quiere tener "parte de los commits" en pocas twigs. Para este caso, recomendaría una database interactiva para que las confirmaciones se puedan dividir. Consulte la documentation oficial sobre git rebase, en particular la sección sobre "Compromisos de split". Además, creo que encontrarás esta pregunta particularmente útil