Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

31. 1. 2011 Ostatní

Spojení changesetů v mercurialu

Verzovací systém Mercurial jak známo hodně lpí na historii a jednoduše měnit historii jde proti jeho duchu. Nicméně někdy by se to hodilo. Jeden z příkladů může být situace, když pracujete na nějakém úkolu delší dobu, commitujete a commitujete a když by jste chtěli pushnout, tak by se občas hodilo pushnout to celé jako jeden celek, spojit to do jednoho.

Osobně jsem si zvykl na to, že se snažím mít před koncem práce vše commitnuté. I když se snažím commitovat po malých souvisejících krocích, kde nějaké spojování není příliš potřeba, občas - zejména když se dělá na něčem větším - není moc důvod pushovat do upstreamu po částech, protože se v jednotlivých commitech nacházejí řešení různých slepých cest apod.

V mercurialu to můžete udělat několika způsoby. Já popíši ten z mého pohledu přímočarý. Využívá docela pěknou fintu s příkazem hg revert, kdy revertujete tak trochu "do budoucnosti". Takže jsme v situaci, kdy máme pocommitováno s ukol - cast1 a ukol - cast2 a před pushnutím bychom je potřebovaly spojit do jednoho.

@  changeset:   3941:b7a6df85f091
|  tag:         tip
|  summary:     ukol - cast2
|
o  changeset:   3940:b9b75d5764f7
|  summary:     ukol - cast1
|
o  changeset:   3939:d5465e864022
|  summary:     pred ukolem
|

První co uděláme, že se updatneme na revizi, která se nachází před našimi commity, které chceme spojit.

$ hg update 3939

o changeset:   3941:b7a6df85f091
|  tag:         tip
|  summary:     ukol - cast2
|
o  changeset:   3940:b9b75d5764f7
|  summary:     ukol - cast1
|
@  changeset:   3939:d5465e864022
|  summary:     pred ukolem
|

Následuje ta hlavní finta, revertujeme na tip - v podstatě "dopředu" - čímž se vlastně dostaneme do koncového stavu všech našich změn. A následně commitujeme s textem, který popíše naše změny jako celek.

$ hg revert --all -r tip
$ hg ci -A -m "ukol - vsechno hotovo"
Changeset: e0607fa5c68727363c7f110e6a3016e7f51b87ac
created new head

Mercurial nám samozřejmě vytvořil novou branche - vznikl nový head.

@  changeset:   3942:e0607fa5c687
|  tag:         tip
|  parent:      3939:d5465e864022
|  summary:     ukol - vsechno hotovo
|
| o  changeset:   3941:b7a6df85f091
| |  summary:     ukol - cast2
| |
| o  changeset:   3940:b9b75d5764f7
|/   summary:     ukol - cast1
|
o  changeset:   3939:d5465e864022
|  summary:     pred ukolem

Teď už jen se zbavit těch původních commitů, dříve se to muselo řešit přes klonování repositáře, nyní však je přímo součástí mercurialu velmi příjemná a oblíbená extenze strip, která přeci jen trochu nabourává zvyklost neměnné historie repositáře. Navíc vám i ty odříznuté změny uloží do zálohy, kdyby jste se k nim snad někdy chtěli vrátit.

$ hg strip 3940

@  changeset:   3940:e0607fa5c687
|  tag:         tip
|  summary:     ukol - vsechno hotovo
|
o  changeset:   3939:d5465e864022
|  summary:     pred ukolem

A teď už můžeme pushovat změny související s daným úkolem jako celek.

Tohle celé jsem samozřejmě nevymyslel, je to popsáno na wiki mercurialu, jsou tam i pěkné obrázky, popsána možnost jak to celé udělat v mq (což moc neovládám) a odkázány další užitečné věci, které by se mohli hodit pro modifikaci historie repositáře.


Komentáře (0)

Komentáře jsou uzavřeny.