Właśnie zmiażdżyłem niektóre zobowiązania git rebase
i zrobiłem git push --force
(co jest złe, wiem).
Teraz inni inżynierowie oprogramowania mają inną historię, a kiedy to zrobią git pull
, Git się połączy. Czy istnieje sposób, aby to naprawić, z wyjątkiem robienia rm my-repo; git clone [email protected]:my-repo.git
?
Potrzebuję czegoś przeciwnego git push --force
, ale git pull --force
nie dał zamierzonych rezultatów.
git checkout master && git branch -D test && git checkout -b test origin/test
Odpowiedzi:
Aby otrzymać nowe zobowiązania
Resetowanie
Możesz zresetować zatwierdzenie dla lokalnego oddziału za pomocą
git reset
.Aby zmienić zatwierdzenie oddziału lokalnego:
Bądź jednak ostrożny, jak to dokumentuje:
Jeśli chcesz zachować wszystkie zmiany, które wprowadziłeś lokalnie -
--soft
zamiast tego wykonaj reset. Który zaktualizuje historię zatwierdzeń dla gałęzi, ale nie zmieni żadnych plików w katalogu roboczym (a następnie możesz je zatwierdzić).Rebase
Możesz odtworzyć swoje lokalne zatwierdzenia na dowolnym innym zatwierdzeniu / oddziale, używając
git rebase
:Spowoduje to wywołanie rebase w trybie interaktywnym, w którym możesz wybrać sposób zastosowania każdego indywidualnego zatwierdzenia, którego nie ma w historii, której aktualizujesz.
Jeśli zatwierdzenia, które usunąłeś (za pomocą
git push -f
), zostały już wprowadzone do historii lokalnej, zostaną wymienione na liście jako zatwierdzenia, które zostaną ponownie zastosowane - będą musiały zostać usunięte w ramach bazy lub po prostu zostaną ponownie włączone do historii dla oddziału - i pojawi się w odległej historii przy kolejnym wypychaniu.Skorzystaj z pomocy,
git command --help
aby uzyskać więcej informacji i przykładów na temat dowolnego z powyższych (lub innych) poleceń.źródło
git reset origin/otherbranch --hard
reset --hard
, lub Opcja 2:reset --soft
+rebase
, prawda?git reset --soft origin/master
zmieni historię zatwierdzania, aby dopasować zdalne i różnice etapów do zdalnego, które następnie zostaną zatwierdzone . W tym scenariuszu nie byłoby potrzeby dokonywania zmian w bazie (i byłoby to niemożliwe z powodu niezatwierdzonych zmian), ponieważ nie ma różnicy w historii zatwierdzeń. Dwie opcje są resetowane lub rebase - nie kombinacja obu. Proszę zadać pytanie, czy twój scenariusz jest inny niż ten, na który tu odpowiedziałem.Nie naprawi to gałęzi, które już zawierają kod, którego nie chcesz (zobacz poniżej, jak to zrobić), ale jeśli wyciągnęły jakąś gałąź i teraz chcą, aby była czysta (a nie „wyprzedzająca” przed origin / some-branch), a następnie:
Uwaga: Możesz połączyć je wszystkie, umieszczając && między nimi
Uwaga 2: Florian wspomniał o tym w komentarzu, ale kto czyta komentarze, gdy szuka odpowiedzi?
Uwaga 3: Jeśli masz zanieczyszczone gałęzie, możesz utworzyć nowe na podstawie nowej „głupiej gałęzi” i po prostu zatwierdzić wybór.
Dawny:
Teraz nowa funkcja jest twoją gałęzią bez dodatkowych (prawdopodobnie złych) zmian!
źródło
git checkout -b base-branch origin/base-branch
zgit checkout --track origin/base-branch
Pociągnij za pomocą podstawy
Regularne pobieranie to fetch + merge, ale to, czego chcesz, to fetch + rebase. Jest to opcja z
pull
poleceniem:źródło