Po prostu popełniłem niewłaściwe źródło w moim projekcie za pomocą --force
opcji.
Czy można cofnąć? Rozumiem, że wszystkie poprzednie gałęzie zostały nadpisane za pomocą -f
opcji, więc mogłem schrzanić poprzednie wersje.
git
git-commit
git-push
David van Dugteren
źródło
źródło
Odpowiedzi:
Git generalnie niczego nie odrzuca, ale odzyskanie z tego może nadal być trudne.
Jeśli masz prawidłowe źródło, możesz po prostu wrzucić je do pilota za pomocą
--force
opcji. Git nie usunie żadnych gałęzi, chyba że o tym poprosisz. Jeśli rzeczywiście zgubiłeś zatwierdzenia, zapoznaj się z tym przydatnym przewodnikiem po odzyskiwaniu zatwierdzeń . Jeśli znasz SHA-1 żądanych zatwierdzeń, prawdopodobnie wszystko jest w porządku.Najlepsza rzecz do zrobienia: wykonaj kopię zapasową wszystkiego i zobacz, co jest nadal w lokalnym repozytorium. Jeśli to możliwe, zrób to samo na pilocie. Użyj,
git fsck
aby sprawdzić, czy możesz odzyskać rzeczy, a przede wszystkim NIE biegaćgit gc
.Przede wszystkim nigdy nie używaj tej
--force
opcji, chyba że naprawdę masz to na myśli.źródło
git reflog show remotes/origin/master
. Powinieneś być w stanie zobaczyć tam swój nacisk; zatwierdzenie w poprzedniej linii jest tam, gdzie było, zanim to zepsułeś. Następnie możesz po prostu wrzucić tę wersję (z--force
) do początku i wrócić tam, gdzie byłeś!git fetch
edytowaną przez długi czas) możesz wyświetlić reflog strony GitHub i odzyskać!Jeśli znasz skrót zatwierdzenia, jest to łatwe, po prostu ponownie utwórz gałąź.
Usuń zdalną gałąź:
następnie odtwórz swoją gałąź za pomocą następujących poleceń:
źródło
Rozwiązanie zostało już tutaj wspomniane
źródło
git reflog show remotes/origin/master
jeśli git reflog jest konieczny (jak wspomniano powyżej @ Cascabel)Jeśli nie znajdujesz się w tym lokalnym repozytorium, z którego pochodzi wymuszony push, na poziomie początkowym / głównym nie ma możliwości odzyskania. Ale jeśli masz szczęście korzystać z GitHub lub GitHub for Enterprise , możesz zajrzeć do REST API i odzyskać utracone zatwierdzenie jako łatkę, na przykład:
źródło
Innym sposobem na odzyskanie utraconego zatwierdzenia lub nawet dowiedzieć się, które zatwierdzenia zostały utracone, jeśli poprzednie wypychanie nie pochodziło z lokalnego repozytorium, polega na spojrzeniu na maszynę CI.
Jeśli masz zadanie, które testuje gałąź główną po każdym zatwierdzeniu (lub serii kolejnych zatwierdzeń), które powinieneś wykonać, możesz zobaczyć, co testowało ostatnio. To jest zobowiązanie, które musisz przywrócić.
Maszyna CI może nawet zachować lokalny klon repozytorium, z którego można będzie wykonać to odzyskiwanie.
Źródło: prawdopodobnie ciągła dostawa: niezawodne wydania oprogramowania dzięki automatyzacji kompilacji, testowania i wdrażania (seria Addison-Wesley Signature (Fowler))
źródło
Tak, możesz odzyskać zatwierdzenia po
git push -f your_branch
Możesz więc:
1-
git reflog
2- wybierasz Head_Number, z którym chcesz odzyskać
git reset –hard HEAD@{HEAD-NUMBER}
3- Możesz zobaczyć wszystkie zatwierdzenia na tej głowie według
git cherry -v branch_name
4- w końcu powinieneś wymusić pchnięcie
git push -f branch_name
LUB
1- Uzyskaj liczbę SHA z klienta GIT (interfejsu)
2- siła pchająca
Mam nadzieję że to pomoże
źródło
Zrobiłem to samo, cofając ostatnie naciśnięcie tylko jednego pliku. Skończyło się na przywróceniu pierwotnego stanu repozytorium. Używałem poleceń git od Linusa, ponieważ miałem lokalną kopię w systemie Linux. Na szczęście ta kopia była nadal nienaruszona.
Wszystko, co zrobiłem (po gorączkowym wykonaniu kilku kolejnych kopii lokalnego repozytorium):
(powiedział, że origin / master wyprzedził o 68 commits, dobrze ... to były wszystkie zatwierdzenia, które usunąłem)
I wszystko zostało przywrócone tak, jak było, zanim zrobiłem silny nacisk. Najważniejszą rzeczą do zapamiętania jest to, aby nigdy nie wykonywać transakcji git. po tym, jak mocno pchnąłeś. Ale najlepszą praktyką jest wyłączenie opcji wypychania. Nigdy więcej go nie używam. Nauczyłem się mojej lekcji !!
źródło
Dla osób w naprawdę złych sytuacjach, takich jak ja (na przykład, jeśli otrzymujesz
bad object
błędy podczas uruchamianiagit reset --hard
):Napisałem skrypt o nazwie treesaver, który w ostateczności pobiera wszystkie twoje pliki z GitHub API. Oto jak z niego korzystać:
treesaver
skrypt icd
do niego.SHA
ciąg drzewa, które chcesz przywrócić, uzyskując dostęphttps://api.github.com/repos/<your_username_or_org>/<repo>/events
.payload
właściwości odpowiadającej Twojemu zdarzeniu push znajdź tocommit
, do którego chcesz powrócić, i kliknij jeurl
.commit.tree
skopiujtree
plikurl
.python3 main.py <tree_url> <path_to_save_to>
.Na przykład w moim przypadku uruchomiłbym:
Oczywiście PR mile widziane.
źródło
Tutaj możesz przeczytać decyzje https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it
Drugi mi pomógł. Zrobiłem źle te polecenia
Po tych komendach straciłem trzy commity. Aby je odzyskać, spojrzałem na terminal, w którym źle wykonałem `` git pull '' i zobaczyłem, jak wygląda
60223bf ... 0b258eb jakaś gałąź -> pochodzenie / jakaś gałąź
Drugi skrót 0b258eb był dokładnie tym, czego potrzebowałem. Więc wziąłem ten hash i wydałem polecenie
źródło