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?