Jak cofnąć ściągnięcie git?


238

Chciałbym cofnąć ściąganie git z powodu niechcianych zatwierdzeń na zdalnym źródle, ale nie wiem, do której wersji muszę zresetować.

Jak mogę wrócić do stanu, zanim git ściągnął zdalne źródło?


4
Uwaga dodatkowa: najpierw może się przydać git fetch upstream, a następnie rzucić okiem na git diff upstream/branchto, co się połączy. Jeśli wszystko jest w porządku, kontynuujgit merge upstream/branch
Shahbaz,

1
Utracisz wszystkie swoje uliczne ulgi i zostaniesz zadokowany tygodniową wypłatę, jeśli dowolny broker modnisia zobaczy, że wykonujesz polecenia git z graficznego interfejsu użytkownika, ale zarówno GitHub Desktop, jak i Atom mają bezpieczne, proste przyciski do undozatwierdzania i pola wyboru, aby łatwo i wyraźnie ustawiać i rozpakowywać pliki. GUI to także ludzie!
Dem Pilafian

Odpowiedzi:


391

Lub, aby było bardziej wyraźne niż inna odpowiedź:

git pull 

ups

git reset --keep HEAD@{1}

Wersje git starsze niż 1.7.1 nie mają --keep. Jeśli używasz takiej wersji, możesz jej użyć --hard- ale jest to niebezpieczna operacja, ponieważ traci wszelkie lokalne zmiany.


Do komentatora

ORIG_HEAD to poprzedni stan HEAD, ustawiony za pomocą poleceń, które mogą mieć niebezpieczne zachowanie, aby można je było łatwo przywrócić. Jest mniej przydatny teraz, gdy Git się ponownie zarejestrował: HEAD @ {1} jest mniej więcej równoważny ORIG_HEAD (HEAD @ {1} jest zawsze ostatnią wartością HEAD, ORIG_HEAD jest ostatnią wartością HEAD przed niebezpieczną operacją)


2
Jaka jest różnica między HEAD @ {1} i HEAD ^?
hugemeow

7
@hugemeow To byłoby dobre pytanie SO. Tymczasem man git-rev-parseopisuje to. HEAD@{1}jest poprzednią wartością symboliczną, HEADpodczas refloggdy HEAD^jest (pierwszą) nadrzędną wersją prądu HEAD. Te dwa elementy muszą być równoważne (np. Po zmianie bazy, twardym resecie, przełączniku gałęzi i tym podobne). Przeczytaj link do artykułu, aby się zalogować. Pozdrawiam
sehe

10
Użytkownicy programu PowerShell uciekają w nawiasy klamrowe:git reset HEAD@`{1`}
Robert Claypool,

3
ss64.com/ps/syntax-esc.html myślę, że chciał, aby wpisać HEAD@`{1`}, czy o to chodzi to, co działa na muszli POSIX zbyt:'HEAD@{1}'
sehe

2
Myślę, że to nie tylko zresetowało ściąganie, ale także moje zobowiązania = (
falsarella,

67

git reflog showpowinien pokazać historię HEAD. Możesz użyć tego, aby dowiedzieć się, gdzie byłeś przed pull. Następnie możesz resetprzystąpić HEADdo tego zatwierdzenia.


git reflog show dał ten wynik: c9e5e4d HEAD @ {0}: pull: przewijanie do przodu 1c86a22 HEAD @ {1}: pull origin master: przewijanie do przodu 05c141a HEAD @ {2}: pull: przewijanie do przodu Czy mogę bezpiecznie zresetować HEAD do HEAD @ {1}
Kartins

Inna odpowiedź sehe zawiera szczegółowe informacje, jak się tam dostać.
Noufal Ibrahim

Było to bardzo przydatne po katastrofalnym popełnieniu w jakiś sposób przeplatanych zobowiązań scalania w mojej historii. Wydostałem się z nich, szukając ostatniego znanego dobra na liście zmian, a następnie zmuszając do pchania.
Domenic,

Co jeśli pullpierwsza akcja? Jeśli pulljest HEAD@{1}i nic innego przed tym, jak powrócisz do stanu sprzed tego?
Hendra Uzia,

Czy odtworzyć repozytorium?
Noufal Ibrahim,

29

To zadziałało dla mnie.

git reset --hard ORIG_HEAD 

Cofnij scalenie lub pociągnij:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

Sprawdź to: HEAD i ORIG_HEAD w Git po więcej.


17

Znajdź <SHA#>zatwierdzenie, które chcesz przejść. Możesz go znaleźć w github, wpisując git loglub git reflog showw wierszu poleceń, a następnie wykonaj git reset --hard <SHA#>


Znajdź co do zatwierdzenia?
Martin

Przepraszam, naprawiłem to<SHA#>
Nina,

Tego polecenia najczęściej używam, gdy muszę coś cofnąć
Kartins,

2

From https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

Cofnij scalenie lub wciągnij do brudnego drzewa roboczego

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

Nawet jeśli możesz mieć lokalne modyfikacje w działającym drzewie, możesz spokojnie powiedzieć, git pullkiedy wiesz, że zmiana w drugiej gałęzi nie pokrywa się z nimi.

Po sprawdzeniu wyniku scalenia może się okazać, że zmiana w drugim oddziale jest niezadowalająca. Uruchomienie git reset --hard ORIG_HEAD pozwoli ci wrócić do miejsca, w którym byłeś, ale odrzuci twoje lokalne zmiany, których nie chcesz. git reset --mergezachowuje lokalne zmiany.

Zobacz także https://stackoverflow.com/a/30345382/621690


Dzięki! Uratowałeś mi dzień
Thiago Martins,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.