Oczyść widelec i ponownie uruchom go od strony początkowej

396

Rozwidliłem repozytorium, a następnie dokonałem pewnych zmian i wygląda na to, że wszystko popsułem.

Chciałbym zacząć od nowa od podstaw, wykorzystując aktualny upstream / master jako podstawę mojej pracy.
Czy powinienem zmienić bazę mojego repozytorium, czy w ogóle go usunąć?

tampe125
źródło
4
Bardzo złożone odpowiedzi na proste pytanie. Wystarczy usunąć wszystko i ponownie sklonować repozytorium.
Yaza,
1
@Yaza, nie, może to spowodować jeszcze więcej problemów w niektórych scenariuszach.
Shimmy Weitzhandler,
@ shimmy, nie jeśli chcesz zacząć od nowa od zera, tak jak poprosił OP.
Yaza

Odpowiedzi:

796

Najprostszym rozwiązaniem byłoby (użycie „ upstream” jako nazwy zdalnej odwołującej się do pierwotnego repozytorium repo):

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

(Podobnie do strony GitHub, sekcja „Co powinienem zrobić, jeśli jestem w złej sytuacji?” )

Pamiętaj, że możesz utracić zmiany dokonane w mastergałęzi (zarówno lokalnie, z powodu reset --hard, jak i zdalnej, z powodu push --force).

Alternatywą byłoby, jeśli chcesz zachować swoje zatwierdzenia master, odtworzyć je na bieżącym upstream/master.
Wymień część resetowania na git rebase upstream/master. Nadal będziesz musiał wymusić push.
Zobacz także „ Co powinienem zrobić, jeśli jestem w złej sytuacji?


Bardziej kompletne rozwiązanie, tworzenie kopii zapasowej bieżącej pracy (na wszelki wypadek) opisano szczegółowo w „ Oczyszczanie gałęzi master git i przeniesienie niektórych zmian do nowej gałęzi ”.

Zobacz także „ Pobierz nowe aktualizacje z oryginalnego repozytorium GitHub do rozwidlonego repozytorium GitHub ”, aby zilustrować, co to jest „ upstream”.

pod prąd


Uwaga: ostatnie repozytoria GitHub chronią masteroddział przed push --force.
Będziesz musiał masternajpierw odblokować ochronę (patrz zdjęcie poniżej), a następnie ponownie zabezpieczyć ją po naciśnięciu siły ).

wprowadź opis zdjęcia tutaj


Uwaga: konkretnie w serwisie GitHub dostępny jest (luty 2019 r.) Skrót do usuwania rozwidlonych repozytoriów dla żądań ściągania, które zostały scalone w górę.

VonC
źródło
4
cześć, działało świetnie! przy okazji poprawna składnia resetu togit reset --hard upstream/master
tampe125
1
@ tampe125 Excellent. Poprawiłem składnię git resetw odpowiedzi.
VCC,
fatal: „upstream” nie wydaje się być repozytorium git
Benubird
@Benubird, czyli nazwa pilota odwołującego się do oryginalnego repozytorium (tego, który rozwidliłeś): zobacz wykres i polecenia „ git remote” w stackoverflow.com/a/3903835/6309 .
VonC
Zgadza się, ale z twojego pytania nie wynika, jak to skonfigurować, ponieważ domyślnie „upstream” nie jest zdefiniowany w wierszu poleceń, gdy rozwidlałem się przez github.
Benubird,
31

Uwielbiam odpowiedź VonC. Oto prosta wersja dla początkujących.

Istnieje zdalny git, o originktórym jestem pewien, że wszyscy jesteście tego świadomi. Zasadniczo możesz dodać dowolną liczbę pilotów do repozytorium git, jak chcesz. Możemy więc wprowadzić nowego pilota, który jest oryginalnym repozytorium, a nie widelcem. Lubię to nazywaćoriginal

Dodajmy oryginalne repo do naszego widelca jako pilota.

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

Teraz pobierzmy oryginalne repozytorium, aby upewnić się, że mamy najnowszy kodowany

git fetch original

Jak sugerował VonC, upewnij się, że jesteśmy mistrzem.

git checkout master

Teraz, aby przyspieszyć rozwidlenie dzięki najnowszemu kodowi oryginalnego repo, wszystko, co musimy zrobić, to mocno zresetować naszą gałąź master zgodnie z oryginalnym pilotem.

git reset --hard original/master

I gotowe :)

Ahmad Awais
źródło
2
Przechodzę fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.do ostatniego kroku. Jakakolwiek rada?
TomNorway
Wygląda na to, że po prostu zostawiasz zapasy w oryginalnej oddziale zdalnym. Zakładam, że brakuje kroku, aby zresetować TWÓJ widelec z powrotem do właściwego pilota?
Ray Suelzer
1
originaljest lepszy niż upstream(którego używają dokumenty Github), podobnie jak origin/master„upstream” od local master. Zmniejsza niejednoznaczność. Zastanawiam się, czy to dlatego go używasz?
vaughan
1
Właśnie dlatego go używam!
Ahmad Awais,
2
Postępowałem zgodnie z tymi instrukcjami, a teraz status git mówi: On master master Twój oddział i 'origin / master' są rozbieżne i mają odpowiednio 52 i 5 różnych zatwierdzeń. (użyj „git pull”, aby połączyć zdalną gałąź z twoją) - ale chcę odrzucić moje 5 zatwierdzeń. Jaki jest następny krok?
user3562927,
6

Po @VonC świetna odpowiedź. Zasady firmy GitHub mogą nie zezwalać na „wymuszanie wypychania” na wzorcu.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Jeśli pojawi się taki komunikat o błędzie, spróbuj wykonać następujące czynności.

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

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

Otwórz widelec na GitHub, w „Ustawienia -> Oddziały -> Domyślna gałąź” wybierz „new_master” jako nową domyślną gałąź. Teraz możesz wymusić wciśnięcie gałęzi „master”:

git checkout master
git push --force origin

Następnie należy ustawić „master” jako domyślną gałąź w ustawieniach GitHub. Aby usunąć „tmp_master”:

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

Nadal obowiązują inne odpowiedzi ostrzegające o utracie zmiany, zachowaj ostrożność.

Hugodby
źródło
4

Jak to zrobić w 100% poprzez GUI Sourcetree

(Nie wszyscy lubią robić rzeczy za pośrednictwem interfejsu wiersza poleceń git)

Po skonfigurowaniu wystarczy wykonać tylko kroki 7-13.

Pobierz> gałąź główna kasy> zresetuj urządzenie główne> Przekaż zmiany na serwer

Kroki

  1. Na pasku narzędzi menu u góry ekranu: „Repozytorium”> „Ustawienia repozytorium”

„Repozytorium” podświetlone na górnym pasku menu

  1. "Dodaj"

Przycisk „Dodaj” u dołu okna dialogowego

  1. Wróć do GitHub i skopiuj sklonowany adres URL.

Przycisk „Klonuj lub pobierz” na stronie Github, a następnie adres URL git

  1. Wklej adres URL w polu „URL / Ścieżka”, a następnie nadaj mu nazwę, która ma sens. Nazwałem to „mistrzem”. Nie zaznaczaj pola wyboru „Domyślny zdalny” . Nie będzie można przesyłać bezpośrednio do tego repozytorium.

Pola „Nazwa zdalna” i „Adres URL / ścieżka” wyróżnione w oknie dialogowym „Szczegóły zdalne”

  1. Naciśnij „OK” i powinieneś zobaczyć, że pojawi się teraz na liście repozytoriów.

repozytorium „master” dodane do listy repozytoriów w oknie dialogowym „Ustawienia repozytorium”

  1. Naciśnij ponownie „OK”, a powinieneś zobaczyć go na liście „Piloty”.

repozytorium „master” wyróżnione na liście pilotów na pasku bocznym

  1. Kliknij przycisk „Pobierz” (lewy górny róg obszaru nagłówka drzewa źródłowego)

Przycisk „Pobierz” w obszarze nagłówka

  1. Upewnij się, że pole wyboru „Pobierz ze wszystkich pilotów” jest zaznaczone i naciśnij „ok”

Pole wyboru „Pobierz ze wszystkich pilotów” zaznaczone w oknie dialogowym „Pobierz”

  1. Kliknij dwukrotnie gałąź „master”, aby ją sprawdzić, jeśli jeszcze nie jest wyewidencjonowana.

  2. Znajdź zatwierdzenie, które chcesz zresetować, jeśli nazwiesz repo „master”, najprawdopodobniej będziesz chciał znaleźć zatwierdzenie ze znacznikiem „master / master”.

Przykład zatwierdzenia ze znacznikiem „master / master”

  1. Kliknij prawym przyciskiem myszy na zatwierdzenie> „Zresetuj bieżącą gałąź do tego zatwierdzenia”.

  2. W oknie dialogowym ustaw pole „Tryb pracy:” na „Twarde odrzucanie wszystkich zmian kopii roboczej”, a następnie naciśnij „OK” (pamiętaj, aby wszelkie zmiany, których nie chcesz stracić, najpierw umieścić w osobnej gałęzi).

Podświetlone pole „Using mode” w oknie dialogowym „Reset to commit”.  Jest ustawiony na „odrzucenie wszystkich zmian kopii roboczej”

  1. Kliknij przycisk „Naciśnij” (w lewym górnym rogu obszaru nagłówka drzewa źródłowego), aby przesłać zmiany do kopii repozytorium.

Przycisk „Naciśnij” w obszarze nagłówka

Jesteś skończony!

Daniel Tonon
źródło