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?

Kartins
quelle
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).

sehe sehen
quelle
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.

Noufal Ibrahim
quelle
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.

Parag Tyagi
quelle
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#>

Nina
quelle
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

Risadinha
quelle
Vielen Dank! Du hast meinen Tag gerettet
Thiago Martins