41 Pytanie: Jak przywrócić repozytorium Git do poprzedniego zatwierdzenia?

pytanie utworzone w Mon, Jun 10, 2019 12:00 AM

Jak przywrócić stan z aktualnego stanu do migawki utworzonej przy określonym zatwierdzeniu?

Jeśli zrobię git log, otrzymam następujące dane wyjściowe:

 
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Jak przywrócić zatwierdzenie od 3 listopada, tj. zatwierdzić 0d1d7fc?

    
6891
  1. Powiązane Jak cofnąć ostatnie zatwierdzenie Git? . /div>
    2014-05-23 17: 57: 12Z
  2. Oto bardzo jasny i dokładny post na temat cofania rzeczy w git, prosto z Githuba.
    2015-06-08 19: 41: 52Z
  3. Powiązane: Przywrócenie starego zatwierdzenia Git w publicznym repo . Zauważ, że to pytanie dodaje ograniczenie, że repo jest publiczne.
    2015-10-19 09: 51: 42Z
  4. Kocham gita, ale fakt, że jest 35 odpowiedzi na coś, co powinno być niewiarygodnie proste, ujawnia ogromny problem z git. Czy jest to dokumentacja?
    2018-01-03 22: 26: 59Z
  5. Mogą dodać funkcjonalność przycisku dla tego typu SVN w historii
    2018-12-13 18: 29: 31Z
  6. 30 odpowiedzi                              30                         

    To zależy od tego, co masz na myśli, mówiąc „przywróć”.

    Tymczasowo przełącz się na inne zatwierdzenie

    Jeśli chcesz tymczasowo wrócić do niego, wygłupiać się, a następnie powrócić do miejsca, w którym jesteś, wszystko co musisz zrobić, to sprawdzić żądane zatwierdzenie:

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

    Lub jeśli chcesz dokonać zatwierdzenia, gdy jesteś na miejscu, idź do przodu i stwórz nowy oddział, gdy będziesz na to:

     
    git checkout -b old-state 0d1d7fc32
    

    Aby wrócić do miejsca, w którym byłeś, po prostu sprawdź gałąź, w której byłeś ponownie. (Jeśli dokonałeś zmian, jak zawsze przy przełączaniu gałęzi, musisz sobie z nimi poradzić. Możesz zresetować je, aby je wyrzucić; możesz je schować, zameldować, ukryć pop, aby zabrać je ze sobą; do oddziału, jeśli chcesz tam oddział.)

    Twarde usunięcie niepublikowanych zatwierdzeń

    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 zatwierdzeń, 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 się zepsułeś, wyrzuciłeś już lokalne zmiany, ale możesz przynajmniej wrócić do miejsca, w którym byłeś wcześniej, resetując ponownie.

    Cofnij opublikowane zatwierdzenia za pomocą nowych zatwierdzeń

    Z drugiej strony, jeśli opublikowałeś pracę, prawdopodobnie nie chcesz resetować gałęzi, ponieważ to skutecznie przepisuje historię. W takim przypadku rzeczywiście można cofnąć zatwierdzenia. W Git revert ma bardzo specyficzne znaczenie: utwórz zatwierdzenie za pomocą odwrotnej poprawki, aby go anulować. W ten sposób 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:
    git revert a867b4af..0766c053 
    
    # 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
    

    strona git-revert zawiera wiele z tego opisu. Innym użytecznym linkiem jest ta sekcja git-scm.com omawiająca git -revert .

    Jeśli w końcu zdecydujesz, że nie chcesz cofać, możesz cofnąć przywrócenie (jak opisano tutaj) lub przywrócić go przed powrotem (zobacz poprzednią sekcję).

    Ta odpowiedź może być również pomocna w tym przypadku:
    Jak przenieść HEAD z powrotem do poprzedniej lokalizacji? (Odłączona głowa)

        
    8799
    2018-04-04 17: 54: 07Z
      @ Komentarz Rod'a na git revert HEAD~3 jako najlepszy sposób na cofnięcie 3 zatwierdzeń jest ważną konwencją.
      2012-08-22 15: 16: 45Z
    1. Czy mógłbyś napisać cały numer? jak: git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
      2012-12-04 13: 58: 13Z
    2. @ MathiasMadsenStav Tak, możesz oczywiście określić zatwierdzenia przez pełny SHA1. Użyłem skróconych skrótów, aby odpowiedź była bardziej czytelna, a ty również używasz ich, jeśli piszesz. Jeśli kopiujesz i wklejasz, użyj pełnego skrótu. Zobacz Określanie wersji w man git rev- parsuj , aby uzyskać pełny opis tego, jak możesz nazwać zatwierdzenie.
      2012-12-04 16: 55: 52Z
    3. Aby wrócić do bieżącego polecenia, należy użyć polecenia 'git checkout master'
      2013-01-18 00: 33: 26Z
    4. Możesz użyć git revert --no-commit hash1 hash2 ... i po tym po prostu zatwierdzaj każdy pojedynczy zwrot w jednym commit git commit -m "Message"
      2013-09-24 12: 12: 16Z

    Rogue Coder?

    Pracujesz sam i chcesz, żeby działało? Postępuj zgodnie z poniższymi instrukcjami, od lat pracują niezawodnie dla mnie i wielu innych osób.

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

    Przywracanie kopii roboczej do najnowszego zatwierdzenia

    Aby powrócić do poprzedniego zatwierdzenia, ignorując wszelkie zmiany:

     
    git reset --hard HEAD
    

    gdzie HEAD jest ostatnim zatwierdzeniem w twojej bieżącej gałęzi

    Przywracanie kopii roboczej do starszego zatwierdzenia

    Aby powrócić do zatwierdzenia, które jest starsze niż ostatnie zatwierdzenie:

     
    # 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 przechodzą do podobnego pytania Przepełnienie stosu, Przywróć do zatwierdzenia za pomocą skrótu SHA w Git? .

        
    1465
    2019-06-13 02: 36: 39Z
    1. Zrobiłem to, ale potem nie byłem w stanie zatwierdzić i wypchnąć do zdalnego repozytorium. Chcę, aby konkretna starsza osoba została HEAD ...
      2012-09-24 18: 17: 28Z
    2. Oznacza to, że już wrzuciłeś polecenia, które chcesz przywrócić. Może to spowodować wiele problemów dla ludzi, którzy sprawdzili Twój kod i pracują nad nim. Ponieważ nie mogą sprawnie zastosować twojego zatwierdzenia na swoich. W takim przypadku lepiej zrobić powrót gita. Jeśli jesteś jedynym, który korzysta z repo. Zrób git push -f (ale pomyśl dwa razy zanim to zrobisz)
      2012-12-05 04: 51: 51Z
    3. Obowiązkowe ostrzeżenie: nie resetuj jeśli udostępniasz swój oddział innym osobom, które mają kopie starych zatwierdzeń, ponieważ używanie taki twardy reset zmusi ich do ponownej synchronizacji pracy z nowo zresetowaną gałęzią. Miękki reset jest jednak bezpieczny, podobnie jak ostatnie rozwiązania w tej odpowiedzi .
      2014-06-28 20: 06: 00Z
    4. Chciałbym również zwrócić uwagę, że alternatywnie dla rozwiązania miękkiego resetowania, zamiast wykonywać resetowanie mieszane jako pierwsze i resetowanie twarde jako ostatnie, można rzeczywiście zrobić trudny zresetować najpierw, jak następuje: git reset --hard 56e05fc; git reset --soft HEAD@{1}; git commit.
      2014-06-29 00: 20: 29Z
    5. @ nuton linus pauling sam, twórca git, skrytykował go za zbyt skomplikowany. On jestna podstawie tego, że był „zszokowany”, git stał się tak popularny, biorąc pod uwagę jego złożoność
      2015-05-18 23: 56: 00Z

    Wiele skomplikowanych i niebezpiecznych odpowiedzi tutaj, ale w rzeczywistości jest to łatwe:

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

    Spowoduje to przywrócenie wszystkiego z HEAD do skrótu zatwierdzenia, co oznacza, że ​​odtworzy ten stan zatwierdzenia w drzewie roboczym tak, jakby każde zatwierdzenie od czasu powrotu. Następnie możesz zatwierdzić bieżące drzewo i utworzy ono nowe zatwierdzenie zasadniczo odpowiadające zatwierdzeniu, do którego „powróciłeś”.

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

    To jest bezpieczny i łatwy sposób na przywrócenie poprzedniego stanu . Żadna historia nie jest niszczona, więc może zostać użyta do zatwierdzenia, które zostało już upublicznione.

        
    1458
    2014-06-28 20: 12: 34Z
    1. Jeśli naprawdę chcesz mieć indywidualne zatwierdzenia (zamiast cofać wszystko za pomocą jednego dużego zatwierdzenia), możesz przekazać --no-edit zamiast --no-commit, abyś nie zrobił trzeba edytować komunikat zatwierdzenia dla każdej zmiany.
      2014-06-28 20: 11: 40Z
    2. Jeśli jedno z zatwierdzeń między 0766c053..HEAD jest połączeniem, pojawi się błąd pojawiający się (bez podanego parametru -m). Może to pomóc tym, którzy się z tym spotykają: stackoverflow.com/questions/5970889/…
      2014-11-21 11: 55: 43Z
    3. Aby zobaczyć różnice przed zatwierdzeniem użycia git diff --cached.
      2015-11-06 18: 35: 20Z
    4. $ git revert --no-commit 53742ae..HEAD zwraca fatal: empty commit set passed
      2016-08-01 20: 30: 18Z
    5. @ AlexG, ponieważ musisz wprowadzić skrót jeden przed ten, do którego chcesz wrócić. W moim przypadku wartości mieszania wynosiły: 81bcc9e HEAD{0}; e475924 HEAD{1}, ... (od git reflog) i chciałem cofnąć to, co zrobiłem w 81bcc9e, potem musiałem zrobić git revert e475924..HEAD
      2017-04-16 14: 22: 51Z

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

     
    git reset --hard <commidId> && git clean -f
    

    To była najlepsza opcja dla mnie! Jest prosty, szybki i skuteczny!


    Uwaga: Jak wspomniano w komentarzach, nie rób tego, jeśli udostępniasz swój oddział innym osobom, które mają kopie starych zatwierdzeń

    Również z komentarzy, jeśli chcesz mniej „ballzy”, możesz użyć

    git clean -i

        
    184
    2015-07-16 15: 31: 10Z
    1. Obligatory Warning: nie rób tego , jeśli udostępniasz swój oddział innym osobom, które mają kopie starych zatwierdzeń, ponieważ używanie taki twardy reset zmusi ich do ponownej synchronizacji pracy z nowo zresetowaną gałęzią. Aby uzyskać rozwiązanie, które szczegółowo wyjaśnia, jak bezpiecznie przywrócić zatwierdzenia bez utraty pracy z twardym resetem, zobacz tę odpowiedź .
      2014-06-28 20: 03: 54Z
    2. I second @ Cupcake's warning ... Bądź świadomy konsekwencji. Zauważ jednak, że jeśli naprawdę chcesz, aby te zmiany zniknęły z historii na zawsze, ta metoda resetowania + czyszczenia zrobi to, a będziesz potrzebował wymusić pchnięcieTwoje zmodyfikowane gałęzie wracają do wszystkich i wszystkich pilotów.
      2014-10-29 14: 46: 25Z
    3. git clean -f DANGER DANGER
      2015-07-16 14: 59: 20Z
    4. Ustawia głowę mojej lokalnej kopii na żądane zatwierdzenie. Ale potem nie mogę wcisnąć żadnych zmian, ponieważ jest za pilotem. A jeśli ściągnę z pilota, to wróci tam, gdzie był w najnowszym zatwierdzeniu na zdalnej gałęzi. Jak całkowicie zniszczyć (zewsząd) kilka zatwierdzonych zarówno na mojej lokalnej kopii, która została wypchnięta?
      2017-10-22 11: 47: 32Z
    5. @ Ade .. Możesz użyć flagi git push -f. Ale bądź ostrożny, to zastąpi pilota .. Upewnij się, że wiesz, co chcesz zrobić.
      2017-10-23 09: 02: 57Z

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

    First of all what is HEAD?

    HEAD jest po prostu odwołaniem do bieżącego zatwierdzenia (najnowszego) w bieżącej gałęzi. W danym momencie może być tylko HEAD (z wyłączeniem git worktree).

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


    detached HEAD

    Jeśli nie jesteś w najnowszym zatwierdzeniu - co oznacza, że ​​HEAD wskazuje na wcześniejsze zatwierdzenie w historii, nazywa się to detached HEAD .

     Wpisz opis obrazu tutaj>> </a> </p>

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

<p> <a href= Wpisz opis obrazu tutaj>> </a> </p>

<hr>
<h3> Kilka opcji, jak odzyskać z odłączonej GŁOWY: </h3>

<hr>
<h3> <a href=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
    

    Spowoduje to pobranie nowej gałęzi wskazującej na pożądane zatwierdzenie. To polecenie pobierze do danego zatwierdzenia.

    W tym momencie możesz utworzyć gałąź i zacząć pracować 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 również użyć reflog. git reflog wyświetli każdą zmianę, która zaktualizowała HEAD i sprawdzenie żądanego wpisu reflog spowoduje powrót HEAD do tego zatwierdzenia.

    Za każdym razem, gdy HEAD zostanie zmodyfikowany, pojawi się nowy wpis w reflog

     
    git reflog
    git checkout HEAD@{...}
    

    Spowoduje to powrót do żądanego zatwierdzenia

     Wpisz opis obrazu tutaj>> </a> </p>

<hr>
<h3><strong> <em> <a href=git reset HEAD --hard <commit_id>

    „Przenieś” głowę z powrotem do żądanego zatwierdzenia.

     
    # 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 robi co. Jak widać, reset && checkout modyfikuje HEAD.

     Wpisz opis obrazu tutaj>> </a> </p>
    </div>
<div class = 143

    2018-07-04 19: 25: 17Z
    1. Doskonała wskazówka do git reflog, dokładnie tego potrzebowałem
      2016-03-13 21: 25: 01Z
    2. Ouch! Wszystko to wydaje się bardzo skomplikowane ... czy nie ma prostego polecenia, które wystarczy, aby cofnąć się o krok? Jak przejście z wersji 1.1 projektu do wersji 1.0? Spodziewałbym się czegoś takiego: git stepback_one_commit lub coś ....
      2016-03-20 14: 35: 15Z
    3. jest: git reset HEAD^ - hard`
      2016-03-20 14: 38: 43Z
    4. @ Kokodoko Tak, to jest strasznie skomplikowane ... i doskonały przykład tego, jak mało uwagi mają eksperci dla osób, które dopiero zaczynają. Proszę odnieść się do mojej odpowiedzi tutaj, a także do książki, którą polecam. Git NIE jest czymś, co można intuicyjnie odebrać. I mogę być absolutnie pewien, że CodeWizard tego nie zrobił.
      2016-08-29 17: 17: 51Z

    Jeśli chcesz „anulować zatwierdzenie”, usunąć ostatnią wiadomość zatwierdzenia i umieścić zmodyfikowane pliki z powrotem w przemieszczaniu, użyj polecenia:

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

    Jest to niezwykle przydatne polecenie w sytuacjach, w których popełniłeś złą rzecz i chcesz cofnąć ostatnie zatwierdzenie.

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

        
    125
    2014-03-04 17: 25: 52Z
    1. To jest miękkie i łagodne: bez ryzyka, jeśli nie popchnąłeś swojej pracy
      2017-01-18 10: 04: 18Z

    Próbowałem wiele sposobów, aby przywrócić lokalne zmiany w Git i wydaje się, że działa najlepiej, jeśli chcesz po prostu wrócić do najnowszego stanu zatwierdzenia.

     
    git add . && git checkout master -f
    

    Krótki opis:

    • NIE utworzy żadnych zatwierdzeń, jak robi to git revert.
    • NIE odłączy twojej GŁOWY, podobnie jak git checkout <commithashcode>.
    • ZMIENIA wszystkie lokalne zmiany i USUŃ wszystkie dodane pliki od ostatniego zatwierdzenia w gałęzi.
    • Działa tylko z nazwami gałęzi, dzięki czemu można w ten sposób przywrócić tylko ostatnie zatwierdzenie w gałęzi.

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

     
    git add . && git reset --hard HEAD
    

    gdzie HEAD wskazuje najnowsze zatwierdzenie w bieżącej gałęzi.

    Jest to ten sam kod, który zasugerował boulder_ruby, ale dodałem git add . przed git reset --hard HEAD, aby wymazać wszystkie nowe pliki utworzone od czasu ostatniego zatwierdzenia, ponieważ tego oczekuje większość ludzi, o których sądzę, gdy powracam do ostatniego zatwierdzenia.

        
    105
    2014-06-24 20: 08: 20Z

    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 twoje poprzednie zatwierdzenie Git.

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

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

    Wtedy zapisze twoje zmiany.

        
    99
    2016-07-03 06: 30: 27Z
    1. Próbowałem 1/2 tuzina odpowiedzi w tym poście, dopóki nie dotarłem do tego ... wszystkich tych innych, moja konfiguracja git nadal powodowała błąd podczas próby Pchać. Ta odpowiedź zadziałała. Dzięki!
      2016-09-16 19: 47: 15Z
    2. Jeden szczegół dla mnie był taki, że zgubiłem pliki różnicowe, które chciałem zachować, aby zobaczyć, co zrobiłem w zatwierdzeniu, które nie działa. Więc następnym razem po prostu zapiszę te dane przed wydaniem polecenia reset
      2016-09-16 19: 49: 36Z
    3. To byłow tym przypadku jedynym sposobem cofnięcia złej korespondencji seryjnej jest przywrócenie. Dzięki!
      2017-01-19 20: 07: 19Z

    OK, powrót do poprzedniego zatwierdzenia w git jest całkiem prosty ...

    Przywróć bez zachowania zmian:

     
    git reset --hard <commit>
    

    Przywróć z zachowaniem zmian:

     
    git reset --soft <commit>
    

    Wyjaśnij: używając resetowania git, możesz zresetować do określonego stanu, często używasz go z hashem zatwierdzenia, jak widać powyżej.

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


    --soft

    Flaga domyślna, jak wyjaśniono, nie musi jej udostępniać, nie zmienia drzewa roboczego, ale dodaje wszystkie pliki zmian gotowe do zatwierdzenia, więc wracasz do statusu zatwierdzenia, którego zmiany w plikach nie są wyświetlane.


    - ciężko

    Uważaj z tą flagą, resetuje drzewo robocze i wszystkie zmiany w śledzonych plikach i wszystko zniknie!


    Stworzyłem także poniższy obrazek, który może się zdarzyć w prawdziwym życiu przy użyciu git:

     git zresetuj do zatwierdzenia

        
    65
    2019-02-05 13: 24: 37Z

    Nic tu nie zadziałało, poza tą dokładną kombinacją:

     
    git reset --hard <commit_hash>
    git push origin <branch_name> --force
    

    Kluczem jest tutaj wymuszanie wypychania, brak dodatkowych zatwierdzeń /zatwierdzania komunikatów itd.

        
    59
    2018-04-23 01: 47: 59Z
    1. To zadziałało dla mnie, ale musisz być ostrożny, ponieważ cała historia zatwierdzenia po twardym resecie została utracona i ta akcja jest nieodwracalna. Musisz być pewien, co robisz.
      2018-04-19 19: 34: 15Z

    Powiedz, że masz następujące zatwierdzenia 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 Bash skrypt powłoki, 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
    

    Powoduje to przywrócenie wszystkiego do poprzedniego stanu, w tym tworzenie plików i katalogów oraz usuwanie, zatwierdzenie go do gałęzi i zachowanie historii, ale przywrócenie tej samej struktury plików. Dlaczego Git nie ma git revert --to <hash> jest poza mną.

        
    57
    2014-06-29 00: 13: 03Z
    1. Możesz zrobić git revert HEAD~3, aby usunąć ostatnie 3 zatwierdzenia
      2012-02-19 18: 59: 22Z
    2. @ Rod - Nie, to nie w porządku. To polecenie przywróci zatwierdzenie, które jest trzecim dziadkiem HEAD (a nie trzema ostatnimi zatwierdzeniami).
      2012-09-11 22: 13: 05Z
    3. @ kflorence Ok dzięki za informacje. Czy git revert -n master~3..master~1 zadziała? (Jak widać z kernel.org/pub/software/scm /git /docs /git-revert.html )
      2012-09-12 01: 59: 58Z
    4. @ Rod - To brzmi dobrze, na pewno jest to brzydka składnia, prawda? Zawsze znajdowałem sprawdzanie zatwierdzenia, do którego chcę „przywrócić”, a następnie zatwierdzam go bardziej intuicyjnie.
      2012-10-01 01: 12: 03Z
    5. Jest teraz dużo łatwiejszy sposób na zrobienie tego teraz niż w przypadku takiego skryptu, po prostu użyj git revert --no-commit <start>..<end>, ponieważ git revert akceptuje zakres zatwierdzenia w nowych (lub wszystkich?) Wersjach Gita. początek zakresu nie jest zawarty w rewersie.
      2014-06-28 20: 02: 39Z

    Dodatkowe alternatywy dla rozwiązań Jefromi

    Rozwiązania Jefromi są zdecydowanie najlepsze i zdecydowanie powinieneś ich używać. Jednak dla zachowania kompletności chciałem również pokazać te inne alternatywne rozwiązania, które mogą być również użyte do przywrócenia zatwierdzenia (w tym sensie, że utworzysz nowe zatwierdzenie, które cofnie zmiany w poprzednim zatwierdzeniu ) tak jak git revert).

    Żeby było jasne, te alternatywy nie są najlepszym sposobem na przywrócenie zatwierdzeń , Rozwiązania Jefromi są , ale chcę tylko podkreślić, że możesz użyć tych innych metod, aby osiągnąć to samo, co git revert.

    Alternatywa 1: Twarde i miękkie resetowanie

    To jest bardzo nieznacznie zmodyfikowana wersja rozwiązania Charlesa Baileya do Przywróć zatwierdzenie za pomocą skrótu SHA 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>"
    

    Zasadniczo działa to na podstawie faktu, że miękkie resetowanie pozostawi stan poprzedniego zatwierdzenia w obszarze indeksu /stagingu, który możesz następnie zatwierdzić.

    Alternatywa 2: Usuń bieżące drzewo i zastąp je nowym

    To rozwiązanie pochodzi z rozwiązania svick na Sprawdź stare zatwierdzenie i uczyń je nowym zatwierdzeniem :

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

    Podobnie jak w przypadku alternatywy nr 1, odtwarza stan <commit> w bieżącej kopii roboczej. Najpierw trzeba wykonać git rm, ponieważ git checkout nie usunie plików, które zostały dodane od <commit>.

        
    56
    2017-05-23 11: 47: 32Z
    1. O alternatywie 1, jedno szybkie pytanie: Robiąc to, nie tracimy między zatwierdzeniami w prawo?
      2014-12-02 10: 14: 33Z
    2. w Alternatywie 2, kropki oznaczają co w tych poleceniach?
      2014-12-02 10: 21: 40Z
    3. @ Bogac - kropki wskazują ścieżkę pliku, w tym przypadku bieżący katalog, więc zakłada się, że uruchamiasz go z katalogu głównego kopii roboczej.
      2014-12-02 19: 06: 38Z
    4. Ostrzeżenie jest powtarzane kilka razy w odpowiedzi, ale czy ktoś może dodać dlaczego to są nie najlepsze sposoby - w porównaniu do czegoś takiego jak git revert HEAD~2..HEAD z połączonego rozwiązania @ Cascabel (@ Jefromi). Nie widzę problemu.
      2018-12-28 02: 16: 08Z

    Zakładając, że mówisz o kapitale i danej gałęzi (może to być dowolna gałąź robocza, którą się zajmujesz):

     
    # 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ź na blogu (już nie istnieje)

    Zauważ, że jest to resetowanie i wymuszanie zmiany na pilocie, tak że jeśli inni w twojej drużynie już zostali pociągnięci, spowoduje to dla nich problemy. Niszczysz historię zmian, co jest ważnym powodem, dla którego ludzie używają gita na pierwszym miejscu.

    Lepiej użyć przywracania (patrz inne odpowiedzi) niż resetować. Jeśli jesteś zespołem jednoosobowym, to prawdopodobnie nie ma znaczenia.

        
    56
    2019-04-28 19: 59: 43Z
    1. W jaki sposób ta odpowiedź różni się od miriady innych?
      2016-05-10 17: 46: 51Z
    2. Link jest uszkodzony.
      2016-07-03 10: 59: 27Z
    3. To niefortunne. Wysłałem e-mail do blogera - mam nadzieję, że nadal go ma!
      2016-07-04 19: 29: 37Z
    4. 2016-09-01 17: 51: 49Z
    5. W większości innych sugestii, jak to naprawić, brakuje składni push. Działa świetnie.
      2017-03-24 16: 20: 56Z

    Oto znacznie prostszy sposób, aby wrócić do poprzedniego zatwierdzenia (i mieć go w niezatwierdzonym stanie, aby zrobić z nim cokolwiek chcesz):

     
    git reset HEAD~1
    

    Tak więc nie ma potrzeby wprowadzania identyfikatorów zmian itd. :)

        
    51
    2016-07-03 10: 56: 38Z
    1. nie działa, ciąg git po tym daje: error: Twoje lokalne zmiany w następujących plikach zostaną nadpisane przez scalenie:
      2016-11-05 00: 21: 33Z
    2. @ malhal To dlatego, że miałeś niezatwierdzone zmiany. Zatrzymaj /zresetuj je, a następnie będzie działać bez tego błędu.
      2017-01-22 13: 37: 38Z

    Po wszystkich zmianach, po naciśnięciu wszystkich tych poleceń, możesz użyć:

     
    git push -f ...
    

    I nie tylko git push.

        
    34
    2013-09-28 19: 07: 07Z
    1. Obligatory Warning: nie rób tego , jeśli udostępniasz swój oddział innym osobom, które mają kopie starych zatwierdzeń, ponieważ używanie wciśnięcie w ten sposób zmusi ich do ponownej synchronizacji pracy. Aby uzyskać rozwiązanie, które szczegółowo wyjaśnia, jak bezpiecznie przywrócić zatwierdzenia bez utraty pracy z użyciem siły, zobacz tę odpowiedź .
      2014-06-28 20: 00: 19Z
    2. Czasami jest to, czego chcesz. Przykład: zatwierdzone i popchnięte kilka zatwierdzeń do niewłaściwej gałęzi (gałąź A). Po selekcji do gałęzi B, chcę, aby te zatwierdzenia zostały usunięte z gałęzi A. Nie chciałbym się cofać, ponieważ przywrócenie zostanie później zastosowane, gdy gałąź A i B zostaną połączone. Resetowanie - hard < commitId > w gałęzi A, po której następuje naciśnięcie siły, usuwa te zatwierdzenia z gałęzi, zachowując je w gałęzi B. Mogę sobie z tym poradzić, ponieważ wiem, że nikt inny nie rozwija się na gałęzi A.
      2014-10-22 20: 44: 19Z
    3. Dzięki! Nie mogłem zrozumieć, w jaki sposób zmusić zdalną gałąź do dopasowania się do mojej lokalnej gałęzi. Wystarczy wykonać wymuszone naciśnięcie.
      2017-02-06 12: 49: 58Z

    Jest polecenie (nie jest częścią podstawowego Gita, ale jest w pakiecie git-extras ) do cofania i tworzenia starych zatwierdzeń:

     
    git back
    

    Na strona man , może być również używana jako taka:

     
    # Remove the latest three commits
    git back 3
    
        
    34
    2014-06-28 20: 19: 45Z

    Możesz wykonać wszystkie te początkowe kroki samodzielnie i cofnąć się do git repo.

    1. Wyciągnij najnowszą wersję swojego repozytorium z Bitbucket za pomocą  git pull --all polecenie.

    2. Uruchom polecenie git log z opcją -n 4 z terminala. Liczba po znaku -n określa liczbę zatwierdzeń w dzienniku, począwszy od ostatniego zatwierdzenia w historii lokalnej.

      $ git log -n 4

    3. Zresetuj głowę historii repozytorium za pomocą git reset --hard HEAD~N, gdzie N jest liczbą zatwierdzeń, które chcesz cofnąć. W poniższym przykładzie głowa zostanie cofnięta zatwierdzenie, do ostatniego zatwierdzenia w historii repozytorium:

    4. Naciśnij zmianę, aby git repo za pomocą git push --force wymusić pchnięcie zmiana.

    Jeśli chcesz, aby repozytorium git było poprzednim zatwierdzeniem

     
    git pull --all
    git reset --hard HEAD~1
    git push --force
    
        
    29
    2018-07-05 20: 56: 59Z

    Wróć do najnowszego zatwierdzenia i ignoruj ​​wszystkie lokalne zmiany:

     
    git reset --hard HEAD
    
        
    27
    2018-07-04 19: 28: 44Z

    Wybierz wymagane zatwierdzenie i sprawdź je za pomocą

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

    dopóki nie otrzymasz wymaganego zatwierdzenia. Aby wskazać na to HEAD, zrób

     
    git reset --hard HEAD~1
    

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

        
    26
    2014-06-28 19: 51: 32Z
    1. Obligatory Warning: nie rób tego , jeśli udostępniasz swój oddział innym osobom, które mają kopie starych zatwierdzeń, ponieważ używanie taki twardy reset zmusi ich do ponownej synchronizacji pracy z nowo zresetowaną gałęzią. Aby uzyskać rozwiązanie, które szczegółowo wyjaśnia, jak bezpiecznie przywrócić zatwierdzenia bez utraty pracy z twardym resetem, zobacz tę odpowiedź .
      2014-06-28 19: 57: 00Z
    2. Dla jasności git show HEAD jest równoznaczne z użyciem git log HEAD -1.
      2014-06-28 19: 58: 54Z

    Aby zachować zmiany z poprzedniego zatwierdzenia na HEAD i przejść do poprzedniego zatwierdzenia, wykonaj:

     
    git reset <SHA>
    

    Jeśli zmiany nie są wymagane od poprzedniego zatwierdzenia do HEAD i po prostu odrzucasz wszystkie zmiany, wykonaj:

     
    git reset --hard <SHA>
    
        
    20
    2016-07-03 10: 21: 53Z

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

     
    git add -A .
    git reset --hard HEAD
    

    Tylko 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 gdzieś losowo, a wszystkie te pliki były traktowane przez Gita jako nowe, więc reset --hard tego nie naprawił. Uruchomiwszy wcześniej git add -A ., jawnie śledził je wszystkie za pomocą git, aby zostały usunięte przez reset.

        
    20
    2016-07-03 10: 55: 25Z

    To kolejny sposób bezpośredniego zresetowania do niedawnego zatwierdzenia

     
    git stash
    git stash clear
    

    Czyści bezpośrednio all zmiany, które wprowadziłeś od ostatniego zatwierdzenia.

    PS: Ma mały problem; usuwa również wszystkie ostatnio zapisane zmiany skrytki. Myślę, że w większości przypadków nie ma to znaczenia.

        
    20
    2016-07-03 10: 57: 18Z
    1. UWAGA: Nowe pliki nie dodane do indeksu nie są przechowywane. Masz też je dodać lub ręcznie usunąć.
      2016-12-08 14: 08: 46Z
    2. Dlaczego oh dlaczego czyszczenie zapasów? Oprócz tego, że nie jest rozwiązaniem, jest to rzeczywiście szkodliwe. Odczytanie pierwszego zdania pytania natychmiast unieważnia rozwiązanie ukryte (które może być użyteczne TYLKO do zresetowania do LAST zatwierdzenia).
      2019-03-07 07: 35: 51Z

    Sądzę, że niektórzy ludzie mogą dojść do tego pytania, chcąc dowiedzieć się, jak wycofać zatwierdzone zmiany, które wprowadzili w swoim mistrzu - tj. wyrzucić wszystko i wrócić do źródła /wzorca, w którym to przypadku:

     
    git reset --hard origin/master
    

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

        
    19
    2017-03-20 10: 18: 20Z

    Przywróć to polecenie cofnięcia zatwierdzeń.

     
    git revert <commit1> <commit2> 
    

    Sample :

    git revert 2h3h23233

    Jest w stanie uzyskać zasięg od HEAD, jak poniżej. Tutaj 1 mówi „cofnij ostatnie zatwierdzenie.”

    git revert HEAD~1..HEAD

    , a następnie git push

        
    16
    2016-05-27 06: 05: 57Z

    Przywróć ostatnie zatwierdzenie:

     
    git reset --hard HEAD
    

    HEAD jest po prostu odwołaniem do bieżącego zatwierdzenia (najnowszego) w bieżącej gałęzi. W danym momencie może być tylko HEAD.

    Przywróć starsze zatwierdzenie: Najszybszym sposobem przywrócenia starej wersji jest użycie polecenia reset:

     
    # Resets index to former commit
    git reset 56e05fced 
    
    # Moves pointer back to previous HEAD
    git reset --soft HEAD@{1}
    
    # Updates working copy to reflect the new commit
    git reset --hard
    

    Spowoduje to przewinięcie gałęzi HEAD do określonej wersji. Wszystkie zatwierdzenia, które pojawiły się po tej wersji, są skutecznie cofnięte; Twój projekt jest dokładnie taki, jaki był w tym momencie.

    Komenda reset zawiera kilka opcji, z których jedną z ciekawszych jest flaga --soft. Jeśli użyjesz go zamiast --hard, Git zachowa wszystkie zmiany w tych zmianach „cofnięte” zatwierdza jako lokalne modyfikacje.

    Przywracanie wersji w nowym oddziale lokalnym

    Jak powiedziano, użycie polecenia reset w gałęzi HEAD jest dość drastycznym działaniem: usunie wszystkie zatwierdzenia (na tej gałęzi), które pojawiły się po określonej wersji. Jeśli jesteś pewien, że tego właśnie chcesz, wszystko jest w porządku.

    Istnieje jednak również bezpieczniejszy sposób na wypadek, gdybyś wolał pozostawiać bieżącą gałąź HEAD bez zmian. Ponieważ „gałęzie” są tak tanie i łatwe w Git, możemy łatwo utworzyć nową gałąź, która zaczyna się w tej starej wersji:

     
    git checkout -b old-project-state 0ad5a7a6
    

    Zazwyczaj polecenie checkout służy do przełączania gałęzi. Jednakże, podając parametr -b, możesz również pozwolić mu utworzyć nową gałąź (w tym przykładzie nazwaną stary-stan-projektu ). Jeśli nie chcesz, aby zaczynał się od bieżącej wersji HEAD, musisz również podać skrót zatwierdzający - starą wersję projektu, którą chcemy przywrócić.

    Masz teraz nowy oddział o nazwie stary-stan-projektu odzwierciedlający starą wersję projektu - bez dotykania, a nawet usuwania innych zatwierdzeń lub oddziałów.

        
    16
    2018-08-31 11: 08: 13Z

    Jeśli sytuacja jest pilna , a po prostu chcesz zrobić to, co questoweon zapytał w szybki i brudny sposób , zakładając, że twój projekt znajduje się w katalogu „mój projekt”:

    1. Skopiuj cały katalog i nazwij go czymś innym, jak „mój projekt - skopiuj”

    2. Wykonaj:

       
      git reset --hard [first-4-letters&numbers-of-commit's-SHA]
      

    Następnie masz dwie wersje systemu ... możesz zbadać lub skopiować lub zmodyfikować interesujące Cię pliki lub cokolwiek innego z poprzedniego zatwierdzenia. Możesz całkowicie odrzucić pliki w „mój projekt - kopia”, jeśli zdecydowałeś, że nowa praca nigdzie nie idzie ...

    Oczywistą rzeczą, jeśli chcesz kontynuować stan projektu bez faktycznego odrzucenia pracy, ponieważ to pobrane zatwierdzenie ma ponownie zmienić nazwę katalogu: Usuń projekt zawierający pobrane zatwierdzenie (lub nadaj mu nazwę tymczasową) i zmień nazwę katalogu „mój projekt - kopia” na „mój projekt”. Prawdopodobnie wkrótce zrobisz kolejne zatwierdzenie.

    Git jest genialnym dziełem, ale nie możesz po prostu „podnieść go w locie”: również ludzie, którzy próbują to wyjaśnić zbyt często , zakładają wcześniejszą znajomość innych systemów kontroli wersji ] i zbyt głęboko zagłębić się zbyt wcześnie i popełnić inne przestępstwa, takie jak używanie wymiennych terminów do „sprawdzania” - w sposób, który czasami wydaje się prawie obliczony, aby wprowadzić w błąd początkującego.

    Aby zaoszczędzić sobie wiele stresu, musisz czytać książkę na Git - polecam tutaj . Bądź ostrzeżony : jeśli masz repozytorium „oddzielnego katalogu”, którego nie kopiujesz i wykonujesz twardy reset, wszystkie wersje po zatwierdzeniu resetowania zostaną utracone na zawsze, chyba że Powinieneś regularnie tworzyć kopie zapasowe repozytorium, najlepiej w chmurze (np. Dysk Google ) między innymi.

        
    13
    2017-05-23 11: 55: 13Z

    Spróbuj zresetować do żądanego zatwierdzenia -

    git reset <COMMIT_ID>

    (aby sprawdzić użycie COMMIT_ID git log)

    Spowoduje to zresetowanie wszystkich zmienionych plików do stanu bez dodania.

    Teraz możesz checkout wszystkich nie dodanych plików przez

    git checkout .

    Sprawdź git log, aby zweryfikować zmiany.

    UPDATE

    Jeśli masz jedyne zatwierdzenie w repo, spróbuj

    git update-ref -d HEAD

        
    13
    2018-04-17 10: 02: 40Z

    W miarę zdejmowania Twoich poleceń musisz je usunąć. Przyjmijmy, że twoja gałąź się rozwija i jest wypychana na początek.

    Najpierw musisz usunąć rozwinięcie z pochodzenia:

     
    git push origin :develop (note the colon)
    

    Następnie musisz przejść do stanu, który chcesz, pozwól, że założę, że hash zatwierdzenia to EFGHIJK:

     
    git reset --hard EFGHIJK
    

    Na koniec naciśnij ponownie rozwinięcie:

     
    git push origin develop
    
        
    11
    2017-04-19 07: 18: 34Z
      

    Uwaga! To polecenie może spowodować utratę historii zatwierdzania, jeśli użytkownik błędnie popełni błąd. Zawsze miej kilka dodatkowych kopii zapasowych   gdzie indziej na wypadek, gdybyś popełnił błędy, jesteś trochę bezpieczniejszy.   :)

    Miałem podobny problem i chciałemwrócić do wcześniejszego Commit. W moim przypadku nie miałem zamiaru utrzymywać nowszego zatwierdzenia, dlatego użyłem Hard.

    Tak to zrobiłem:

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

    Powróci do lokalnego repozytorium, tutaj po użyciu git push -f zaktualizuje zdalne repozytorium.

     
    git push -f
    
        
    11
    2018-02-02 13: 51: 57Z

    Jeśli chcesz poprawić błąd w ostatnim zatwierdzeniu, dobrą alternatywą byłoby użycie polecenia git commit --amend . Jeśli ostatnie zatwierdzenie nie jest wskazywane przez żadne odniesienie, to zrobi to sztuczkę, ponieważ tworzy zatwierdzenie z tym samym rodzicem co ostatnie zatwierdzenie. Jeśli nie ma odniesienia do ostatniego zatwierdzenia, zostanie ono po prostu odrzucone i to zatwierdzenie będzie ostatnim zatwierdzeniem. Jest to dobry sposób poprawiania zatwierdzeń bez cofania zatwierdzeń. Jednak ma swoje ograniczenia.

        
    10
    2015-07-01 11: 35: 54Z
źródło umieszczone tutaj