Con Mercurial, ¿cómo puedo "comprimir" una serie de conjuntos de cambios en uno antes de empujar?
Digamos que tengo un repositorio Mercurial local y uno remoto. Ahora, empiezo a trabajar en una función. Trabajo en ello, y cuando creo que está hecho, cometo el conjunto de cambios. Probando un poco más, me parece que podría mejorar aún más esta característica por ajustar algo en el código. Hago el cambio y me comprometo. 20 minutos después, encuentro que hay un error en esta nueva característica, así que lo arreglo y lo confirmo también.
Ahora tengo 3 conjuntos de cambios que realmente me gustaría enviar al repositorio remoto como un conjunto de cambios con el mensaje "Implementing feature X", por ejemplo.
¿Cómo puedo hacer esto sin mucha molestia? Creo que podría hacerlo con parches, pero parece mucho trabajo.
10 answers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-30 02:44:29
El histeditar extensión es exactamente lo que usted está buscando.
hg histedit -o
O
hg histedit --outgoing
Mostrará una lista de los conjuntos de cambios salientes. De la lista se puede
- Doblar 2 o más conjuntos de cambios creando un único conjunto de cambios
- Soltar conjuntos de cambios eliminándolos del historial
- Reordena los conjuntos de cambios como quieras.
Histedit le pedirá el nuevo mensaje de confirmación de los conjuntos de cambios plegados a los que por defecto los dos mensajes con "\n***\n" separándolos.
También puede obtener resultados similares utilizando la extensión mq, pero es mucho más difícil.
También puede usar la extensión collapse para simplemente plegar, pero no proporciona una interfaz de usuario tan agradable y no proporciona una forma de editar el mensaje de confirmación resultante. Editar el mensaje de confirmación resultante también permite limpiar el mensaje final, que es algo que siempre termino utilizando.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-13 20:25:19
Sí, puede hacerlo con parches: Supongamos que su trabajo está en los conjuntos de cambios 100 a 110, ambos inclusive
-
Crear un parche:
% hg export -o mypatch 100:110 --git
-
Actualización a 99:
% hg update 99
-
Aplique el parche con --no-commit (de lo contrario recuperará todos sus conjuntos de cambios):
% hg import --no-commit mypatch
-
Confirme todos los cambios a la vez:
% hg commit
-
Ahora tienes dos cabezas (110 y 111) que deberían ser equivalentes en términos de los archivos que producen en su directorio de trabajo maybe tal vez diff para la cordura antes de quitar los viejos:
% hg strip 100
OK, ahora que lo he deletreado todo, parece largo, pero después de haberlo hecho un montón de veces yo mismo, no me parece que sea demasiado una tarea...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 11:24:55
Si está utilizando TortoiseHg, use solo puede seleccionar dos revisiones (use CTRL para seleccionar las no siguientes), haga clic con el botón derecho y seleccione "Comprimir historial".
Después de eso, obtendrá una nueva lista de cambios en new head a partir del primer cambio que seleccionó antes, contendrá todas las listas de cambios descendientes entre las que seleccionó.
Simplemente puede eliminar las listas de cambios antiguas si ya no las necesita: use MQ extensiones para ello. De nuevo, en TortoiseHg: haga clic derecho en la primera lista de cambios que necesita ser eliminada con todos sus descendientes, "Modificar historial -> Eliminar".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-08 19:23:09
Mi método preferido de usar mq para este plegado es usar TortoiseHg como se describe aquí. Sin embargo, se puede hacer fácilmente desde la línea de comandos de la siguiente manera:
hg qimport -r <first>:<last>
-- where <first> and <last> are the first and last changesets
-- in the range of revisions you want to collapse
hg qpop <first>.diff
-- remove all except for the first patch from the queue
-- note: mq names patches <#>.diff when it imports them, so we're using that here
hg qfold <next>.diff
-- where <next> is <first>+1, then <first>+2, until you've reached <last>
hg qfinish -a
-- apply the folded changeset back into the repository
(Puede haber una mejor manera de hacer el paso qfold, pero no soy consciente de ello, ya que normalmente uso TortoiseHg para esa operación.)
Parece un poco complicado al principio, pero una vez que has comenzado a usar mq, es bastante sencillo y natural plus además puedes hacer todo tipo de otras cosas con mq que pueden ser ¡muy útil!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 04:20:34
hg collapse
y hg histedit
son las mejores maneras. O, más bien, sería la mejor manera, si funcionaran de manera confiable... Tengo histedit
para bloquear con un volcado de pila en tres minutos. Collapse
no es mucho mejor.
Pensé que podría compartir otros dos BKM: {[12]]}
-
hg rebase --collapse
Esta extensión se distribuye con Mercurial. Aún no he tenido problemas con él. Es posible que tenga que jugar algunos juegos para evitar las limitaciones
hg rebase
basically básicamente, no le gusta cambiar la base a un antepasado en la misma rama, con nombre o por defecto, aunque lo permite si se rebase entre ramas (con nombre). Mueva el repositorio (
foo/.hg
) al directorio de trabajo (bar
) y sus archivos. No al revés.
Algunas personas han hablado de crear dos árboles de clones y copiar archivos entre ellos. O parchear entre ellos. En su lugar, es más fácil mover los directorios .hg
.
hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push
Esto funciona siempre que los repositorios verdaderos, el .hg
árboles, son independientes del directorio de trabajo y sus archivos.
Si no son independientes...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 04:17:50
Nunca he usado Mercurial, pero esto suena mucho a lo que Martin Fowler estaba hablando en su blog no hace mucho tiempo:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-29 14:37:30
¿Por qué no simplemente hg strip --keep
comando?
Entonces puedes confirmar todos los cambios como un solo commit.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-23 09:11:58
HistEdit hará lo que quieras, pero probablemente sea exagerado. Si lo único que necesita es plegar algunos conjuntos de cambios, la extensión Collapse hará el trabajo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-30 04:14:25
Supongamos que tienes dos confirmaciones no publicadas THIS
y THAT
en Mercurial y les gusta que se unan en una confirmación única en THIS
punto::
... --> THIS --> ... --> THAT --> ... --> LAST
Comprueba que tus commits no están publicados::
$ hg glog -r "draft() & ($THIS | $THAT)"
Actualización a LAST
commit::
$ hg up
E importar commits hasta THIS
en MQ::
$ hg qimport $THIS::.
No aplicar todos los parches y aplicar solo primero THIS
::
$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...
Unirse con THAT
::
$ hg qfold $THATNAME
NOTA Para encontrar el nombre THATNAME
use::
$ hg qseries
Aplicar todos los parches y moverlos al historial del repositorio::
$ hg qpush -a
$ hg qfinish -a
Mi entrada de blog sobre el tema es Uniendo dos confirmaciones en Mercurial.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-10 20:14:05