Z powodu złej selekcji, moje lokalne repozytorium Git jest obecnie pięć zatwierdzeń przed początkiem i nie jest w dobrym stanie. Chcę pozbyć się tych wszystkich zobowiązań i zacząć od nowa.
Oczywiście usunięcie mojego katalogu roboczego i ponowne klonowanie to by zrobiło, ale ponowne pobranie wszystkiego z GitHub wydaje się przesadą i nie jest dobrym wykorzystaniem mojego czasu.
Być może git revert
jest to, czego potrzebuję, ale nie chcę kończyć 10 zatwierdzeń przed początkiem (lub nawet sześcioma), nawet jeśli przywróci sam kod do właściwego stanu. Chcę tylko udawać, że ostatnie pół godziny się nie wydarzyło.
Czy istnieje proste polecenie, które to zrobi? Wydaje się, że jest to oczywisty przypadek użycia, ale nie znajduję żadnych jego przykładów.
Pamiętaj, że to pytanie dotyczy w szczególności zatwierdzeń , a nie :
- nieśledzone pliki
- zmiany nieetapowane
- zainscenizowane, ale niezaangażowane zmiany
Odpowiedzi:
Jeśli twoje nadwyżki zatwierdzeń są widoczne tylko dla ciebie, możesz po prostu
git reset --hard origin/<branch_name>
cofnąć się do miejsca pochodzenia. Spowoduje to zresetowanie stanu repozytorium do poprzedniego zatwierdzenia i odrzuci wszystkie lokalne zmiany.Wykonanie a
git revert
powoduje, że nowe zatwierdzenia usuwają stare zatwierdzenia w sposób, który pozwala zachować rozsądek w historii wszystkich.źródło
git reset --hard <commit hash, branch, or tag>
jeśli chcesz przejść do określonego odwołania innego niż oddział zdalny.master
ale w innym oddziale, powinieneś biecgit reset --hard origin/<your-branch-name>
git reset --hard origin/<branch_name>
Zresetuje również konfigurację projektu, więc zadbaj o to. Mam duży.cfg
plik, który został zresetowany do wartości domyślnych. Musiałem znów spędzić nad tym godziny.Po prostu usuń lokalną gałąź główną i utwórz ją w następujący sposób:
źródło
git reset --hard origin/<branch_name>
Próbować:
zresetować głowę tam, gdzie chcesz być. Użyj gitk, aby zobaczyć, w którym zatwierdzeniu chcesz być. Możesz zresetować również w gitk.
źródło
Usuń ostatnie zatwierdzenie:
git reset --hard HEAD~1
Usuń ostatni zatwierdzenie, nie niszcząc pracy, którą wykonałeś:
git reset --soft HEAD~1
źródło
Jeśli korzystasz z aplikacji Atlassian SourceTree , możesz skorzystać z opcji resetowania w menu kontekstowym.
źródło
Podczas próby oddziału:
Sprawdź poprawność odwrócenia (do stanu, bez lokalnych zatwierdzeń), używając odtąd „
git log
” lub „git status
”.źródło
Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
git reset --hard @{u}
* usuwa wszystkie lokalne zmiany w bieżącym oddziale, w tym zatwierdzenia. Dziwię się, że nikt tego jeszcze nie opublikował, biorąc pod uwagę, że nie będziesz musiał sprawdzać, co zobowiązuje się do powrotu lub zabawy z oddziałami.* To znaczy, przywróć bieżącą gałąź w -
@{upstream}
częstoorigin/<branchname>
, ale nie zawszeźródło
Aby zobaczyć / uzyskać identyfikator SHA-1 zatwierdzenia, do którego chcesz wrócić
Aby przywrócić do tego zatwierdzenia
!Uwaga. Wszystkie zatwierdzenia dokonane po tym zatwierdzeniu zostaną usunięte (i wszystkie zmiany w projekcie). Najpierw lepiej sklonuj projekt do innej gałęzi lub skopiuj do innego katalogu.
źródło
Miałem sytuację, w której chciałem usunąć zatwierdzenie, które nie zostało wypchnięte, ale zatwierdzenie było wcześniejsze. Aby to zrobić, użyłem następującego polecenia
git rebase -i HEAD~2
-> spowoduje bazowanie dwóch ostatnich zatwierdzeńI użyłem „drop” dla podpisu zatwierdzenia, który chciałem usunąć.
źródło
Usuń nieśledzone pliki (niezatwierdzone zmiany lokalne)
Trwale usuwa wszystkie lokalne zatwierdzenia i pobiera najnowsze zdalne zatwierdzanie
źródło
W przypadku lokalnych zatwierdzeń, które nie są wypychane, możesz także użyć
git rebase -i
do usunięcia lub zmiażdżenia zatwierdzenia.źródło
git rebase -i
jest bardziej ogólnym sposobem rozwiązywania wielu podobnych problemów i może być pomocny w różnych sytuacjach.drop
słowa kluczowego (zamiast usuwania wiersza) podczas usuwania wszystkich zatwierdzeń, aby uniknąć przerwania rebase.Prostym rozwiązaniem będzie dopasowanie lokalnego oddziału HEAD do źródła / oddziału HEAD
PS: origin / master - jest zdalnym wskaźnikiem do gałęzi master. Możesz zastąpić master dowolną nazwą oddziału
źródło
Zanim odpowiemy, dodajmy tło, wyjaśniając, co to jest
HEAD
. ponieważ niektóre z poniższych opcji spowodują odłączenie głowyFirst of all what is HEAD?
HEAD
jest po prostu odniesieniem do bieżącego zatwierdzenia (najnowszego) w bieżącej gałęzi.W
HEAD
danym momencie może być tylko jeden . (z wyłączeniemgit worktree
)Zawartość
HEAD
jest przechowywana w środku.git/HEAD
i zawiera 40 bajtów SHA-1 bieżącego zatwierdzenia.detached HEAD
Jeśli nie korzystasz z ostatniego zatwierdzenia, co oznacza, że
HEAD
nazywa się to wcześniejszym zatwierdzeniem w historiidetached HEAD
.W wierszu polecenia będzie to wyglądało tak: SHA-1 zamiast nazwy gałęzi, ponieważ
HEAD
nie wskazuje ona końca wierzchołka bieżącej gałęziKilka opcji odzyskiwania po odłączeniu HEAD:
git checkout
Spowoduje to pobranie nowej gałęzi wskazującej żądany zatwierdzenie.
To polecenie pobierze do danego zatwierdzenia.
W tym momencie możesz utworzyć gałąź i od tego momentu zacząć pracować.
git reflog
Zawsze możesz również użyć
reflog
.git reflog
wyświetli każdą zmianę, która zaktualizowałaHEAD
i sprawdzenie żądanego wpisu ponownego logowania spowodujeHEAD
powrót do tego zatwierdzenia.Za każdym razem, gdy HEAD zostanie zmodyfikowany, pojawi się nowy wpis w
reflog
Spowoduje to powrót do żądanego zatwierdzenia
git reset --hard <commit_id>
„Przenieś” HEAD z powrotem do żądanego zatwierdzenia.
możesz również korzystać z nich
git rebase --no-autostash
.git revert <sha-1>
„Cofnij” podany zakres zatwierdzania lub zatwierdzania.
Polecenie reset spowoduje „cofnięcie” wszelkich zmian dokonanych w danym zatwierdzeniu.
Nowe zatwierdzenie z łatką cofania zostanie zatwierdzone, podczas gdy oryginalne zatwierdzenie pozostanie również w historii.
Ten schemat ilustruje, które polecenie robi co.
Jak widać,
reset && checkout
zmodyfikujHEAD
.źródło
Dla osób zainteresowanych rozwiązaniem Visual Studio, oto ćwiczenie:
Team Explorer
oknie połącz się z docelowym repozytorium.Branches
kliknij prawym przyciskiem myszy gałąź zainteresowania i wybierzView history
.History
oknie i wybierzReset -> Delete changes (--hard)
.Spowoduje to usunięcie lokalnych zatwierdzeń i zresetowanie stanu repozytorium do wybranego zatwierdzenia. Tzn. Twoje zmiany po wycofaniu repo zostaną utracone.
źródło
Jeśli Twój oddział wyprzedza „
origin/XXX
” o 5 zatwierdzeń.Możesz wydać:
I powinno usunąć ostatnie 5 zatwierdzeń.
źródło
Przyda się to, jeśli popełniłeś jakieś błędy w lokalnej kopii, które chcesz mieć pewność, że nie zostaną przypadkowo zepchnięte do twojego oddziału.
Kod SHA można uzyskać, przeglądając webVersion pulpitu git dla ostatniego zatwierdzenia w gałęzi.
W ten sposób możesz zsynchronizować się z ostatnim zatwierdzeniem w gałęzi.
Możesz to zrobić
git pull
po pomyślnym zakończeniu twardego resetu, aby potwierdzić nic nowego do synchronizacji, tzn. Zobaczysz komunikat.Twój oddział jest aktualny
Origin/<Branch Name>
źródło
Jeśli wprawisz lokalne repozytorium w kompletny bałagan, to niezawodnym sposobem na odrzucenie lokalnych zatwierdzeń w Git jest ...
Z mojego doświadczenia Eclipse dobrze sobie radzi w zmieniającym się świecie. Może jednak być konieczne wybranie dotkniętych projektów w Eclipse i ich wyczyszczenie, aby zmusić Eclipse do ich odbudowania. Sądzę, że inne IDE również mogą wymagać wymuszonej przebudowy.
Zaletą powyższej procedury jest to, że dowiesz się, czy twój projekt opiera się na plikach lokalnych, które nie zostały wprowadzone do git. Jeśli stwierdzisz, że brakuje Ci plików, możesz skopiować je z „my_broken_local_repo” i dodać je do git. Gdy masz pewność, że Twoje nowe lokalne repozytorium zawiera wszystko, czego potrzebujesz, możesz usunąć „my_broken_local_repo”.
źródło
Jeśli chcesz po prostu wyrzucić lokalne zatwierdzenia i zachować modyfikacje wykonane w plikach, wykonaj
git reset @ ~
Inne odpowiedzi dotyczyły twardego resetu
źródło