2012-07-04 12 views
7

Korzystanie git, mogę wyrzucić błędne lub przypadkowe commit używając polecenia podobnegoCofanie starej rewizji w Mercurial (jak resecie GIT)

git reset --soft HEAD^ 

który resetuje aktualną gałąź (tak jak master) do rodzic nadrzędny bieżącej rewizji HEAD^ bez dotykania drzewa roboczego - możesz zastąpić --soft przez --hard, jeśli chcesz również usunąć drzewo robocze.

Ponadto, jeśli chcę, aby pozbyć się z więcej niż jednej popełnić, mogę użyć polecenia jak

git reset --hard 53b94d0 

który sprowadza mnie z powrotem dokładnie do popełnienia 53b94d0 jakby nigdy nie popełnił nic po tym.

Co to jest odpowiednik Mercurial (hg)?

Odpowiedz

19

Chociaż Mercurial nie zapewnia łatwej alternatywy i odstaje od idei zmiennej historii, istnieje kilka sposobów na osiągnięcie czegoś bliskiego. W tym poście opiszę kilka z nich.

Hg wycofywania

Jeśli konkretnie chce cofnąć ostatni popełnić, można użyć:

hg rollback 

który cofnie commit (co nie dotykać drzewa pracę - powinieneś być w stanie podążać za nim za pomocą hg revert --all lub hg update -C, jeśli chcesz zresetować cały katalog roboczy).

hg clone -r

Załóżmy, że chcesz przywrócić repozytorium o nazwie giraffe korekcie 77182fb7451f. Jeśli cd do katalogu nadrzędnego i uruchom:

hg clone -r 77182fb7451f giraffe new-giraffe 
cp giraffe/.hg/hgrc new-giraffe/.hg/ 

Pokochasz więc skończyć z nowym-żyrafa, repozytorium w wersji 77182fb7451f. (The cp jest konieczne w celu zapewnienia, że ​​nowe-żyrafa paths (takie jak „piloty” git jest) poprawnie wskazać repo pochodzenia zamiast do folderu giraffe jak miałoby to domyślnie.)

To szybciej niż przeklonowano z internetu ponieważ tylko kopiuje pliki lokalnie na twoim dysku (i na wielu systemach, twarde łącza je, aby zaoszczędzić jeszcze więcej czasu i miejsca), ale nadal może być bardzo czasochłonne, jeśli twoje repozytorium jest duże.

pas Hg

Jeśli chcesz zrobić bardziej skomplikowane rzeczy modyfikowanie historii commit (który jest nieco zmarszczył brwi na świecie Hg, przy okazji), najpierw włączyć Mercurial Queues extension dodając następujące linie do swojego .hgrc (nie ma potrzeby, aby określić ścieżkę po znaku równości):

[extensions]                  
mq = 

To daje (wśród innych przydatnych rzeczy) komenda hg strip aby całkowicie usunąć changeset i wszystkich jego potomków z repozytorium.W ten sposób można użyć polecenia jak:

hg strip 1cc72d33ea76 

jeśli 1cc72d33ea76 jest pierwszym „zły” changeset w repozytorium, które chcesz usunąć.

Niestety, jest to często trudne do usunięcia dokładnie prawo Zestawienia zmian przy użyciu tej metody i to wszystko jest zbyt proste, by skończyć z wieloma głowicami (które można przeglądać za pomocą hg heads), wymagająca żmudnej wielokrotnego stosowania hg strip zanim będzie można dostać się do miejsca, gdzie chcesz być bez dodatkowych głów.

pas Hg wykorzystujące revsets

Korzystanie hg revsets można usunąć wszystkich przodków . (w aktualnej wersji), które są nie przodkowie rewizji, którą chcesz przywrócić, używając polecenia jak:

hg strip "ancestors(.) and not ancestors(77182fb7451f)" 

Upewnij się do pierwszego biegu:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)" 

który pokaże al l zestawy zmian, które usunęłyby hg strip, abyś mógł się upewnić, że nie wyrządzisz nieodwracalnej szkody w historii commitowania (ponieważ masz kopie zapasowe ... prawda?).

+0

Tak więc, w hg, ekwiwalent kasowania/resetowania jest czymś więcej niż tylko zmianą tego, na co wskazuje znacznik gałęzi, czy jest obecna jakaś zmieniona wersja bazy danych? – jthill

Powiązane problemy