Czy istnieje sposób na odzyskanie niezatwierdzonych zmian w katalogu roboczym z katalogu git reset --hard HEAD?
git reset --hard somewherejest jednym z niewielu naprawdę niebezpiecznych poleceń git.
Czy istnieje sposób na odzyskanie niezatwierdzonych zmian w katalogu roboczym z katalogu git reset --hard HEAD?
git reset --hard somewherejest jednym z niewielu naprawdę niebezpiecznych poleceń git.
Odpowiedzi:
Państwo nie może wrócić niezatwierdzone zmiany w ogóle.
Wcześniej ustawione zmiany ( git add) powinny być możliwe do odzyskania z obiektów indeksu, więc jeśli tak, użyj git fsck --lost-founddo zlokalizowania powiązanych z nimi obiektów. (Spowoduje to zapisanie obiektów w .git/lost-found/katalogu; stamtąd można użyć git show <filename>do wyświetlenia zawartości każdego pliku.)
Jeśli nie, odpowiedź brzmi: spójrz na swoją kopię zapasową. Być może twój edytor / IDE przechowuje kopie tymczasowe pod / tmp lub C: \ TEMP i tym podobne. [1]
git reset HEAD@{1}
Spowoduje to przywrócenie poprzedniej HEAD
[1] vim np. Opcjonalnie przechowuje trwałe cofanie, Eclipse IDE przechowuje lokalną historię ; takie funkcje mogą zaoszczędzić **
odpowiedź z tego SO
$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}
203e84e HEAD@{1}: reset: moving to HEAD@{1}
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug
# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}
Wróciłeś dzień! :)
git checkout HEAD@{19}pozwoliło mi sprawdzić utracone pliki w stanie odłączonym. Następnie używane git checkout -b new-branch-namedo dodawania ich z powrotem do repozytorium w stanie „załączonym”.
git checkout -b new-branch-name. Książka Pragmatic Version Control Korzystanie z Git dobrze objaśnia Git w prostych słowach.
Przypadkowo uruchomiłem git reset --harddziś moje repozytorium, jednocześnie wprowadzając nieproszone zmiany. Aby go odzyskać, pobiegłem git fsck --lost-found, do którego zapisałem wszystkie niepowiązane obiekty BLOB <path to repo>/.git/lost-found/. Ponieważ pliki nie zostały zatwierdzone, znalazłem je w otherkatalogu w katalogu <path to repo>/.git/lost-found/. Stamtąd mogę zobaczyć nieprzypisane pliki za pomocą git show <filename>, skopiować obiekty BLOB i zmienić ich nazwy.
Uwaga: Działa to tylko wtedy, gdy dodałeś pliki, które chcesz zapisać do indeksu (używając git add .). Jeśli pliki nie były w indeksie, zostały utracone.
lost-found. Ale wtedy mógłbym zrobić, git showaby uzyskać zawartość.
#!/bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES=* COUNTER = 0 for f in $FILES do echo "Processing $f file..." git show $f > "PATH_TO_RECOVERY_DIRECTORY/$COUNTER.m" let COUNTER=COUNTER+1 done
Tak, MOŻESZ ODZYSKAĆ od twardego resetu w git.
Posługiwać się:
git reflog
aby uzyskać identyfikator swojego zatwierdzenia. Następnie użyj:
git reset --hard <commit-id-retrieved-using-reflog>
Ta sztuczka uratowała mi życie kilka razy.
Dokumentację reflogu można znaleźć TUTAJ .
git reset --hardużyciu innego może wydawać się sprzeczne z intuicją, git reset --hardale jeśli nie użyjesz --hardprzełącznika, pozostaną Ci pozycje w obszarze roboczym, które skutecznie przywróciłyby właśnie odzyskaną pracę.
git lognie widziałem identyfikatora zatwierdzenia. Z git reflogWidziałem identyfikator zatwierdzenia
Podczas pracy nad projektem lokalnym chciałem przenieść go do GitHub, a następnie utworzyć nowe repozytorium. Kiedy próbowałem dodać wszystkie te pliki do nowego repozytorium za pomocą .gitignore, przypadkowo dodałem niewłaściwy plik, a następnie próbowałem go wyczyścić.
Uruchomiłem git reset --hard origin/master: P
Następnie wszystkie moje lokalne pliki zostały usunięte, ponieważ repo było puste. Myślałem, że wszystko zniknęło.
To uratowało mi życie:
git reflog show
git reset HEAD@{1}
git push
Mam nadzieję, że ocali kolejne życie.
git reset HEAD@\{27\} Dziękuję!
git reflog showdo sprawdzania i od pierwszego zatwierdzenia używamgit reset HEAD@{number}
Jeśli używasz czegoś takiego jak IntelliJ:
W menu kontekstowym wybierz Historia lokalna i kliknij Pokaż historię w podmenu:
Widok lokalnej historii projektu lub folderu pokazuje wszystko, co zrobiłeś w ciągu ostatnich kilku dni. W kolumnie Akcja w dolnej części okna dialogowego wybierz akcję, którą chcesz wycofać. [...] W ten sposób górna część okna dialogowego pokazuje widok drzewa zmienionych plików. Jeśli chcesz przywrócić tylko usunięty plik, niezależnie od innych zmian, które zostały wprowadzone od tego czasu, możesz wybrać plik Lost.txt w widoku drzewa i kliknąć przycisk Cofnij.
http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/
To właśnie wyciągnęło mój tyłek z ognia!
git reflognie działało, ponieważ nie zatwierdziłem zmian. git fsck --lost-foundpracował dla plików etapowych, ale nie wszystkie zostały zainscenizowane. Historia lokalna IntelliJ doskonale odzyskała moje niezapisane pliki, jestem bardzo wdzięczna za tę funkcję
Właśnie zrobiłem git reset --hardi straciłem wszystkie moje niezaangażowane zmiany. Na szczęście korzystam z edytora (IntelliJ) i udało mi się odzyskać zmiany z Historii lokalnej. Zaćmienie powinno pozwolić ci zrobić to samo.
Z definicji git reset --hardwyrzuci niezatwierdzone zmiany bez możliwości ich odzyskania przez Git (system kopii zapasowej może pomóc, ale nie Git).
W rzeczywistości jest bardzo niewiele przypadków, w których git reset --hardjest to dobry pomysł. W większości przypadków istnieje bezpieczniejsze polecenie, aby zrobić to samo:
Jeśli chcesz wyrzucić niezatwierdzone zmiany, użyj git stash. Będzie przechowywać kopię zapasową tych zmian, które wygasną po pewnym czasie, jeśli uruchomisz git gc. Jeśli masz 99,9% pewności, że nigdy nie będziesz potrzebować tych zmian, git stashto nadal jesteś przyjacielem w przypadku 0,1%. Jeśli masz 100% pewności, git stashto nadal jest twoim przyjacielem, ponieważ te 100% ma błąd pomiaru ;-).
Jeśli chcesz przenieść swoją HEADi czubek bieżącej gałęzi w historii, git reset --keepto twój przyjaciel. Zrobi to samo git reset --hard, ale nie odrzuci twoich lokalnych zmian.
Jeśli chcesz zrobić jedno i drugie, git stash && git reset --keepto twój przyjaciel.
Naucz palce, aby nie używać git reset --hard, to spłaci jeden dzień.
git stash && git reset --hardusunie wszelkie ukryte treści, to prawda?
git reset --hardnie odrzuca skrytki. git stashjest zamiennikiem git reset --hardw tym sensie, że usuwa nieprzewidziane zmiany z twojego środowiska roboczego, z tym wyjątkiem, że zapewnia im bezpieczeństwo, a nie odrzuca je na stałe.
jeśli przypadkowo mocno zresetujesz zatwierdzenie, zrób to,
git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case
zakładając, że HEAD@{2}jest to stan, do którego chcesz wrócić
Tak zwykle robię, jeśli stracę jakieś zmiany.
git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...
aby przesunąć wskaźnik z powrotem do poprzednich zatwierdzeń, ale zachowując zmiany, które wprowadziłeś do tej pory w ostatniej kasie zatwierdzeń git reset --soft dadada
Informacje zostały utracone.
Ponieważ nie zrobiłeś tego, Twój .git nigdy nie przechowywał tych informacji. Zasadniczo gitnie można go odzyskać.
Ale jeśli właśnie to zrobiłeś git diff, istnieje sposób na odzyskanie danych za pomocą danych wyjściowych terminala za pomocą 3 prostych kroków.
git diff. Zapisz o / p w pliku o nazwie diff.patchpatch -p1 < diff.patch)Jesteś uratowany! :)
Uwaga: Podczas kopiowania danych z terminala do pliku należy zachować ostrożność i wyraźnie zobaczyć, że dane są ciągłym wyjściem i nie zawierają żadnych zbędnych danych (z powodu naciskania strzałek w górę i w dół). W przeciwnym razie możesz to zepsuć.
Natknąłem się na ten sam problem i prawie oszalałem ... początkowo popełniłem projekt i połączyłem się. Później, kiedy próbowałem uruchomić, git push --set-upstream origin master otrzymywałem ten błąd
fatal: refusing to merge unrelated histories
więc pobiegłem git reset --hard HEADi usunąłem 3-tygodniowy projekt, ale kilka poniższych poleceń oszczędza dzień:
git reset HEAD@{1} //this command unstage changes after reset
git fsck --lost-found //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
mam nadzieję że to pomoże
Możesz odzyskać zatwierdzenie po wykonaniu reset --hard HEAD.
Skorzystaj z „ git reflog”, aby sprawdzić historię HEADoddziału.
Zobaczysz tutaj swoje zatwierdzenie i jego identyfikator.
Zrób
git reset {commit Id of the commit you want to bring back}
Dowiedziałem się na własnej skórze, że wszelkie niezaangażowane pliki przed git reset --hard <commit>usunięciem z historii git. Miałem jednak szczęście, że utrzymałem sesję edytora kodu otwartą przez cały czas, gdy wyciągałem włosy, i odkryłem, że prosty control + zw każdym z dotkniętych plików przywrócił stan pliku do wersji sprzed Gita, więc uprzejmie zresetować wszystko, o co konkretnie nie prosiłem.Hooray!!
git reset HEAD@{4}
4 to zmiany sprzed 4 kroków. jeśli wybierzesz prawidłowy krok, powinien wyświetlić listę plików, które zostały usunięte z dysku twardego. następnie wykonaj:
$ git reflog show
pokaże Ci historię lokalnych zatwierdzeń, którą już stworzyliśmy. teraz wykonaj:
$ git reset --hard 8c4d112
8c4d112 to kod, który chcesz tam zresetować. spójrzmy na https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-history, aby uzyskać więcej informacji.
Poprawne odpowiedzi. OK, teraz lubię gita. :-) Oto prostszy przepis.
git log HEAD@{2}
git reset --hard HEAD@{2}
Gdzie „2” oznacza liczbę wstecz do miejsca, w którym dokonałeś zmian. W moim przypadku przerwany przez kolegę i szefa, aby pomóc w debugowaniu jakiegoś problemu z kompilacją; więc zrobił reset - twardy dwa razy; więc HEAD i HEAD @ {1} zostały nadpisane. Uff, straciłby naszą ciężką pracę.
git reset --hardPrzez pomyłkę zrobiłem niewłaściwy projekt (wiem ...). Właśnie pracowałem nad jednym plikiem i nadal był otwarty podczas i po uruchomieniu polecenia.
Mimo że się nie popełniłem, udało mi się odzyskać stary plik za pomocą prostego COMMAND + Z.
Referencyjna odpowiedź z tego SO,
Po uruchomieniu git reflog show powiedz, że chcesz przejść do zatwierdzenia 9300f9d
po uruchomieniu git reset 9300f9d
możesz zrobić status git, a następnie może być konieczne wyewidencjonowanie plików, aby przywrócić zmiany
git checkout - ścieżka / nazwa pliku
Jeśli tworzysz w Netbeans, spójrz między zakładkami plików i obszarem edycji pliku. Istnieje „Źródło” i „Historia”. W „Historii” zobaczysz zmiany wprowadzone przy użyciu kontroli wersji (git / other), ale także zmiany wprowadzone lokalnie. W takim przypadku zmiany lokalne mogą Cię uratować.
( odpowiedź odpowiednia dla podzbioru użytkowników )
Jeśli korzystasz z (dowolnego) systemu macOS i nawet jeśli nie masz dostępu do dysku Time Machine, system operacyjny będzie zapisywał cogodzinne kopie zapasowe, zwane lokalnymi migawkami .
Wejdź do Time Machine i przejdź do utraconego pliku. System operacyjny zapyta Cię:
The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?
Powinieneś być w stanie odzyskać utracone pliki.
Jeśli masz otwarte IDE z tym samym kodem, spróbuj ctrl + z dla każdego pliku, w którym dokonałeś zmian. Pomógł mi odzyskać moje niezaangażowane zmiany po resecie git - hard.
Kiedy wykonujemy reset git - twardy i wszystkie lokalne niezaangażowane zmiany są usuwane. Aby przywrócić zmiany - w IDE kliknij plik, porównaj plik z Historią lokalną, która wyświetli zmiany według daty i możemy odzyskać dane. Twój dzień jest uratowany!
git reset. Nie potrzebujesz tego polecenia i jest niebezpieczne, więc nie używaj go. Aby przywrócić gałąź do poprzedniego zatwierdzenia albogit rebase -iupuścić niepotrzebne zmiany lubgit checkout(odłącza głowę), a następniegit branch -Mprzenieść końcówkę gałęzi. Pierwszy odmówi uruchomienia z lokalnymi zmianami, a później będzie działał tylko, jeśli lokalnie zmodyfikowane pliki nie różnią się między wersjami.