2012-03-10 14 views
228

Mam rozwidlone repozytorium, potem zrobiłem kilka zmian i wygląda na to, że wszystko zawiodłem.Oczyść widelec i zrestartuj go od źródła

Chciałbym zacząć od nowa od zera, wykorzystując bieżący upstream/master jako podstawę mojej pracy.
Czy powinienem ponownie dokonać repozytorium lub usunąć go w ogóle?

Odpowiedz

502

Najprostszym rozwiązaniem byłoby (używając „upstream” jako nazwy zdalnego przedstawieniu oryginalnego repo rozdwojony):

git remote add upstream /url/to/original/repo 
git fetch upstream 
git checkout master 
git reset --hard upstream/master 
git push origin master --force 

(podobne do tego GitHub page, section "What should I do if I’m in a bad situation?")

Należy pamiętać, że można stracić zmian wykonano na gałęzi master (zarówno lokalnie, ze względu na reset --hard, jak i na stronie zdalnej, ze względu na push --force).

Alternatywą byłoby, jeśli chcesz zachować swoje zatwierdzenia na master, aby odtworzyć te zatwierdzenia na bieżącym upstream/master.
Wymień część resetowania na git rebase upstream/master. Nadal będziesz musiał wymusić pchnięcie.
Patrz także „What should I do if I’m in a bad situation?


Bardziej kompletne rozwiązanie, cofając się bieżącą pracę (na wszelki wypadek) jest szczegółowo przedstawiony w „Cleanup git master branch and move some commit to new branch”.

Zobacz także "Pull new updates from original GitHub repository into forked GitHub repository", aby zobaczyć, co to jest "upstream".

upstream


Uwaga: ostatnie repo GitHub zrobić protect the master branch przed push --force.
Najpierw musisz najpierw wyłączyć ochronę master (patrz zdjęcie poniżej), a następnie re-protect it after force-pushing).

enter image description here

+0

Inny przykład: https://groups.google.com/group/overtone/msg/ba309fc71f7c03bd – VonC

+3

Witam, zadziałało świetnie! btw poprawna składnia resetu to 'git reset --hard upstream/master' – tampe125

+1

@ tampe125 Excellent. Poprawiłem składnię 'git reset' w odpowiedzi. – VonC

20

odpowiedź Miłość VonC użytkownika. Oto łatwa wersja dla początkujących.

Istnieje pilot git o nazwie origin, który jestem pewien, że wszyscy jesteście świadomi. Zasadniczo możesz dodać dowolną liczbę pilotów do repozytorium git, jak chcesz. Tak więc, możemy wprowadzić nowy pilot, który jest oryginalnym repo, a nie widelcem. Chciałbym to nazwać: original

Dodajmy oryginalne repo do naszego widelca jako pilota.

git remote add original https://git-repo/original/original.git 

Teraz pobrać oryginalny repo, aby upewnić się, mamy najnowszy kodowane

git fetch original 

As, VonC zasugerował, upewnij się, że jesteśmy na pana.

git checkout master 

teraz, aby przynieść widelec na bieżąco z najnowszymi kod na oryginalnej repo, wszystko co musisz zrobić, to twardy reset nasz główny oddział zgodnie z oryginalnego pilota.

git reset --hard original/master 

i gotowe :)

+2

Otrzymuję 'fatal: niejednoznaczny argument 'original/master': nieznana wersja lub ścieżka nie w drzewie roboczym." Na ostatnim kroku. Jakakolwiek rada? – TomNorway

+0

Wygląda na to, że po prostu pozostawisz ci zapas na oryginalnym oddziale. Zakładam, że brakuje kroku, aby zresetować widelec do właściwego pilota? –

+0

'original' jest lepszy niż' upstream' (którego używają Github docs), ponieważ 'origin/master' jest" upstream "lokalnego' master'. Zmniejsza niejednoznaczność. Zastanawiam się, czy to właśnie dlatego go używasz? – vaughan

2

Po @VonC wielką odpowiedź. Nowa polityka GitHub nie zezwala na "wymuszanie push" na master. Jeśli pojawi się komunikat o błędzie podobny do tego, spróbuj wykonać następujące czynności. remote: error: GH003: Sorry, force-pushing to master is not allowed.

Aby skutecznie zresetować widelec trzeba wykonać następujące kroki:

git checkout master 
git reset --hard upstream/master 
git checkout -b tmp_master 
git push origin 

Otwórz swój widelec na GitHub, w „Ustawienia -> Oddziały -> gałąź Default” wybierz „new_master” jako nowych ustawień domyślnych gałąź. Teraz można wymusić impuls na "Mistrza oddziału:

git checkout master 
git push --force origin 

Następnie należy ustawić z powrotem„kapitan”jako domyślnego oddział w ustawieniach GitHub. Aby usunąć "tmp_master":

git push origin --delete tmp_master 
git branch -D tmp_master 

Inne odpowiedzi ostrzegające przed utratą zmiany nadal mają zastosowanie, bądź ostrożny.

Powiązane problemy