Jak użyć 'Git reset --hard HEAD', aby przywrócić poprzedni commit? [duplikat]
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?
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ś pof414f31
, nie będą już w historii Twojej gałęzimaster
. -
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"
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
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