Cómo usar Git para labelr una confirmación en lugar de un hash

Tengo una gran serie de confirmaciones, con varias tags de versión, es decir:

root->x->x->1->x->x->x->2->x->x->3->x->4->x->x->x->5->master 

Quiero insert un nuevo compromiso cerca del comienzo de esto. El problema es que luego tengo que revisar y volver a labelr todo, porque mi tree termina luciendo así:

 root->x->x->y->x->x->x->x->x->x->x->x->x->x->x->x->x->x->master \->1->x->x->x->2->x->x->3->x->4->x->x->x->5 

¿Hay alguna forma de labelr un compromiso específico, en lugar de un hash específico? ¿De modo que cuando hago una rebase, las tags se aplican a las mismas confirmaciones específicas, en el nuevo tree, en lugar de las confirmaciones originales?

Nota: No estoy interesado en moralizar, por favor no publique ninguna respuesta que diga cosas como "lo está haciendo mal" o "así no se supone que funcione el control de versiones" a less que también pueda proporcionar una alternativa constructiva. Necesito una forma de marcar commits que persistirán después de una rebase, incluso si la única solución posible es "Git no hace eso, usa X en su lugar".

Aquí hay una solución alternativa que he visto usar muchos repositorys.

  • Crea una twig para cada versión principal que quieras mantener.
  • Push fixes / updates para cada twig. Use fusión / rebase / selección de cereza entre ellos cuando sea posible para evitar el trabajo repetitivo.
  • Tag se compromete en esas twigs con versiones menores / parche.

Ejemplo:

  • Usted tiene una twig master .
  • 1.0.0 versión 1.0.0 apuntando al master actual.
  • Continúa presionando para master y lanzar una versión 1.1.0 .
  • A continuación, realiza una importante versión refactor / versiones incompatibles hacia atrás y versiones 2.0.0 .
  • Podría (y debería) hacer una twig 1.x apuntando a la versión 1.1.0 anterior.
  • A continuación, inserta una corrección de error (en el master ) que afecta a las versiones 2.x y 1.x
  • Etiquetar el compromiso como 2.0.1 . Escoja Cherry en la twig 1.x y etiquete eso como 1.1.1 .

Hay variaciones en este flujo de trabajo. Siempre puede tener una twig para sus versiones principales y la twig master podría ser su twig de desarrollo activo para su próxima versión principal.

Creo que esto es resolver su problema profundizando y abordando la causa raíz de su flujo de trabajo que es, presionando un cambio en varias versiones.


También debo mencionar que cambiar a qué tags apunta después de que has empujado las tags siempre es malo. Muy mal.

… por favor no publique ninguna respuesta que diga cosas como "lo está haciendo mal" o "así no se supone que funcione el control de versiones" a less que también pueda proporcionar una alternativa constructiva. Necesito una forma de marcar confirmaciones que persistirán después de una rebase …

Lo estás haciendo mal; así no se supone que funcione el control de versiones. 😄 Ahora, para mi alternativa constructiva , tengo una, y no es "Git no hace esto".

El uso de "tags" está desactivado. Si usa tags git, incluso si hackea algunas secuencias de commands que eliminarán las tags antiguas y creará nuevas cada vez que vuelva a establecer la base, las tags nuevas no serán tiradas por ningún otro usuario que queuebore con usted, empeorando las tags. inútiles ya que estarían activamente engañando. (Ver LESS=+/DISCUSSION man git-tag para más información sobre esto.)

Sin embargo, hay una manera limpia y elegante de lograr lo que usted desea, sin el uso de tags . Tenga en count que no le permitirá "pseudo-labelr" una confirmación después del hecho sin volver a establecer la database para modificar esa confirmación, pero dado que ya se está renovando, creo que será perfecto para su flujo de trabajo.

La key de mi método de pseudo-label es la comprensión de un método poco utilizado para especificar una revisión de git. Ver LESS='+/:/<text>' man gitrevisions para leer en él.

Decide una cadena de text que sea corta y no aparezca en un post de confirmación accidentalmente, y úsala como prefijo para tus pseudo-tags. Por ejemplo, my-pseudo-tag- .

Luego, para cualquier confirmación que desee pseudo-label, modifique ese post de confirmación (usando rebase) para include la cadena, por ejemplo, my-pseudo-tag-v0.7.5 .

Ahora, cada vez que desee referirse a esa pseudo-label, por ejemplo, para verificar esa versión, o para crear una nueva twig apuntando hacia allí, use el especificador de revisión de git así:

 git checkout :/my-pseudo-tag-v0.7.5 git checkout -b new_branch :/my-pseudo-tag-v1.3.0 

Voila! Dado que sus pseudo-tags son en realidad parte del post de confirmación en lugar de un object separado que apunta a la confirmación, no se ven afectadas por una rebase y solo se pueden encontrar en el post de confirmación donde espera encontrarlas.

En otras palabras, la forma de marcar commits que persistirá después de una rebase, es include text específico en los posts de confirmación que solo se encontrarán en el post de esa confirmación.

(Por supuesto, si está trabajando con otras personas, tendrá que soñar de alguna manera para asegurarse de que no usen la "palabra reservada" en sus propios posts de compromiso … pero eso está más allá del scope de su pregunta y mi solución.)


Nota: por favor no rebase las confirmaciones que están disponibles para otros; hará futuros dolores de cabeza. (Esto está dirigido a cualquier lector futuro, no al Póster original de esta pregunta cuyo flujo de trabajo evidentemente exige volver a basar).