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.
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.
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.
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łąź.
5794458...b459f069 master -> master (forced update)
Usuń zdalną gałąź:
git push origin :master
następnie odtwórz swoją gałąź za pomocą następujących poleceń:
git checkout 5794458
git branch master
git push origin master
Rozwiązanie zostało już tutaj wspomniane
# work on local master
git checkout master
# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}
# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)
# finally, push the master branch (and only the master branch) to the server
git push -f origin master
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:
https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de
git zastosuj patch.patch && git commit -m "restored commit" && git push origin master
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))
Tak, możesz odzyskać zatwierdzenia po git push -f your_branch
Tekst z dokumentu :
Wyczyść wpisy starsze niż określony czas. Jeśli ta opcja nie jest określona, czas wygaśnięcia jest pobierany z ustawienia konfiguracyjnego gc.reflogExpire, które z kolei wynosi domyślnie 90 dni. --expire = wszystkie wpisy dotyczące suszonych śliwek niezależnie od ich wieku; --expire = nigdy nie wyłącza przycinania osiągalnych wpisów (ale zobacz --expire-unreachable).
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)
git reset --hard commit_SHA
2- siła pchająca
git push -f your_branch
Mam nadzieję że to pomoże
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):
git add .
git status
(powiedział, że origin / master wyprzedził o 68 commits, dobrze ... to były wszystkie zatwierdzenia, które usunąłem)
git remote set-url origin <GIT_SSH_URL>
git push
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 !!
Dla osób w naprawdę złych sytuacjach, takich jak ja (na przykład, jeśli otrzymujesz bad object
błędy podczas uruchamiania git 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 i cd
do niego.SHA
ciąg drzewa, które chcesz przywrócić, uzyskując dostęp
https://api.github.com/repos/<your_username_or_org>/<repo>/events
.payload
właściwości odpowiadającej Twojemu zdarzeniu push znajdź to commit
, do którego chcesz powrócić, i kliknij je url
.commit.tree
skopiuj tree
plik url
.python3 main.py <tree_url> <path_to_save_to>
.Na przykład w moim przypadku uruchomiłbym:
python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .
Oczywiście PR mile widziane.
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
1) (some-branch) git pull -> correct command was git pull origin some-branch
2) (some-branch) git push -f origin some-branch
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
git push --force origin 0b258eb:some-branch