Jak przywrócić repozytorium Git do poprzedniego commita?

odpowiedzi na to pytanie są wysiłkiem społeczności. Edytuj istniejące odpowiedzi, aby poprawić ten post. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Jak mogę powrócić ze stanu obecnego do migawki wykonanej na pewne zobowiązania?

Jeśli wykonam git log, wtedy otrzymuję następujące wyjście:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Jak przywrócić commit od 3 listopada, czyli commit 0d1d7fc?

Author: Paolo, 2010-11-06

30 answers

To zależy w dużej mierze od tego, co masz na myśli mówiąc "Przywróć".

Tymczasowo przełącz się na inny commit

Jeśli chcesz tymczasowo do niego wrócić, wygłupiaj się, a następnie wróć tam, gdzie jesteś, wszystko co musisz zrobić, to sprawdzić żądany commit:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Lub jeśli chcesz tworzyć commity, gdy już tam jesteś, zrób nową gałąź, gdy już na niej jesteś:

git checkout -b old-state 0d1d7fc32
Aby wrócić tam, gdzie byłeś, po prostu sprawdź gałąź, na której byłeś. (Jeśli dokonałeś zmian, jako zawsze, gdy zmieniasz oddziały, będziesz musiał sobie z nimi radzić odpowiednio. Możesz je zresetować, aby je wyrzucić; możesz schować, checkout, stash pop, aby zabrać je ze sobą; możesz zaangażować je w gałąź, jeśli chcesz gałąź.)

Hard delete unpublished commits

Jeśli, z drugiej strony, chcesz naprawdę pozbyć się wszystkiego, co zrobiłeś od tego czasu, są dwie możliwości. Po pierwsze, jeśli nie opublikowałeś żadnego z tych commitów, po prostu zresetuj:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Jeśli nawalisz, już wyrzuciłeś swoje lokalne zmiany, ale możesz przynajmniej wrócić do miejsca, w którym byłeś wcześniej, resetując ponownie.

Cofnij opublikowane commity nowymi commitami

Z drugiej strony, jeśli opublikowałeś pracę, prawdopodobnie nie chcesz resetować gałęzi, ponieważ to skutecznie przepisuje historię. W takim przypadku można rzeczywiście przywrócić commity. W Git, revert ma bardzo specyficzne znaczenie: tworzy commit z odwrotną łatką, aby go anulować. Tędy. nie przepisujesz żadnej historii.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes (non inclusive of first hash):
git revert 0d1d7fc..a867b4a

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

The git-revert strona Man w rzeczywistości obejmuje wiele z tego w swoim opisie. Innym przydatnym linkiem jest to git-scm.com sekcja omawiająca git-revert .

Jeśli zdecydujesz, że mimo wszystko nie chcesz przywracać, możesz przywrócić przywracanie (jak opisano tutaj) lub zresetować je z powrotem przed przywróceniem (Zobacz poprzedni rozdział).

Ta odpowiedź może również okazać się pomocna w tym przypadku:
Jak mogę wrócić do poprzedniego miejsce? (Odłączona Głowica) & Undo commits

 10385
Author: Cascabel,
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
2020-06-23 18:57:51

Wiele skomplikowanych i niebezpiecznych odpowiedzi tutaj, ale to naprawdę łatwe:

git revert --no-commit 0766c053..HEAD
git commit

Spowoduje to przywrócenie wszystkich zmian z głowy do hash commit, co oznacza odtworzenie tego stanu w drzewie roboczym tak, jakby każdy commit po 0766c053 został przeniesiony z powrotem. Następnie możesz zatwierdzić obecne drzewo i utworzy ono zupełnie nowy commit, zasadniczo równoważny zatwierdzeniu, do którego "powróciłeś".

(znacznik --no-commit pozwala gitowi przywrócić wszystkie commity naraz- w przeciwnym razie zostaniesz poproszony o wiadomość dla każdego commita w zakresie, zaśmiecając swoją historię niepotrzebnymi nowymi commitami.)

To jest bezpieczny i łatwy sposób na przywrócenie poprzedniego stanu . Żadna historia nie została zniszczona, więc może być używana do commitów, które zostały już upublicznione.

 2275
Author: Yarin,
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
2020-06-15 19:16:28

Rogue Coder? Pracujesz na własną rękę i chcesz, żeby to zadziałało? Postępuj zgodnie z poniższymi instrukcjami, działają niezawodnie dla mnie i wielu innych od lat.

Pracujesz z innymi? Git jest skomplikowany. Przeczytaj komentarze poniżej tej odpowiedzi, zanim zrobisz coś pochopnego.

Przywracanie kopii roboczej do najnowszego Commita

Aby przywrócić poprzedni commit, ignorując wszelkie zmiany:

git reset --hard HEAD

Gdzie HEAD jest ostatnim commitem w bieżącej gałęzi

Reverting Kopia robocza do starszego Commita

Aby przywrócić commit starszy niż najnowszy commit:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Kredyty idą do podobnego pytania o przepełnienie stosu, przywrócić commit przez SHA hash w Git?.

 1679
Author: boulder_ruby,
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-06-13 02:36:39

Najlepszą opcją dla mnie i prawdopodobnie innych jest opcja Git reset:

git reset --hard <commidId> && git clean -f
To była dla mnie najlepsza opcja! To proste, szybkie i skuteczne!

** Uwaga: * * Jak wspomniano w komentarzach, nie rób tego, jeśli udostępniasz swoją gałąź innym osobom, które mają kopie starych commitów

Również z komentarzy, jeśli chcesz mniej "ballzy" metody można użyć

git clean -i
 234
Author: Pogrindis,
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-12-08 13:30:55

Zanim odpowiemy, dodajmy trochę tła, wyjaśniając czym jest to HEAD.

First of all what is HEAD?

HEAD jest po prostu odniesieniem do bieżącego commita (latest)w bieżącej gałęzi. W danym momencie może istnieć tylko jedna HEAD (z wyłączeniem git worktree).

Zawartość HEAD jest przechowywana wewnątrz .git/HEAD i zawiera 40 bajtów SHA-1 bieżącego commita.


detached HEAD

Jeśli nie jesteś na najnowszym commit-co oznacza, że HEAD wskazuje na poprzedni commit w historii, który nazywa się detached HEAD.

Tutaj wpisz opis obrazka

W wierszu poleceń będzie wyglądać tak - SHA-1 zamiast nazwy gałęzi, ponieważ HEAD nie wskazuje na końcówkę bieżącej gałęzi:

Tutaj wpisz opis obrazka


Kilka opcji, jak odzyskać od odłączonej głowy:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

To wykona nowy oddział wskazując na żądany commit. Polecenie to zostanie pobrane do danego commita.

W tym momencie możesz utworzyć gałąź i rozpocząć pracę od tego momentu:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Zawsze możesz użyć reflog. git reflog wyświetli każdą zmianę, która zaktualizowała HEAD, A sprawdzenie żądanego wpisu reflog ustawi HEAD z powrotem do tego commita.

Za każdym razem, gdy głowica zostanie zmodyfikowana, pojawi się nowy wpis w reflog

git reflog
git checkout HEAD@{...}

To przywróci Ci pożądany commit

Tutaj wpisz opis obrazka


git reset HEAD --hard <commit_id>

"Przesuń" głowę z powrotem do żądanego commita.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Uwaga: (od Git 2.7 ) możesz również użyć git rebase --no-autostash.

Ten schemat ilustruje, które polecenie co robi. Jak widać reset && checkout zmodyfikuj HEAD.

Tutaj wpisz opis obrazka

 197
Author: CodeWizard,
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
2020-06-20 09:12:55

Jeśli Chcesz "zatwierdzić", usunąć ostatnią wiadomość zatwierdzającą i umieścić zmodyfikowane pliki z powrotem w staging, użyj polecenia:

git reset --soft HEAD~1
  • --soft wskazuje, że niezakontraktowane pliki powinny być przechowywane jako pliki robocze w przeciwieństwie do --hard, które je odrzuciłyby.
  • HEAD~1 jest ostatnim commitem. Jeśli chcesz wycofać 3 commity, możesz użyć HEAD~3. Jeśli chcesz przywrócić konkretny numer wersji, możesz to zrobić również za pomocą skrótu SHA.

To jest niezwykle przydatnym poleceniem w sytuacjach, gdy popełniłeś błąd i chcesz cofnąć ostatni commit.

Źródło: http://nakkaya.com/2009/09/24/git-delete-last-commit/

 156
Author: Stephen Ostermiller,
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
2014-03-04 17:25:52

Możesz to zrobić za pomocą następujących dwóch poleceń:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

Usunie twój poprzedni commit Git.

Jeśli chcesz zachować swoje zmiany, Możesz również użyć:

git reset --soft [previous Commit SHA id here]

Wtedy zapisze Twoje zmiany.

 144
Author: kiran boghra,
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
2016-07-03 06:30:27

Próbowałem wielu sposobów, aby przywrócić lokalne zmiany w Git, i wydaje się, że działa to najlepiej, jeśli tylko chcesz przywrócić najnowszy stan commit.

git add . && git checkout master -f

Krótki opis:

  • nie utworzy żadnych commitów tak jak robi to git revert.
  • nie oderwie ci głowy, jak to robi git checkout <commithashcode>.
  • nadpisze wszystkie Twoje lokalne zmiany i usunie wszystkie dodane pliki od ostatniego zatwierdzenia w gałęzi.
  • działa tylko z nazwami gałęzi, więc możesz powróci tylko do ostatniego zatwierdzenia w gałęzi w ten sposób.

Znalazłem znacznie wygodniejszy i prosty sposób na osiągnięcie powyższych wyników:

git add . && git reset --hard HEAD

Gdzie HEAD wskazuje na najnowszy commit na bieżącą gałąź.

Jest to ten sam kod, co sugerował boulder_ruby, ale dodałem git add . Przed git reset --hard HEAD, aby usunąć wszystkie nowe pliki utworzone od ostatniego commita, ponieważ jest to to, czego większość ludzi oczekuje podczas powrotu do ostatniego commita.

 114
Author: Roman Minenok,
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
2014-06-24 20:08:20

OK, powrót do poprzedniego commita w Git jest dość prosty...

Odwróć wstecz bez zachowywania zmian:

git reset --hard <commit>

Odwróć wstecz z zachowaniem zmian:

git reset --soft <commit>

Explanation: używając git reset, możesz zresetować do określonego stanu. Często używa się go z Hashem commita, jak widzisz powyżej.

Ale jak widzisz różnica polega na używaniu dwóch flag --soft i --hard, domyślnie git reset używanie flag --soft, ale jest to dobra praktyka zawsze używając flagi, wyjaśniam każdą flagę:


-- soft

Domyślna flaga, jak wyjaśniono, nie musi jej dostarczać, nie zmienia drzewa roboczego, ale dodaje wszystkie zmienione pliki gotowe do zatwierdzenia, więc wracasz do statusu zatwierdzenia, który zmienia się w plikach.


-- hard

Uważaj z tą flagą. Resetuje działające drzewo i wszystkie zmiany w śledzonych plikach i wszystko zniknie!

Stworzyłem również poniższy obrazek, który może happen in a real life working with Git:

Git reset do zatwierdzenia

 92
Author: Alireza,
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
2020-01-26 17:28:16

Najlepszy sposób to:

git reset --hard <commidId> && git push --force

Spowoduje to zresetowanie gałęzi do określonego commita, a następnie przesłanie zdalnego serwera z tymi samymi commitami, które masz w local.

Uważaj na znacznik --force, ponieważ usuwa on wszystkie kolejne commity po wybranym commicie bez opcji ich odzyskania.

 77
Author: david.t_92,
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
2021-01-13 16:16:45

Zakładając, że mówisz o master i na danej gałęzi (To powiedziawszy, może to być każda działająca gałąź, o którą się martwisz):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

Znalazłem odpowiedź w poście na blogu (teraz już nie istnieje)

Zauważ, że jest to Resetowanie i wymuszanie zmiany na pilocie, tak, że jeśli inni z twojego zespołu już wyciągnęli git, sprawisz im problemy. Niszczysz historię zmian, co jest ważnym powodem, dla którego ludzie używają Gita w pierwszym miejsce.

Lepiej użyć revert (zobacz inne odpowiedzi) niż reset. Jeśli jesteś jednoosobową drużyną, to prawdopodobnie nie ma to znaczenia.

 75
Author: markreyes,
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-04-28 19:59:43

Załóżmy, że masz następujące commity w pliku tekstowym o nazwie ~/commits-to-revert.txt (użyłem git log --pretty=oneline aby je pobrać)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Utwórz skrypt powłoki Bash , aby przywrócić każdy z nich:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

To przywróci wszystko do poprzedniego stanu, łącznie z utworami plików i katalogów oraz usunięciami, zatwierdzi je do swojej gałęzi i zachowasz historię, ale przywrócisz ją do tej samej struktury plików. Dlaczego Git nie ma git revert --to <hash> jest poza mną.

 63
Author: Lance Caraccioli,
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
2014-06-29 00:13:03

Dodatkowe alternatywy dla rozwiązań Jefromi

Rozwiązania Jefromi są zdecydowanie najlepsze i zdecydowanie powinieneś z nich korzystać. Jednakże, w trosce o kompletność, chciałem również pokazać te inne alternatywne rozwiązania, które mogą być również użyte do odwrócenia commita (w tym sensie, że tworzysz nowy commit, który cofa zmiany w poprzednim commicie , tak jak robi to git revert).

Aby było jasne, te alternatywy nie są najlepszym sposobem na Przywróć zmiany, rozwiązania Jefromi to , ale chcę tylko zaznaczyć, że można również użyć tych innych metod, aby osiągnąć to samo, co git revert.

Alternatywa 1: resety twarde i miękkie

To jest bardzo nieznacznie zmodyfikowana wersja rozwiązania Charlesa Baileya, aby przywrócić commit przez SHA hash w Git?:

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

To w zasadzie działa poprzez użycie faktu, że miękkie resety pozostawią stan poprzedniego commita wystawionego w index / staging-area, który można następnie zatwierdzić.

Alternatywa 2: Usuń obecne drzewo i zamień je na nowe

To rozwiązanie pochodzi z rozwiązania svicka do Checkout old commit and make it a new commit :

git rm -r .
git checkout <commit> .
git commit

Podobnie jak alternatywa # 1, odtwarza Stan <commit> w bieżącej kopii roboczej. Najpierw należy wykonać git rm, ponieważ git checkout nie usunie plików dodanych od <commit>.

 60
Author: 2 revsuser456814,
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
2017-05-23 11:47:32

Oto znacznie prostszy sposób, aby wrócić do poprzedniego commita (i mieć go w stanie niezakontraktowanym, robić z nim co chcesz):

git reset HEAD~1

Więc nie ma potrzeby tworzenia idów commit i tak dalej:)

 57
Author: Paul Walczewski,
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
2016-07-03 10:56:38

Istnieje polecenie (nie jest częścią core Git, ale jest w pakiecie Git-extras) specjalnie do przywracania i wystawiania starych commitów:

git back

Na stronie man , może być również używany jako taki:

# Remove the latest three commits
git back 3
 39
Author: Shadow Man,
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
2014-06-28 20:19:45

Po wszystkich zmianach, po wciśnięciu wszystkich tych poleceń, być może będziesz musiał użyć:

git push -f ...

I nie tylko git push.

 38
Author: sivi,
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
2013-09-28 19:07:07

Możesz wykonać wszystkie te początkowe kroki samodzielnie i wrócić do repozytorium Git.

  1. Pobranie najnowszej wersji repozytorium z Bitbucket za pomocą polecenia git pull --all.

  2. Uruchom komendę Git log z -n 4 z twojego terminala. Liczba po -n określa liczbę commitów w dzienniku, począwszy od ostatniego commita w Twojej lokalnej historii.

    $ git log -n 4
    
  3. Zresetuj nagłówek historii repozytorium za pomocą git reset --hard HEAD~N gdzie N to liczba commitów, które chcesz cofnąć. W poniższym przykładzie nagłówek zostanie ustawiony z powrotem do ostatniego commita w historii repozytorium:

  4. Wypchnij zmianę do repozytorium Git używając git push --force, aby wymusić wypchnięcie zmiany.

Jeśli chcesz, aby repozytorium Git miało poprzedni commit:

git pull --all
git reset --hard HEAD~1
git push --force
 33
Author: Nanhe Kumar,
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
2020-01-26 17:03:48

Wróć do najnowszego Zatwierdź i Ignoruj wszystkie lokalne zmiany:

git reset --hard HEAD
 30
Author: Mohammed Irfan Tirupattur,
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-07-04 19:28:44

Wybierz wymagany commit i sprawdź go przez

git show HEAD
git show HEAD~1
git show HEAD~2 

Dopóki nie otrzymasz wymaganego commita. Aby głowa wskazała na to, wykonaj

git reset --hard HEAD~1

Lub git reset --hard HEAD~2 lub cokolwiek.

 29
Author: tonythomas01,
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
2014-06-28 19:51:32

Jeśli sytuacja jest pilna , i chcesz po prostu zrobić to, o co pytający zapytał w szybki i brudny sposób, zakładając, że twój projekt znajduje się w katalogu o nazwie, na przykład, "mój projekt":


Szybkie i brudne: w zależności od okoliczności, szybkie i brudne mogą być w rzeczywistości bardzo dobre. Moje rozwiązanie polega na tym, że NIE zastępuję nieodwracalnie pliki znajdujące się w katalogu roboczym plikami wyciągniętymi/wydobywanymi z głębi repozytorium git czai się pod twoim .Git / directory używa diabelsko sprytnych i diabolicznie potężnych komend git, których jest wiele. Nie musisz nurkować GŁĘBINOWO, aby odzyskać to, co może wydawać się katastrofalne, a próba zrobienia tego bez wystarczającej wiedzy specjalistycznej może okazać się śmiertelna.


  1. Skopiuj cały katalog i nazwij go czymś innym, jak "mój projekt-Kopia". Zakładając, że Twoje repozytorium git ("repo") znajduje się pod "my projekt "katalog (domyślne miejsce dla nich, pod katalog o nazwie".git"), będziesz teraz kopiował zarówno pliki robocze, jak i pliki repo.

  2. Zrób to w katalogu "mój projekt":

    .../my project $ git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

To zwróci stan repo w sekcji " Mój projekt "do stanu, jaki był w momencie tworzenia tego commita ("commit" oznacza migawkę plików roboczych). Wszystkie commity od tego czasu zostaną utracone na zawsze w ramach "mojego projektu", ale... nadal będą zaprezentuj w repo pod "mój projekt-Kopia", ponieważ skopiowałeś wszystkie te pliki - w tym te pod .../.git/

Następnie masz dwie wersje w systemie... możesz przejrzeć, skopiować lub zmodyfikować interesujące Cię pliki lub cokolwiek innego z poprzedniego commita. Możesz całkowicie odrzucić pliki w sekcji "Mój projekt-Kopia", jeśli zdecydowałeś, że nowa praca, ponieważ przywrócony commit zmierza donikąd...

Oczywistą rzeczą, jeśli chcesz kontynuować stan Projekt bez odrzucenia pracy, ponieważ ten pobrany commit ma ponownie zmienić nazwę katalogu: usunąć projekt zawierający pobrany commit (lub nadać mu tymczasową nazwę) I zmienić nazwę katalogu "mój projekt - Kopia" z powrotem na "mój projekt". To może spróbuj zrozumieć niektóre z innych odpowiedzi tutaj, i prawdopodobnie zrobić kolejny commit dość szybko.

[3]}Git to genialna kreacja, ale absolutnie nikt nie jest w stanie po prostu "podnieść go w locie": także ludzie, którzy próbują wyjaśnić zbyt często przyjmuje się wcześniejsze znajomości innych systemów VCS [systemów kontroli wersji] i zbyt szybko zagłębia się w głąb i popełnia inne przestępstwa, takie jak używanie wymiennych terminów do "sprawdzania" - w sposób, który czasami wydaje się prawie obliczony, aby zmylić początkującego. Żeby oszczędzić sobie stresu, ucz się na moich bliznach. Musisz przeczytać książkę o Git-polecam "Kontrola wersji za pomocą Git" . Zrób to wcześniej niż później. Jeśli tak, niedźwiedź w pamiętaj, że większość złożoności Gita pochodzi z rozgałęziania, a następnie remergowania: możesz pominąć te części w dowolnej książce. Z twojego pytania wynika, że nie ma powodu, by ludzie oślepiali Cię nauką.

Szczególnie jeśli, na przykład, jest to desperacka sytuacja i jesteś nowicjuszem z Git!

PS: jeszcze jedna myśl: to jest (teraz) całkiem proste, aby utrzymać repo Git w katalogu innym niż ten z plikami roboczymi. Oznaczałoby to, że nie miałbyś aby skopiować całe repozytorium Git używając powyższego rozwiązania quick & dirty. Zobacz odpowiedź użytkownika Frytkownica --separate-git-dir tutaj . bądź jednak ostrzeżony : Jeśli masz repozytorium "oddzielny katalog", którego nie kopiujesz, a wykonujesz twardy reset, wszystkie wersje po zatwierdzeniu resetu zostaną utracone na zawsze, chyba że masz, jak absolutnie powinieneś, regularnie wykonuj kopię zapasową swojego repozytorium, najlepiej w chmurze (np. Dysk Google) między innymi.

W tym temacie kolejnym krokiem jest otwarcie konta (oczywiście za darmo) na Githubie lub (moim zdaniem lepiej) GitLab. Następnie możesz regularnie wykonywać polecenie git push, aby uaktualnić repo w chmurze "prawidłowo". Ale znowu, mówienie o tym może być zbyt wiele za wcześnie.

 25
Author: mike rodent,
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-11-25 20:55:57

Jest to jeszcze jeden sposób, aby bezpośrednio zresetować do ostatniego commita

git stash
git stash clear

Bezpośrednio usuwa wszystkie zmiany, które zostały wprowadzone od ostatniego commita.

PS: ma mały problem; usuwa również wszystkie ostatnio przechowywane zmiany skrytki. Co chyba w większości przypadków nie powinno mieć znaczenia.

 23
Author: Point Networks,
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
2016-07-03 10:57:18

Aby całkowicie oczyścić katalog kodera z przypadkowych zmian, użyliśmy:

git add -A .
git reset --hard HEAD

Po Prostu git reset --hard HEAD pozbędzie się modyfikacji, ale nie pozbędzie się "nowych" plików. W ich przypadku przypadkowo przeciągnęli ważny folder w dowolne miejsce, a wszystkie te pliki były traktowane przez Git jako nowe, więc reset --hard tego nie naprawił. Uruchamiając git add -A . wcześniej, wyraźnie wyśledził je wszystkie za pomocą Gita, aby zostały wymazane przez reset.

 22
Author: Chris Moschini,
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
2016-07-03 10:55:25

Aby zachować zmiany z poprzedniego commita do HEAD i przenieść je do poprzedniego commita, wykonaj:

git reset <SHA>

Jeśli zmiany nie są wymagane od poprzedniego commitu do HEAD i po prostu odrzuć wszystkie zmiany, wykonaj:

git reset --hard <SHA>
 21
Author: Vishnu Atrai,
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
2016-07-03 10:21:53

Wierzę, że niektórzy ludzie mogą przyjść na to pytanie, chcąc wiedzieć, jak cofnąć wprowadzone zmiany w swoim master - czyli wyrzucić wszystko i wrócić do origin/master, w takim przypadku zrób to:

git reset --hard origin/master

Https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

 20
Author: nevster,
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
2017-03-20 10:18:20

Revert jest poleceniem do cofnięcia commitów.

git revert <commit1> <commit2> 

próbka:

git revert 2h3h23233

Jest w stanie odbierać zasięg z głowy jak poniżej. Tutaj 1 mówi " Przywróć ostatni commit."

git revert HEAD~1..HEAD

A następnie zrobić git push

 19
Author: Sireesh Yarlagadda,
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
2016-05-27 06:05:57

Uwaga! to polecenie może spowodować utratę historii zatwierdzeń, jeśli użytkownik błędnie wpisał błędny zatwierdzanie. Zawsze mieć PL dodatkową kopię zapasową Twojego git niektóre gdzie indziej na wszelki wypadek, jeśli popełniasz błędy, niż jesteś nieco bezpieczniejszy. :)

Miałem podobny problem i chciałem wrócić do wcześniejszego commita. W moim przypadku nie byłem zainteresowany utrzymaniem nowszego commita, dlatego użyłem Hard.

Tak to zrobiłem:

git reset --hard CommitId && git clean -f

To powróci na lokalnym repozytorium, a tutaj po użyciu {[3] } zaktualizuje zdalne repozytorium.

git push -f
 16
Author: maytham-ɯɐɥʇʎɐɯ,
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
2020-01-26 17:36:31

Spróbuj zresetować do żądanego commita-

git reset <COMMIT_ID>

(aby sprawdzić COMMIT_ID użyj git log)

Spowoduje to zresetowanie wszystkich zmienionych plików do stanu nie dodanego.

Teraz możesz checkout wszystkie Nie dodane pliki przez

git checkout .

Sprawdź git log, Aby zweryfikować swoje zmiany.

UPDATE

Jeśli masz jeden i jedynycommit w swoim repo, spróbuj

git update-ref -d HEAD

 14
Author: optimistanoop,
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-04-17 10:02:40

Ponieważ twoje commity są wypychane zdalnie, musisz je usunąć. Załóżmy, że Twoja gałąź jest rozwijana i jest przesunięta nad origin .

Najpierw musisz usunąć develop z origin :

git push origin :develop (note the colon)

Następnie musisz dostać się do statusu, który chcesz, pozwól mi założyć, że hash commit to EFGHIJK:

git reset --hard EFGHIJK

Na koniec wciśnij rozwiń Jeszcze raz:

git push origin develop
 14
Author: George Ninan,
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
2020-01-26 17:01:31

Dla cofnięcia (lub cofnięcia):

1. git revert --no-commit "commit-code-to-remove" HEAD
(e.g. git revert --no-commit d57a39d HEAD)
2. git commit
3. git push

Wypróbuj powyższe dwa kroki, a jeśli okaże się, że to jest to, czego chcesz, to git push.

Jeśli znajdziesz coś nie tak, zrób:

git revert --abort
 13
Author: Jagraj Singh,
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
2020-01-26 17:00:39

Jeśli chcesz poprawić jakiś błąd w ostatnim zatwierdzeniu, dobrą alternatywą byłoby użycie git commit --amend. Jeśli ostatni commit nie jest wskazywany przez żadne odniesienie, zrobi to sztuczkę, ponieważ tworzy commit z tym samym rodzicem co ostatni commit. Jeśli nie ma odniesienia do ostatniego commita, zostanie on po prostu odrzucony i ten commit będzie ostatnim commitem. Jest to dobry sposób na poprawianie commitów bez odwracania commitów. Ma jednak swoje ograniczenia.

 12
Author: Upul Doluweera,
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
2015-07-01 11:35:54