Git: copy una cadena de confirmaciones a alguna otra confirmación, sin twigs involucradas, en un command

Tengo estos commits: (TL; DR a continuación …)

A <- B <- C 

Estos están en la parte superior de los compromisos del colega:

 U <- V <- W <- A <- B <- C 

Ahora el colega volvió a adaptar su twig a un nuevo master , presionó github repo, que actualizó el PR, luego agregó un compromiso, presionó github repo, luego resolví los conflictos en github y me comprometí con la twig en github, luego el colega aplastó dos de los confirma y agrega otro, y luego nuestro jefe de equipo intervino y comenzó a editar con el editor de github. Entonces termina así: [1]

 X' <- A'' <- U -> C <- W -> B ---> L --> O --> O <--- master' / | / <------ master G ---------> M --/ \- abyssmal' <-- P --/ 

En otras palabras, las twigs originales se volvieron irrelevantes y el nuevo estado de cosas tiene muy poco que ver con el estado original. Creo que ningún command de git manipulando las twigs puede realmente apuntar a este uso. Solo quiero tomar los remanentes de mi trabajo (en forma de pocas confirmaciones sucesivas) y tratar de adaptarlo a la base de código de hoy.

Estoy escribiendo la historia porque normalmente la gente intenta ofrecer soluciones a mi problema subyacente, lo cual es genial, pero preferiría conocer esta operación en particular, si github tiene los medios para hacerlo. Además, estoy diciendo que no hay sucursales porque cada vez que pocas personas trabajan en una twig, las cosas se complican rápidamente y las sucursales pierden sentido. Falta de disciplina o uso de Git de una manera incorrecta. Lo sé. No resolviendo eso, estaré feliz con la solución a esto.

Todo lo que me importa es:


TL; DR:

¿Cómo copyr cualquier cadena de confirmaciones (siempre que estén encadenadas) a alguna otra confirmación, en un command? Es decir, tengo:

 ...hicSuntLeones <- myCommitA <- myCommitB <- myCommitC <- whatever... 

Quiero un command súper simple:

 git copyCommits --since myCommitA --until myCommitC --putThemTo terraInrecognita 

Quiero que termine así:

 ...terraIncognita <- myCommitA' <- myCommitB' <- myCommitC' 

Con conflictos intermedios resolviendo por supuesto.


Estaba viendo git rebase --onto , pero parece funcionar con una lógica diferente que necesito – me permitiría "divorciarme" de otra twig, pero no tengo esa twig. Si lo entiendo correctamente

Estoy buscando desbordamiento de stack y web, pero todavía no puedo encontrar. Las respuestas de git tienden a explicar cómo funciona git, cómo funciona git rebase , cuál es el contraste de la filosofía de layout de git con la filosofía de una herramienta de control de fuente más tradicional como svn , cómo funciona SCM en general, cómo son las relaciones con los padres importante y otras cosas. No quiero parecer arrogante, pero solo estoy buscando un command para hacer lo anterior. ¿Hay alguna? Gracias 🙂

[1] No es realmente tan malo, solo un caos diario normal. Pero aún hace que este enfoque sea más fácil que pensar en twigs.

Editar: no proporciona una respuesta: Diferencia entre 'rebase master' y 'rebase –onto master' desde una twig derivada de una twig de master Este duplicado referencedo, al que también se hace reference en la pregunta, no responde mi pregunta. Tiene respuestas lentas sobre cómo funciona git, cómo funcionan las twigs, pero realmente no da la respuesta a mi pregunta. Quizás esté implícito allí pero no dado.

Mi primera idea sería hacer un git rebase . Hay esta rebase con tres arguments en la página de man git-rebase tiene este buen ejemplo (entre muchos otros):

  H---I---J topicB / E---F---G topicA / A---B---C---D master $ git rebase --onto master topicA topicB H'--I'--J' topicB / | E---F---G topicA |/ A---B---C---D master 

Se logrará un efecto similar en su repository con los siguientes commands.

Primero creamos una twig con el último compromiso que nos interesa y lo finalizamos:

 $ git checkout -b newC myCommitC 

Luego volvemos a basar esta twig en el lugar deseado. No te olvides de especificar el padre del primer commit, porque tienes que decir el último commit no incluido en el rebase;

 $ git rebase --onto terraIncognita myCommitA^ newC 

¡Y hecho! Ahora tienes newC apuntando a la punta de la nueva twig:

 terraIncognita <- myCommitA' <- myCommitB' <- myCommitC' 

Lo que quieres es simplemente git cherry-pick , que puede elegir una cadena de compromisos.

Tomará dos commands (a less que escriba su propia secuencia de commands), ya que necesita get el lugar donde desea que lleguen las copys. Entonces, si el primer compromiso para copyr es S (para el inicio) y el último es E (para el final):

 git cherry-pick S^..E 

Necesita el sufijo de sombreo para que el range incluya commit S mismo.