Jak użyć 'Git reset --hard HEAD', aby przywrócić poprzedni commit? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak przywrócić repozytorium Git do poprzedniego commita? (41 odpowiedzi) Zamknięty 6 lat temu .

Wiem, że Git śledzi zmiany, które wprowadzam do mojej aplikacji, i trzyma je, dopóki nie zatwierdzę zmian, ale tutaj jestem zawieszony:

Kiedy chcę przywrócić poprzedni commit używam:

git reset --hard HEAD

I GIT zwraca:

HEAD is now at 820f417 micro

Jak przywrócić pliki na moim dysku twardym z powrotem do poprzedniego commita?

Moje kolejne kroki to:

git add .
git commit -m "revert"

Ale żaden z plików nie zmienił się na moim dysk twardy...

Co robię dobrze/źle?

Author: PeeHaa, 2012-03-02

2 answers

Po pierwsze, zawsze warto zauważyć, że {[1] } jest potencjalnie niebezpiecznym poleceniem, ponieważ odrzuca wszystkie niezarejestrowane zmiany. Dla bezpieczeństwa, przed użyciem należy zawsze sprawdzić, czy wyjście git status jest czyste (czyli puste).

Początkowo mówisz co następuje:

Więc wiem, że Git śledzi zmiany, które wprowadzam do mojej aplikacji, i trzyma się ich, dopóki nie zatwierdzę zmian, ale tutaj jestem zawieszony:

To niepoprawne. Tylko Git zapisuje stan plików podczas ich składowania (za pomocą git add) lub podczas tworzenia zmian. Po utworzeniu commitu, który ma pliki projektu w określonym stanie, są one bardzo bezpieczne, ale do tego czasu Git tak naprawdę nie "śledzi zmian" w Twoich plikach. (na przykład, nawet jeśli wykonasz git add, aby przygotować nową wersję pliku, to nadpisuje ona wcześniej przygotowaną wersję tego pliku w obszarze przejściowym.)

W twoim pytaniu możesz zadać następujące pytanie:

Kiedy chcę przywrócić poprzedni commit używam: git reset --hard HEAD i GIT returns: HEAD jest teraz w 820f417 micro

Jak przywrócić pliki na moim dysku twardym z powrotem do poprzedniego commita?

If you do git reset --hard <SOME-COMMIT> then Git will:

  • Zmień bieżącą gałąź (zazwyczaj master) z powrotem na <SOME-COMMIT>.
  • następnie upewnij się, że pliki w drzewie roboczym i indeksie ("staging area") są takie same, jak wersje zatwierdzone w <SOME-COMMIT>.

HEAD wskazuje na Twoją bieżącą gałąź (lub bieżący commit), więc wszystko, co {10]} zrobi, to odrzucenie niezatwierdzonych zmian, które posiadasz.

Więc załóżmy, że dobrym zobowiązaniem, do którego chcesz wrócić, jest f414f31. (Można to znaleźć za pomocą git log lub dowolnej przeglądarki historii.) Następnie masz kilka różnych opcji w zależności od tego, co dokładnie chcesz zrobić:

  • Zmień bieżącą gałąź, aby wskazywała na starszy commit. Możesz to zrobić git reset --hard f414f31. Jest to jednak przepisywanie historii Twojej gałęzi, więc powinieneś jej unikać, jeśli udostępniłeś tę gałąź komukolwiek. Ponadto commity, które wykonałeś po f414f31, nie będą już w historii Twojej gałęzi master.
  • Utwórz nowy commit, który reprezentuje dokładnie ten sam stan projektu co f414f31, ale dodaje go do historii, aby nie stracić historii. Można to zrobić za pomocą kroków sugerowanych w ta odpowiedź - coś like:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"
    
 1183
Author: Mark Longair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 19:06:43

WARNING: git clean -f usunie pliki, które nie są śledzone, co oznacza, że zniknęły na dobre, ponieważ nie są przechowywane w repozytorium. Przed wykonaniem tej czynności upewnij się, że naprawdę chcesz usunąć wszystkie Nie śledzone pliki.


Spróbuj tego i zobacz git clean -f.

git reset --hard nie usunie nie śledzonych plików, gdzie as git-clean usunie wszystkie pliki ze śledzonego katalogu głównego, które nie znajdują się w Git tracking.

Alternatywnie, jak powiedział @ Paul Betts, możesz to zrobić (uważaj chociaż-usuwa również wszystkie ignorowane pliki)

  • git clean -df
  • git clean -xdf Uwaga! Spowoduje to również usunięcie ignorowanych plików
 247
Author: uday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-01 17:46:53