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?

Kartins
ź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ą)

sehe
źródło
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.

Noufal Ibrahim
źródło
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.

Parag Tyagi
źródło
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#>

Nina
źródło
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

Risadinha
źródło
Dzięki! Uratowałeś mi dzień
Thiago Martins,