2010-09-21 13 views
37

Zrobiłem duży oops i przydałby mi się pomoc przy cofaniu.Cofnij naciśnięcie hg (wycofanie?)

Mamy dwa repozytoria - dość stabilne repozytorium i repozytorium, w którym pracujemy nad zmianami. Właśnie naprawiłem defekt w naszym stabilnym repozytorium i przesuwałem je do działającego repozytorium. Wyciągnąłem ze stabilnego repozytorium, scaliłem, a następnie przypadkowo przekazałem do stabilnego repozytorium.

Stabilna repozytorium teraz wygląda tak:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

gdzie jest popełnić, które powinny być wierzchołkiem stabilnego repozytorium, b to wszystko rzeczy, które zrobiliśmy w repozytorium rozwoju i c jest punktem, w którym rozgałęziliśmy repozytorium programistyczne.

Jak mogę iść o zrobieniu go z powrotem do:

*a 
| 
*c 

(wiem, że nie mogę zrobić zmiany odejść, ja po prostu patrząc na strukturę funkcjonalną ...)

Przeczytałem kilka rzeczy, które sprawiają, że myślę, że hg wycofanie jest polecenie, którego potrzebuję, ale nie jestem dokładnie pewien, co robi.

Odpowiedz

45

Odwraca ostatnią transakcję, więc zostaniesz z nieskończonym scaleniem, którego musisz użyć, aby uzyskać dostęp do hg update -C.

Jeśli nie chcesz * b (masz go w innym klonie), włącz wbudowane rozszerzenie MQ i uruchom hg strip -r <*b>. Pozbędzie się * b i * scalenia. Domyślnie zapisuje kopię zapasową w przypadku, gdy ponownie zmienisz zdanie.


UPDATE (za @ komentarzu Rudi: przykro mi brakowało „już popychany” część)

Ponieważ seryjnej jest już wypchnięty, NIGDY robić co mi sugerowano wcześniej. E-maile od innych programistów byłyby najlepszym wynikiem.

Czy to zamiast:

hg up -r<*merge> 
hg revert -r<*a> -a 
hg ci -m "undo unintended merge" 

Lub może być bardziej koszerny:

hg up -r<*merge> 
hg backout -r<*merge> --parent<*a> 
+1

Ponieważ scalanie jest już pchane, scalanie-commit nie może być wycofane (push i pull są również transakcjami). Również ta operacja powinna być wykonana w każdej kopii roboczej, która wyciągnęła to zatwierdzenie ze stabilnego repozytorium. – Rudi

+0

Jaka jest różnica między korzystaniem z wycofania a powrotem? Skończyło się na wycofywaniu, ale chciałbym poznać moje opcje (mimo że mam nadzieję, że to się nigdy nie powtórzy!) – Neil

+2

'cofnij' zatwierdza nowy zestaw zmian na podstawie istniejących zestawów zmian, aby skutecznie odwrócić zmiany. 'revert' zmienia twoją kopię roboczą i nie zatwierdza. –

0

hg rollback spowoduje przywrócenie ostatniego zatwierdzenia, usunięcie historii, która w przeciwnym razie zostałaby wykonana.

Więc jeśli zaczniesz z tym:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

Hg wycofywania da:

*a *b 
|/
*c 

pamiętać, że można tylko zrobić hg rollback tylko raz.

Należy wykonać pełną kopię zapasową repozytorium przed wykonaniem wycofania. Aby to zrobić, po prostu hg clone całe repozytorium.

+1

Myślę, że chodzi o wycofanie, a nie wycofywanie. :) –

+0

Właśnie zaktualizowałem ten post, więc nie powinno być OK :) –

2

Myślę, że jest za późno, aby hg rollback skoro już popychany zmiany.

Możesz spróbować użyć rozszerzeń MQ, ale działa to również lokalnie. hg strip zmieni tylko twoje lokalne repozytorium. Można oczywiście spróbować zmodyfikować repo serwera bezpośrednio na serwerze, ale jeśli ktoś go wyciągnął, jest już za późno.

Innym rozwiązaniem jest opisany w chapter 9 z hgbook w przekroju wycofania się scalanie. Zawiera on polecenie hg backout, ale może to być dla ciebie przesada ...

Proponuję hg update -C na * wersję, scalić z napiwkiem i zignorować wszystkie zmiany od * scalania? Repozytorium będzie wyglądać mniej więcej tak niż:

*second merge 
| \ 
| \ 
| \  
|  \ 
*merge | 
| \ | 
| \ | 
| *b | 
*a |/
|// 
*c--- 

polecenia do tego są

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

Więcej szczegółów mogą być znalezione here.

0

Wszyscy obecni mało skomplikowane rozwiązanie tego problemu, który może wystąpić dla każdego z nas.

Co zrobiłem, zalogowałem się na zdalnym pulpicie do mojego centralnego repozytorium, a tam z rozszerzeniem mq zmieniono status wersji na "draft" i "stip" -ed one.

Jedynym minusem tego jest to, że jeśli ktoś ma kopię repo z usuniętymi wersjami i będzie naciskał, pojawią się ponownie. Więc jeśli można poprosić innych do a) zrobić to samo (tryb draft, pasek) b) skreśla się z lokalnym repozytorium i zsynchronizować z zmodyfikowano jeden

Wszystko można osiągnąć łatwo TortoiseHg.