precio - ¿Puedo squash commits en Mercurial?
mercurial significado (4)
Tengo un par de compromisos que realmente deberían ser solo uno. Si estuviera usando git, usaría:
git rebase -i <some-commit-before>
y luego aplastarlos.
¿Puedo hacer eso en mercurial? ¿Si es así, cómo?
Si está leyendo esta respuesta, puede olvidar todas las otras opciones mencionadas en esta respuesta y usar el comando de
fold
de la extensión evolucionar .
evolve
es una extensión de mercurial que nos ayuda a tener una historia mutable segura, sin embargo es aún experimental. Puede usarlo al clonarlo desde su repo y agregarlo en su .hgrc de esta manera.
[extensions]
evolve = ~/evolve/hgext/evolve.py
Suponiendo que haya clonado, desarrolle el repositorio en su directorio personal. Ahora eres bueno para ir. También puede buscar ayuda haciendo hg help fold
.
Le dices fold
para squash / fold una cadena lineal de commit que no está rota. Lo que hace fold es que crea un nuevo conjunto de cambios que contiene cambios de todos los conjuntos de cambios y marca todos los commits como obsoletos. Puede tener una visión más profunda de esto en los docs .
Ahora supongamos que tiene el siguiente historial.
a -> b -> c -> d -> e -> f -> g
Quieres aplastar e
, f
y g
. Tu puedes hacer
hg up g
hg fold -r e
El resultado será
a -> b -> c -> d -> h
donde h
es el conjunto de cambios que contiene cambios de los tres commits e
, f
y g
.
También puede doblar conjuntos de cambios desde la mitad de la historia, es decir, no necesariamente tiene que elegir una cadena que incluya la punta. Supongamos que quiere doblar b
, c
y d
. Tu puedes hacer
hg up d
hg fold -r b
hg evolve --all
Esto dará como resultado
a -> i -> j
donde i
es el conjunto de cambios doblado de b
, c
, d
y j
es el mismo conjunto de cambios que h
. Evolve la guía del usuario es una lectura obligada.
La extensión de Rebase funcionaba como un encanto. Para aplastar 2 commits:
$ hg rebase --dest .~2 --base . --collapse
El punto es un atajo para la revisión actual.
Es incluso más fácil cuando tienes algunos commits en una rama y quieres colapsarlos todos en uno:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
Cómo funciona esto:
(de http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
Mi favorito es hg strip --keep
command. Y luego comprometo todos los cambios en una confirmación.
Es la forma más rápida y cómoda para mí, porque me gusta hacer pequeños commits durante mi trabajo diario;)
Nota 1: strip
necesita una extensión mq
incorporada para habilitarse.
Nota 2: Mi cliente favorito de Git / Mercurial (SmartGit / Hg) se agrega por defecto --keep
parameter during strip
. Y lo que es aún más conveniente: proporciona una opción llamada join commits
:]
Sí, puedes hacer esto usando mercurial sin extensiones mediante Concatenación de conjuntos de cambios .
Alternativamente, si desea usar una extensión, puede usar: