Powiedzmy, że mam lokalne i zdalne repozytorium Mercurial. Teraz zaczynam pracę nad funkcją. Pracuję nad tym, a kiedy wydaje mi się, że jest skończony, zatwierdzam zestaw zmian. Testując to nieco dokładniej, stwierdziłem, że mogę dalej ulepszyć tę funkcję, poprawiając coś w kodzie. Dokonuję zmiany i zobowiązuję się. 20 minut później stwierdzam, że jest błąd w tej nowej funkcji, więc naprawiam go i też popełniam.
Mam teraz 3 zestawy zmian, które naprawdę chciałbym wypchnąć do zdalnego repozytorium jako jeden zestaw zmian z komunikatem na przykład „Implementing feature X”.
Jak mogę to zrobić bez większych kłopotów? Myślę, że mógłbym to zrobić z łatkami, ale wydaje mi się, że to dużo pracy.
mercurial
push
compression
changeset
Lucas
źródło
źródło
Odpowiedzi:
A co z rozszerzeniem Collapse ?
źródło
hg rebase --collapse
. Sprawdź wiki hg na temat polecenia rebase. Ponieważ to pytanie jest trzecim ogólnym wynikiem wyszukiwania i pierwszym na stackoverflow, pomyślałem, że informacje mogą być przydatne.hg rebase
z--collapse
zasięgu jednej gałęzi.Histedit rozszerzenie jest dokładnie to, czego szukasz.
lub
wyświetli listę wychodzących zestawów zmian. Z listy możesz
histedit zapyta cię o nowy komunikat zatwierdzenia zwiniętych zestawów zmian, który domyślnie przyjmuje dwa komunikaty z rozdzieleniem "\ n *** \ n".
Możesz również uzyskać podobne wyniki używając rozszerzenia mq, ale jest to o wiele trudniejsze.
Możesz także użyć rozszerzenia zwijania, aby po prostu zawinąć, ale nie zapewnia ono tak przyjemnego interfejsu użytkownika i nie zapewnia sposobu na edycję wynikowego komunikatu o zatwierdzeniu. Edycja wynikowego komunikatu o zatwierdzeniu pozwala również na wyczyszczenie ostatecznego komunikatu, z czego zawsze korzystam.
źródło
Tak, możesz to zrobić za pomocą poprawek: załóżmy, że Twoja praca obejmuje zestawy zmian od 100 do 110 włącznie
Utwórz łatkę:
% hg export -o mypatch 100:110 --git
Zaktualizuj do 99:
% hg update 99
Zastosuj łatkę za pomocą --no-commit (w przeciwnym razie odzyskasz wszystkie zestawy zmian):
% hg import --no-commit mypatch
Zatwierdź wszystkie zmiany naraz:
% hg commit
Masz teraz dwie głowice (110 i 111), które powinny być równoważne pod względem plików, które tworzą w twoim katalogu roboczym - może porównaj je dla rozsądku przed usunięciem starych:
% hg strip 100
OK, teraz, kiedy to wszystko przeliterowałem, wydaje się, że jest to długie, ale zrobiłem to kilka razy sam, nie uważam tego za zbyt trudne ...
źródło
hg strip --keep
a potem popełnia wszystko w jednym zatwierdzeniu?hg strip
umieszcza kopię zapasową w.hg/strip-backup/
katalogu. Wydaje mi się, że nie jest to takie bezpieczne,git reflog
ale nadal zapewnia pewien rodzaj ratunku.Jeśli używasz TortoiseHg, użyj można po prostu wybrać dwie wersje (użyj CTRL, aby wybrać inne niż kolejne), kliknij prawym przyciskiem myszy i wybierz "Kompresuj historię" .
Następnie otrzymasz nową listę zmian w nowej nagłówku, zaczynając od pierwszej zmiany, którą wybrałeś wcześniej, będzie ona zawierać wszystkie listy zmian podrzędnych między tymi, które wybrałeś.
Możesz po prostu usunąć stare listy zmian, jeśli już ich nie potrzebujesz: użyj do tego rozszerzeń MQ . Ponownie w TortoiseHg: kliknij prawym przyciskiem myszy pierwszą listę zmian, która ma zostać usunięta ze wszystkimi jej potomkami, "Modyfikuj historię -> Usuń" .
źródło
Moją preferowaną metodą używania mq do tego składania jest użycie TortoiseHg, jak opisano tutaj . Można to jednak łatwo zrobić z wiersza poleceń, na przykład:
(Może istnieć lepszy sposób wykonania kroku qfold, ale nie jestem tego świadomy, ponieważ zwykle używam TortoiseHg do tej operacji.)
Na początku wydaje się to trochę skomplikowane, ale kiedy zaczniesz używać mq, jest to całkiem proste i naturalne - a ponadto możesz robić wiele innych rzeczy za pomocą mq, które mogą być bardzo przydatne!
źródło
hg collapse
ihg histedit
są najlepszymi sposobami. A raczej byłyby to najlepsze sposoby, gdyby działały niezawodnie ... Whistedit
ciągu trzech minut zderzyłem się ze zrzutem stosu.Collapse
nie jest dużo lepsze.Pomyślałem, że mogę podzielić się dwoma innymi BKM:
hg rebase --collapse
To rozszerzenie jest dystrybuowane z Mercurialem. Nie miałem z tym jeszcze problemów. Być może będziesz musiał zagrać w niektóre gry, aby obejść
hg rebase
ograniczenia - w zasadzie nie lubi zmieniać bazy na przodka w tej samej gałęzi, nazwanej lub domyślnej, chociaż pozwala na to, jeśli zmienia się bazę między (nazwanymi) gałęziami.Przenieś repozytorium (
foo/.hg
) do katalogu roboczego (bar
) i jego plików. Nie na odwrót.Niektórzy mówili o tworzeniu dwóch drzew klonów i kopiowaniu plików między nimi. Albo łatanie między nimi. Zamiast tego łatwiej jest przenosić
.hg
katalogi.Działa to tak długo, jak prawdziwe repozytoria,
.hg
drzewa, są niezależne od katalogu roboczego i jego plików.Jeśli nie są niezależni ...
źródło
histedit
jest bardzo dobrą opcją do tego zadania. Nadal nie ufam temu, ponieważ robię rebase git -i, ale nie ulega awarii .. przynajmniej nowsze wersje zostawią cię w gałęzi tymczasowej, jeśli coś pójdzie nie tak, więc jedyny raz, kiedy zestawy zmian zostaną usunięte jest po zatwierdzeniu nowej gałęzi.Nigdy nie korzystałem z Mercuriala, ale brzmi to bardzo podobnie do tego, o czym Martin Fowler mówił na swoim blogu nie tak dawno:
http://martinfowler.com/bliki/MercurialSquashCommit.html
źródło
Dlaczego nie po prostu
hg strip --keep
rozkazać?Następnie możesz zatwierdzić wszystkie zmiany jako jedno zatwierdzenie.
źródło
HistEdit zrobi, co chcesz, ale prawdopodobnie jest to przesada. Jeśli jedyną rzeczą, której potrzebujesz, jest złożenie kilku zestawów zmian razem, Collapse Extension zrobi to.
źródło
Załóżmy, że masz dwa niepublikowane
THIS
iTHAT
zatwierdzenia w Mercurial i polubisz je, aby dołączyć do jednego zatwierdzenia wTHIS
punkcie:Sprawdź, czy Twoje zatwierdzenia nie zostały opublikowane:
Aktualizacja do
LAST
zatwierdzenia:i import zatwierdzeń do
THIS
do MQ ::Usuń wszystkie łaty i zastosuj tylko najpierw
THIS
:Dołącz do
THAT
:UWAGA Aby znaleźć nazwę,
THATNAME
użyj:Zastosuj wszystkie łatki i przenieś je do historii repozytorium:
Mój wpis na blogu na ten temat to Dołączenie do dwóch zatwierdzeń w Mercurial .
źródło
Tak,
strip --keep
działa na pytanie autora. Ale wyglądało to trochę inaczej niż inne, na przykład, jeśli masz wersję od 1 do 30, ale chcesz zwinąć tylko wersję 12-15. Inne rozwiązania działają, ale niestrip --keep
.źródło