Git rebase – commit select en modo de punta de horquilla

Leyendo la documentation de git rebase y git merge-base man:

Después de trabajar en la twig temática creada con git checkout -b topic origin / master, el historial del origen / maestro de la raíz del seguimiento remoto puede haberse rebobinado y reconstruido, lo que lleva a un historial de esta forma:

  o---B1 / ---o---o---B2--o---o---o---B (origin/master) \ B3 \ Derived (topic) 

donde origin / master solía apuntar a commits B3, B2, B1 y ahora apunta a B, y su twig de tema se inició en la parte superior de la misma cuando Origin / Master estaba en B3. Este modo utiliza el reflog de origen / maestro para encontrar B3 como el punto de horquilla, de modo que el tema se puede volver a establecer en la parte superior del origen / maestro actualizado al:

 $ fork_point=$(git merge-base --fork-point origin/master topic) $ git rebase --onto origin/master $fork_point topic 

$fork_point will (si lo entiendo correctamente) será el object de commit B3 , y, por lo tanto, los commits B3..topic serán B3..topic en la twig de origin/master .

Q1 ¿Por qué es útil omitir el compromiso B3 ? Las confirmaciones de la twig de topic se construyen sobre la confirmación B3 que las modificaciones registradas perderían en la historia de la twig de origin/master . Volver a basar el compromiso B3 y la twig de topic conduciría a una historia más limpia, ¿no?

Q2 ¿Alguien puede vincular / describir brevemente casos prácticos de uso de la opción --fork-point en el flujo de trabajo de git?

Tiene razón en que $fork_point será B3 .

Creo que la intención aquí es omitir B3 como "no tu compromiso".

Creo que el diagtwig que dibujaron los Git aquí no es tan bueno. Así es como volvería a dibujar y reescribirlo sin cambiarlo demasiado (aunque de todos modos probablemente solo volvería a escribir cada compromiso).


Comienza clonando (o actualizando) un repository (de origin ) cuyo gráfico finaliza en la confirmación B3 , y crea una twig de tema y realiza alguna confirmación (es):

 ...--o---F---B3 <-- origin/master \ G <-- topic 

Con el time, con git fetch -es y git commit git fetch adicionales, su gráfico de compromiso ahora se ve así:

 ...--o---F---B3--B2--B1 <-- origin/master \ G---H---I <-- topic 

Pero, de repente, después de otra git fetch , su propio gráfico de compromiso ahora se ve así:

  o---B1' <-- origin/foo / ...o---F---B2'-o---o---o---B <-- origin/master \ B3--G---H---I <-- topic 

Es decir, Git ahora pensaría que commit B3 pertenece a su twig de tema, cuando de hecho, su trabajo comienza con commit G Las personas que poseen el repository denominado origin , en efecto, han declarado que el compromiso B3 es terrible y debe desecharse. (Conservaron una copy de B2 como B2' en su master , y una de B1 como B1' en su foo ).

Si simplemente git rebase , copyrá la confirmación original B3 a la nueva copy B3' (mientras copy también GHI ):

  o---B1' <-- origin/foo / ...o---F---B2'-o---o---o---B <-- origin/master \ B3'-G'--H'--I' <-- topic 

pero preferirías:

  o---B1' <-- origin/foo / ...o---F---B2'-o---o---o---B <-- origin/master \ G'--H'--I <-- topic 

Para que git rebase haga esto, debes indicarle a Git que busque commit B3 . Su reflog para el origin/master tiene todos los F , B3 , B2 y B1 (en al less una input de reflog, incluido en este caso origin/master@{1} ), mientras que su propio topic tiene F y B3 , pero no B2 ni B1 , también. Por --fork-point tanto, --fork-point elige B3 como la confirmación compartida más nueva (en la punta), en lugar de F


La oración / idea key aquí es que los escritores de repository en sentido ascendente intentaron descartar el compromiso B3 completo .

(La forma en que se supone que debes saberlo con certeza es un misterio. Puede que no sea obvio que B2' y B1' son copys, si es necesario volver a basarlas, por ejemplo, descartar un file que nunca debería haber sido cometido, y en B1 , por lo que B1 también se descartó. El hecho de que este file ahora se haya omitido en B2' y B3' hace no equivalentes a parche, por lo tanto, obviamente no son copys).

(Tenga en count que su propio master también apunta a B3 )