Wie mache ich einen Git Pull rückgängig?


238

Ich möchte meinen Git Pull wegen unerwünschter Commits auf dem Remote-Ursprung rückgängig machen, weiß aber nicht, auf welche Revision ich zurücksetzen muss.

Wie kann ich einfach in den Zustand zurückkehren, bevor ich den Git auf den entfernten Ursprung gezogen habe?


4
Randnotiz: Es kann nützlich sein, git fetch upstreamzuerst einen kurzen Blick darauf zu werfen git diff upstream/branch, was Sie zusammenführen werden. Wenn alles git merge upstream/branch
Shahbaz

1
Sie verlieren Ihr gesamtes Straßenguthaben und werden eine Woche lang angedockt, wenn ein Hipster-Brogrammer sieht, dass Sie Git- Befehle über eine GUI ausführen, aber sowohl GitHub Desktop als auch Atom verfügen über sichere, unkomplizierte Schaltflächen zum undoFestschreiben und Aktivieren von Kontrollkästchen, um Dateien einfach und klar zu inszenieren und zu entfernen. GUIs sind auch Menschen!
Dem Pilafian

Antworten:


391

Oder um es deutlicher zu machen als die andere Antwort:

git pull 

Hoppla?

git reset --keep HEAD@{1}

Git-Versionen älter als 1.7.1 haben keine --keep. Wenn Sie eine solche Version verwenden, können Sie diese verwenden --hard- dies ist jedoch eine gefährliche Operation, da lokale Änderungen verloren gehen.


An den Kommentator

ORIG_HEAD ist der vorherige Status von HEAD, der durch Befehle festgelegt wird, die möglicherweise ein gefährliches Verhalten aufweisen, damit sie leicht zurückgesetzt werden können. Es ist jetzt weniger nützlich, da Git ein Reflog hat: HEAD @ {1} entspricht in etwa ORIG_HEAD (HEAD @ {1} ist immer der letzte Wert von HEAD, ORIG_HEAD ist der letzte Wert von HEAD vor einer gefährlichen Operation).


2
Was ist der Unterschied zwischen HEAD @ {1} und HEAD ^?
Hugemeow

7
@hugemeow Das wäre eine gute SO-Frage. Inzwischen man git-rev-parsebeschreibt dies. HEAD@{1}ist der vorherige Wert von symbolic HEADin der, reflogwährend HEAD^die (erste) übergeordnete Revision des aktuellen ist HEAD. Diese beiden müssen nicht gleichwertig sein (z. B. nach einem Rebase, einem Hard Reset, einem Branch Switch und dergleichen). Lesen Sie den verlinkten Artikel zum Reflog. Prost
sehe

10
PowerShell-Benutzer, entkommen Sie den Klammern mit einem Backtick:git reset HEAD@`{1`}
Robert Claypool

3
ss64.com/ps/syntax-esc.html Ich denke, Sie wollten tippen HEAD@`{1`}oder tun, was auch auf POSIX-Shells funktioniert:'HEAD@{1}'
sehe

2
Ich denke, es hat nicht nur den Pull zurückgesetzt, sondern auch meine Commits = (
Falsarella

66

git reflog showsollte Ihnen die Geschichte von HEAD zeigen. Sie können das verwenden, um herauszufinden, wo Sie vor dem waren pull. Dann können resetSie sich HEADdazu verpflichten.


Git Reflog Show gab diese Ausgabe: c9e5e4d HEAD @ {0}: Pull: Schnellvorlauf 1c86a22 HEAD @ {1}: Pull Origin Master: Fast Forward 05c141a HEAD @ {2}: Pull: Schnellvorlauf Kann ich den HEAD sicher auf HEAD zurücksetzen? @ {1}
Kartins

Die andere Antwort von sehe enthält Details, wie man dorthin kommt.
Noufal Ibrahim

Dies war sehr nützlich, nachdem ein katastrophales Commit irgendwie Zusammenführungs-Commits in meine Geschichte eingestreut hatte. Hol sie raus, indem du nach einem letzten bekannten Gut im Reflog suchst und dann das Drücken erzwingst.
Domenic

Was ist, wenn pulldie erste Aktion ist? Wenn pulles an HEAD@{1}ist und nichts anderes davor, wie kehren Sie zu einem Zustand davor zurück?
Hendra Uzia

Repository neu erstellen?
Noufal Ibrahim

29

Das hat bei mir funktioniert.

git reset --hard ORIG_HEAD 

Machen Sie ein Zusammenführen oder Ziehen rückgängig:

$ 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)

Checke dies aus: HEAD und ORIG_HEAD in Git für mehr.


17

Finden Sie die <SHA#>für das Commit, das Sie gehen möchten. Sie können es in Github oder durch Eingabe git logoder git reflog showin der Befehlszeile finden und dann tun git reset --hard <SHA#>


Finden Sie das was für das Commit?
Martin

Entschuldigung, ich habe das behoben<SHA#>
Nina

Dies ist der Befehl, den ich am häufigsten benutze, wenn ich etwas rückgängig machen muss
Kartins

2

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

Machen Sie eine Zusammenführung rückgängig oder ziehen Sie sie in einen schmutzigen Arbeitsbaum

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

Selbst wenn Sie möglicherweise lokale Änderungen in Ihrem Arbeitsbaum haben, können Sie sicher sagen, git pullwenn Sie wissen, dass sich die Änderung im anderen Zweig nicht mit diesen überschneidet.

Nachdem Sie das Ergebnis der Zusammenführung überprüft haben, stellen Sie möglicherweise fest, dass die Änderung im anderen Zweig nicht zufriedenstellend ist. Durch das Ausführen git reset --hard ORIG_HEAD können Sie dorthin zurückkehren, wo Sie waren, aber Ihre lokalen Änderungen werden verworfen, die Sie nicht möchten. git reset --mergebehält Ihre lokalen Änderungen.

Siehe auch https://stackoverflow.com/a/30345382/621690


Vielen Dank! Du hast meinen Tag gerettet
Thiago Martins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.