Git: Odrzuć wszystkie zmiany w rozbieżnej gałęzi lokalnej

117

Mam lokalną gałąź tematyczną, która śledzi gałąź zdalną. Dla celów argumentacji, powiedzmy, że historie zatwierdzeń wyglądają następująco:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Po przyjrzeniu się relatywnym historiom zatwierdzeń chcę teraz odrzucić wszystkie zmiany w phobosgałęzi lokalnej i przywrócić jej bezpośrednią kopię origin/phobos, aby historia lokalna wyglądała następująco:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Naprawdę nie chcę, aby lokalne zmiany w phobosgałęzi i naprawdę nie chcę, aby jakiekolwiek połączenia pojawiały się później w repozytorium pochodzenia. (Więc samo scalanie nie jest tym, co mam na myśli.)

Wydaje się, że powinno to być naprawdę łatwe, ale moje Google-fu mnie zawiodło. Jak mam to zrobic?

Electrons_Ahoy
źródło

Odpowiedzi:

79

Usuń gałąź, a następnie utwórz ją ponownie:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
mipadi
źródło
37
Problem z tym podejściem w porównaniu z resetowaniem główki gałęzi polega na tym, że usunięcie gałęzi powoduje zniszczenie reflogu gałęzi. Z drugiej strony, resetowanie gałęzi nie tylko zachowuje reflog, ale w rzeczywistości rejestruje reset w reflogu. Dzięki temu operację można łatwo odwrócić później, w razie potrzeby.
Dan Molding,
9
@Electrons_Ahoy Sugerowałby zmianę zaakceptowanej odpowiedzi na Dana (aby ludzie tacy jak ja, którzy szukali w Google, jak to zrobić, prawdopodobnie wybrali bezpieczniejszą metodę).
Steve Chambers
4
Odpowiedź @ DanMoulding nie obejmuje usuwania lokalnego oddziału, gdy jest to niepotrzebne. To jest dużo bezpieczniejsze.
brma
@brma: Jak to? Nadal po prostu wskazuje gałąź na nowe zatwierdzenie.
mipadi
5
Odpowiedź Dana Mouldinga jest bezpieczniejsza. Myślę, że powinieneś wybrać ten.
Daniel Apt,
330
git checkout phobos
git reset --hard origin/phobos

Mówi to Gitowi, aby zresetował nagłówek phobosdo tego samego zatwierdzenia, co origin/phobosi zaktualizował drzewo robocze, aby pasowało.

Dan Moulding
źródło
35
IMO powinna to być akceptowana odpowiedź; wydaje polecenie „reset”, aby przeszczepić wskaźnik gałęzi, zamiast wykonywać operację z usunięciem / odtworzeniem.
vdboor
Właściwie to najpierw wypróbowałem to i spowodowało to mnóstwo błędów, które powodowały, że lokalna kopia była prawie bezużyteczna. Usunięcie / odtworzenie mogło być mniej eleganckie, ale nie musiałem zadawać żadnych dodatkowych pytań.
Electrons_Ahoy
3
@Electrons_Ahoy: Hmm, to zdecydowanie nie jest normalne. Wykonanie tego resetu powinno zwykle przebiegać bezproblemowo, jeśli repozytorium jest w dobrym stanie.
Dan Molding
lub nawet jeśli to podejrzane. Użyj git reflog, aby znaleźć drogę do domu, jeśli „przypadkowo” wydałeś to polecenie, nie czytając, co robi. :)
dbn
Działa to również, jeśli jesteś w oddziale i zepsułeś to lokalnie.
slott