mercurial rebase

En Mercurial, ¿cuál es la diferencia entre hg injft y hg rebase?



(1)

hg graft permite la "recolección de cerezas", como anotó en su pregunta. Por ejemplo, puede ejecutar hg graft -D "2085::2093 and not 2091" para copiar solo algunos cambios de otra revisión. En comparación, hg rebase (con o sin - --keep ) capturará cualquier conjunto de cambios que especifique y todos sus cambios de origen.

Además, la rebase permite colapsar los conjuntos de cambios (con --collapse ). Por lo que puedo decir, el graft no lo hace.

Una diferencia más que he notado: hg graft --edit 123 permite hg graft --edit 123 revisión 123 en el directorio de trabajo y editar el mensaje de confirmación. No puedo encontrar un hg rebase equivalente. Debo señalar, sin embargo, que hg histedit también permite editar el mensaje de confirmación mientras se rebasa.

Probablemente hay otras diferencias en las que no estoy pensando. SO comunidad: siéntase libre de señalarlos en los comentarios, y con gusto revisaré esta respuesta para que sea más completa.

Consulte la documentación de graft y Rebase de Rebase para obtener más detalles.

Sé que Rebase es una extensión (incluida), mientras que Graft es una función principal (que reemplazó a la extensión Transplant (incluida)).

graft se documenta como:

copiar cambios de otras ramas en la rama actual

Este comando utiliza la lógica de combinación de Mercurial para copiar cambios individuales de otras ramas sin combinar ramas en el gráfico de historial. Esto a veces se conoce como ''backporting'' o ''cherry-picking''.

rebase se documenta como

Rebase permite mover compromisos alrededor de la historia de Mercurial (utilizando una serie de fusiones internas). Esto tiene muchos usos:

  • moviendo conjuntos de cambios entre ramas
  • historia "linealizadora"
  • reordenar conjuntos de cambios
  • colapsar múltiples cambios en un conjunto de cambios

Ambos parecen usar la fusión para mover o copiar los conjuntos de cambios entre las ramas.

Copias de injerto. Rebase se mueve. Pero rebase --keep copias.

Muy a menudo parece que puedo lograr mi objetivo de copiar un conjunto de cambios de cualquier manera. ¿Importa cuál uso? ¿Cuándo debería preferir uno sobre el otro?

Por ejemplo, ¿se debe usar el injerto solo cuando se copia en una rama con nombre diferente? ¿O solo cuando hay un solo conjunto de cambios?

Edición: ¿Podría ser que rebase es un superconjunto de injerto potencialmente inseguro, pero solo puede usarse con draft conjuntos de cambios durante el desarrollo para editar el historial local, mientras que injerto es un subconjunto seguro de rebase que se puede usar con conjuntos de cambios public durante el mantenimiento para backporting?