Fusiona primero n confirma de twig a principal

Tengo una twig desde el compromiso más reciente al master . la twig tiene dos compromisos en ella. Me gustaría avanzar rápido para fusionar el primero de esos commits en master.

Sé que podría hacer una elección inteligente, pero realmente no quiero separar al maestro y la twig si puedo evitarlo.

Estado actual:

 Branch: +--->B--->C / Master: --->A 

Opción de selección de cerezas:

 Branch: +--->B--->C / Master: --->A--->B' 

Opción ideal:

 Branch: +--->C / Master: --->A--->B 

es posible?

Tenga en count que las confirmaciones ya se han enviado al control remoto; pero nadie más tiene actualmente acceso a este repos en particular por lo que un push -f estaría bien.

Me parece recordar que podría haber alguna manera de fusionarse con el maestro mientras se realiza el check-out de una twig … si eso es cierto, podría simplemente verificar el commit B, y luego fusionarme de esa manera.

Más específicamente, es posible que desee:

 git merge --ff-only <commit-specifier> 

que le dice a Git que haga un avance rápido que no es realmente una combinación de la twig actual, sea lo que sea, con la confirmación especificada. Tal operación:

  1. comtesting si HEAD es un ancestro de <commit-specifier> : si no, falla, si es así, continúa con …
  2. avanzar la twig actual para que apunte a <commit-specifier> y leer esa confirmación en el índice y tree de trabajo ( git read-tree , la nota de caso "two tree merge" que esto también puede fallar, si no se ha confirmado) cambios o files sin seguimiento que están en la confirmación de destino).

Ahora, encontrar un hash específico que sea N confirma "por delante" de la confirmación actual en la dirección de la confirmación de un objective puede ser un poco complicado. Considera, por ejemplo:

 ...--o--o <-- master \ \ C--D \ / \ A--B G--H <-- branch \ / E--F 

El compromiso de la punta de la branch es de ocho compromisos antes de la comisión de compromiso master o ¿verdad? Creo que todos están de acuerdo en que A es un compromiso antes que master , y B tiene dos delante. ¿Pero qué pasa con C y E , y D y F ? C está tres adelante, pero también lo es E ; y D y F son ambos cuatro adelante. Pero G no está cinco por delante de master : parece ser siete por delante de maestro. Del mismo modo, la branch H aka parece estar ocho delante del master .

Entonces, si te dije que muevas tres commits adelante, ¿escogerías commit C , o E ? ¿Me darías un error o una elección? ¿Por qué?

Si restringe las cosas a una cadena lineal, podemos enumerar las confirmaciones "entre" master y branch , excluyendo el master y la branch incluida, con:

 git rev-list --reverse master..branch 

y luego la git merge --ff-only en la list es el hash de confirmación para dar a la git merge --ff-only . Pero si hay cadenas de ramificación y fusión "entre" estos dos puntos, toda la pregunta se vuelve complicada.

Como comentó Raymond Chen, la solución para la pregunta descrita es git merge B

Dejaré la pregunta abierta por un time, aunque en caso de que alguien tenga una respuesta más general para la pregunta como titulada , es decir, para n commits en lugar de solo 1.