Zastępowanie mojego lokalnego oddziału oddziałem zdalnym

153

Całkowicie skompletowałem swój lokalny oddział i chciałbym zacząć od nowa. Wersja na serwerze jest poprawna.

Nie chcę zaczynać od nowa, chciałbym wykorzystać moją lokalną historię, aby naprawić mój wielki błąd. (Mogę, jeśli muszę.)

git fetch branchnamei git pull branchnamenie działa. Otrzymany komunikat jest „ aktualny ”, jednak moja lokalna wersja nie jest zgodna z wersją na serwerze.

git pull origin/branchnamewyświetla mi błąd „ nie znaleziono ”.

Sara Chipps
źródło

Odpowiedzi:

248

najpierw utwórz nowy oddział w bieżącej pozycji (na wypadek, gdybyś potrzebował swojej starej „schrzanionej” historii):

git branch fubar-pin

zaktualizuj listę zdalnych oddziałów i zsynchronizuj nowe zatwierdzenia:

git fetch --all

następnie zresetuj swój oddział do punktu, w którym początek / gałąź wskazuje:

git reset --hard origin/branch

uważaj , to usunie wszelkie zmiany z twojego drzewa roboczego !

knittl
źródło
2
+1, ale możesz dodać przypomnienie do zrobienia git fetch originprzed zresetowaniem
Mark Longair
Zrobiłem to z jedną drobną zmianą i nie zadziałało: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (inne rzeczy), reset git --hard origin / branch. Efekt końcowy był taki, że nadal byłem na starym zatwierdzeniu. Tak więc to podejście może działać w niektórych przypadkach, ale myślę, że nie działa we wszystkich.
greggles
@greggles: Jakieś błędy? Po ostatnim poleceniu HEAD musi wskazywać na początek / gałąź.
knittl
1
@Gavin: nie, w żadnym wypadku nie wpłynie to na inne gałęzie niż origin/branch. Nigdy.
knittl
1
@greggles Wiem, że jest już bardzo późno, ale dla innych osób zastanawiających się, dlaczego tak się może stać, to podejście zadziała tylko wtedy, gdy masz wyewidencjonowaną gałąź. To nie zadziałało, ponieważ byłeś w odłączonym stanie HEAD (HEAD wskazuje na zatwierdzenie, a nie gałąź) i te polecenia działają tylko wtedy, gdy HEAD wskazuje na gałąź. Kiedy to zrobisz, git resetgdy GŁOWA wskazuje gałąź, ta gałąź podąży za nią.
Michael Dorst
60

To, co robię, gdy psuję mój lokalny oddział, to po prostu zmieniam nazwę mojego zepsutego oddziału i ponownie sprawdzam / rozgałęziam gałąź upstream:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Następnie, jeśli jesteś pewien, że nie chcesz niczego ze swojej starej gałęzi, usuń ją:

git branch -D branch-old

Ale zwykle zostawiam starą gałąź lokalnie, na wypadek, gdyby coś tam było.

Casey Marshall
źródło
4
Wydaje się, że to najlepsza odpowiedź. Pomaga to w tworzeniu kopii zapasowej na wszelki wypadek i wydaje się bardzo prawdopodobne, że lokalny oddział będzie dokładną kopią zdalnego.
greggles
Świetna odpowiedź, przydatna dla mnie. Jedno P: Wydaje się, że oficjalna dokumentacja git-checkout mówi, że twoje trzecie polecenie powinno brzmieć: git checkout -b <branch> --track <remote>/<branch>Czy twoje działa równie dobrze, bez --track?
Starman
1
Myślę, że zmienna config branch.autoSetupMerge(która, jak sądzę, domyślnie jest prawdziwa) tworzy --trackniejawne. I tak, we wszystkich moich konfiguracjach git nie muszę jawnie --trackrobić checkout -b, ale YMMV.
Casey Marshall,
5

Twój lokalny oddział prawdopodobnie zawiera modyfikacje, które chcesz odrzucić. Aby to zrobić, musisz użyć, git resetaby zresetować głowicę gałęzi do ostatniego miejsca, w którym oddzieliłeś się od gałęzi repozytorium upstream. Użyj, git branch -vaby znaleźć identyfikator sha1 gałęzi upstream i zresetuj swoją gałąź za pomocą git reset SHA1ID. Wtedy powinieneś być w stanie wykonaćgit checkout aby odrzucić zmiany, które pozostawił w twoim katalogu.

Uwaga: zawsze rób to na kopii zapasowej repozytorium. W ten sposób możesz mieć pewność, że działało dobrze. A jeśli nie, masz kopię zapasową, do której możesz wrócić.

Wes Hardaker
źródło
Wydaje się, że to prawdopodobnie zadziała, ale biorąc pod uwagę prostotę i niezawodność podejścia „zrób kopię swojej pracy w innym miejscu, zrób nową kopię zdalnej gałęzi”, nie widzę, jak to jest lepsze.
greggles
2
git reset --hard

Ma to na celu przywrócenie wszystkich lokalnych zmian do głowy pochodzenia

Karthikeyan Varadarajan
źródło