2010-04-20 13 views
58

Jestem użytkownikiem Git, który próbuje użyć Mercurial.Jak mogę zresetować git - hard HEAD na Mercurial?

Oto co się stało: Zrobiłem hg backout w zestawie zmian, który chciałem przywrócić. To stworzyło nową głowę, więc hg poinstruowało mnie, żebym się scalił (domyślam się, że "domyślam się"). Po scaleniu powiedział mi, że muszę jeszcze popełnić. Następnie zauważyłem, że coś złego zrobiłem, rozwiązując konflikt w scaleniu, i zdecydowałem, że chcę mieć wszystko tak, jak przed hg backout, to znaczy chcę, aby ta niezobowiązująca fuzja odeszła. Na Git ten niepowiązany materiał znalazłby się w indeksie, a ja po prostu wykonałbym git reset --hard HEAD, aby go usunąć, ale z tego, co przeczytałem, indeks nie istnieje na Mercurial. Jak więc wycofać się z tego?

+0

możliwym duplikat (http: // stackoverflow. com/pytania/4172753/jak-to-get-RID-of-jakiś-changeset-in-Hg) – binki

Odpowiedz

76

Jeśli nie zostały jeszcze zaangażowani, i to brzmi jak nie można cofnąć wszystkie prace scalania z hg update --clean.

Jednak w nowszych produktach rtęciowych jest przydatne polecenie ponownego scalenia pojedynczego pliku: hg resolve path/to/file.ext. Z hg help resolve:

The available actions are: ... 

4) discard your current attempt(s) at resolving conflicts and 

restartu scaleniu od podstaw: "plik hg determinacja ..." (lub "-a" dla wszystkich nierozwiązanych plików)

+0

Niestety, nadal jestem nieco zdezorientowany: Pobiegłem 'Hg się -C', ale„wycofał się”popełnić jest nadal na czubku mojego oddziału. Myślałem, że to był „oddział duch”, który został stworzony z 'backout', ale działa' 'HG branch' powraca default', więc jestem na głównej gałęzi po wszystkim? – hsribei

+3

Możesz mieć dwie głowy z tą samą gałęzią i to właśnie masz. Obaj nazywają się "default". Jest to bardzo normalna sytuacja w mercurial i ' 'Hg heads' jest polecenie użyć odkryć/zrozumieć. Kiedy prowadził 'Hg backout' to„popełnić wycofał się zmian jako nowych changeset”tak, że stworzył nowy changeset że nie odejdzie w/o heroicznym wysiłkiem. Teraz masz dwie głowy zarówno w gałęzi o nazwie domyślnej. Po 'hg scaleniu' (i zatwierdzeniu go) wrócisz do jednej głowy w gałęzi o nazwie domyślnej. –

+0

Wow, nie wiedziałem o głowach. Dzięki za wskazanie, że obecnie :) – hsribei

19

To jest blisko:

hg update --clean

+4

tak ... chociaż czasami podczas przenoszenia plików wokół (z jednego katalogu do drugiego), a następnie zdecydować się drapać wszystko nie robi tego samego, co 'git reset --hard' zrobiłaby. Ergo - mercurial jest głupie – Agzam

8

HG podręcznika GitConcepts strona wyjaśnia, jak wykonać wiele czynności. git Użytkownicy znają Mercurial.

Mercurial nie ma żadnego wbudowanego zachowania git reset --hard. Jednak rozszerzenie strip zapewnia komendę strip, która robi. Aby go wykorzystać, first enable strip w pliku ~/.hgrc ::

[extensions] 
strip = 

Uwaga: To rozszerzenie w nowym w Mercurial-2.8. Wcześniejsze wersje zawierały komendę strip w urządzeniu mq extension.

Teraz możesz uruchamiać komendy takie jak hg strip lub nawet hg help strip. Aby usunąć zestaw zmian i wszystkie jego elementy podrzędne, po prostu określ ten zestaw zmian jako argument dla hg strip. Na przykład, aby usunąć ostatnie zatwierdzenie właśnie wykonane (po użyciu poleceń, które spowodowały, że hg rollback zgłosiła, że ​​nie ma już żadnej transakcji do wycofania), można usunąć wersję tip. Za każdym razem, gdy uruchomisz to polecenie, kolejna wersja zostanie usunięta. hg strip działania należy uznać za nieodwracalne; nieznani użytkownicy powinni tworzyć kopie zapasowe swoich repozytoriów przed użyciem.

$ hg strip tip 

Na przykład, revsets syntax, I wskazują, że chcę, aby usunąć wszelkie zobowiązuje kopalni, które powodują dodatkowe głowice pokazywany podczas uruchamiania hg heads. Jeśli podasz konkretną wersję w poniższym wyrażeniu innym niż tip, wszystko w bieżącej gałęzi, która nie jest przodkiem wybranej wersji, zostanie przycięte. Wydaje się to być najbliższe zachowaniu, które chcę, gdy wydaję polecenie git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)" 
+2

Mercurial 2.8 i powyżej ma '' strip'' przedłużenie w przypadku jednego tylko chce komendy '' Hg strip'' wyraźnie. Użycie '' mq'' dodaje również wiele innych poleceń zarządzania poprawkami. – davidjb

8

Od git, komendy: [? Jak się pozbyć jakiegoś changeset w GW]

git reset --hard  # reset to last commit  
git clean -df  # delete untracked files 

są równe

hg update --clean # reset to last commit 
hg purge    # delete untracked files 
+7

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. –

+0

'git reset --hard' nie usuwa nieśledzonych plików. – Ruslan

+0

Nie działa dla mnie. 'hg update --clean 18: 8e139889ff02' mówi" zaktualizowane 2 pliki ", jednak kiedy patrzę na log, to jest tam gdzie był. ** UPD **: powiedział, że zresetował pliki do wersji. Jest to jednak tylko połowa zachowania 'git reset --hard'. –

Powiązane problemy