Jak uzyskać określoną wersję pliku w Mercurial?

114

Jestem nowy w Mercurial. Po prostu nie mogę znaleźć odpowiedniego polecenia. Próbowałem aktualizacji / kasy bez powodzenia. Korzystam z lokalnego repozytorium. Dzięki

Kodyzm
źródło
@ Omnifarious: Popełniłem stabilną wersję pliku. Następnie kontynuowałem pracę nad plikiem, ale wkrótce zdałem sobie sprawę, że potrzebuję ostatniej „dobrej” wersji. Można to zrobić przez aktualizację w svn, ale kiedy próbuję zaktualizować hg,
pojawia się komunikat

Odpowiedzi:

153

Myślę, że chcesz hg revert -r<rev> <file>(spowoduje to zmianę tego pliku na taki, jaki był w danej wersji).

djc
źródło
Tak, właśnie tego chce. :-)
Omnifarious
9
lub po prostu hg przywróć <nazwa pliku>, jeśli chcesz odrzucić bieżące zmiany i uzyskać najnowsze
zatwierdzone
@BlackTigerX Bez rewizji niezmodyfikowany plik nie zostanie przywrócony do niczego, nawet jeśli nie jest to ostatnio zatwierdzona wersja. Czasami używam tego do `` wybierania '' plików między wersjami, więc jest to ważne.
user2864740
83

Jak powiedział djc, revertzmienia plik w miejscu, aby pasował do poprzedniej wersji. Jeśli chcesz, aby nie było go na miejscu, możesz użyć hg cat -r revisionid filename(oczywiście zastępując identyfikator rewizji i nazwę pliku), co spowoduje wyświetlenie pliku na stdout, odpowiednie do przekierowania w dowolne miejsce.

Ry4an Brase
źródło
4
mruczenie, dokładnie to, czego sobie życzyłem.
yota
Świetnie, zawsze miło jest usłyszeć coś takiego.
Ry4an Brase
24

hg revertrzeczywiście rozwiązuje ten problem. Ale myślę, że jesteś zdezorientowany w szerszym zakresie rzeczy niż zwykła odpowiedź na swoje pytanie i chcesz spróbować odpowiedzieć pełniej.

hg updateto polecenie dotyczące całego repozytorium i nie będzie działać na pojedynczych plikach. W ten sposób nie przypomina wywrotu svn update. Jeśli tak hg --help update, możesz zobaczyć, że tak jest, ponieważ polecenie nie przyjmuje argumentu plikowego. Można go użyć do przeniesienia całego repozytorium do określonej migawki, ale nie można go użyć do zrobienia tego tylko do jednego pliku.

Jeśli wpiszesz hg --help, zobaczysz listę poleceń. Jest to dość obszerna i nieco zniechęcająca lista, ale jeśli ją przeczytasz, znajdziesz następującą linię:

revert       restore individual files or directories to an earlier state

Teraz, jeśli chcesz tylko ostatni stan do celów porównawczych, istnieje inne polecenie, które może Cię zainteresować, i to jest hg cat. Umożliwi to wydrukowanie zawartości pliku w dowolnej wersji. Następnie możesz przekierować jego wyjście do innego pliku. Następnie możesz mieć poprzednią znaną dobrą wersję pliku i starszą wersję do porównania obok siebie.

Powodem, dla którego Mercurial ma oddzielne updatepolecenie, jest to, że w Mercurial można zrobić coś, co jest niemożliwe w Subversion. Możesz updatedo wcześniejszej wersji, wprowadzić zmiany, a następnie zatwierdzić. Spowoduje to utworzenie gałęzi. updatePolecenie ma wpływ także zmiany rewizji nadrzędny bieżącego katalogu roboczego, a także zmieniając zawartość wszystkich plików w tym katalogu do wersji rodzic rewizji za.

Oznacza to, że revertzmienia zawartość pliku (lub nawet całego repozytorium, jeśli podasz komendzie odpowiednie argumenty), ale pozostawia tę samą wersję nadrzędną bieżącej kopii roboczej.

Możesz znaleźć wersję nadrzędną (lub wersje w przypadku scalania) bieżącej kopii roboczej za pomocą hg parentspolecenia.

W wersjach Subversion zmiany są ściśle liniowe. Mercurial tworzy gałęzie w mgnieniu oka i prawie tak łatwo je scalić. Rewizje tworzą DAG, a nie ściśle liniową progresję.

Wszelaki
źródło
13

Aby wyodrębnić określoną wersję określonego pliku, możesz to zrobić w systemie Windows:

hg cat "<FileToBeExtractedPath>" -r 9 > "<ExtractionPath>"

Tutaj 9 to numer wersji.

Albo jeszcze lepiej:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>"
user2173353
źródło
1

Przyjechałem tutaj, próbując pobrać poprzednią wersję, więc oto dokładne polecenie:

hg revert -r .~1 <file>
cmcginty
źródło