Machen Sie Git Pull rückgängig, um Repos in den alten Zustand zu versetzen

1006

Gibt es eine Möglichkeit, Git Pull zurückzusetzen oder rückgängig zu machen, damit meine Quelle / Repos in den alten Zustand versetzt werden, der vor dem Git Pull bestand? Ich möchte dies tun, weil einige Dateien zusammengeführt wurden, was ich nicht wollte, sondern nur andere verbleibende Dateien zusammenführen. Ich möchte diese Dateien zurückbekommen. Ist das möglich?

EDIT: Ich möchte Git Merge zur Verdeutlichung rückgängig machen. Nachdem ich einige Antworten gesehen hatte, tat ich dies

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Was soll ich jetzt tun? Tun git reset --hard ist in Ordnung? Ich möchte es nicht noch einmal schrauben, also nach detaillierten Schritten fragen?

seg.server.fault
quelle
23
Es sieht so aus, als hätten Sie nur zwei Dinge in Ihrer Geschichte: einen Klon und einen Abruf. Einfach auf den Klon zurücksetzen: git reset --hard 01b34faIn diesem Fall hätten Sie das tun können, git reset --hard HEAD^was auf ein Commit vor dem HEAD zurückgesetzt wurde.
JKP
2
--hard ist notwendig, wenn Sie Dateien in Ihrem Arbeitsverzeichnis ändern möchten
William Pursell
3
@ seg.server.fault: Wenn es funktioniert hat, können Sie die Antwort immer akzeptieren;)
jkp
7
Git Reset - Hard HEAD ^
Funroll
7
git reflogwird alles zeigen, was mit git gemacht wurde. Es gibt eine Sorge, git reset --hard [sha1 of something from reflog]die alles zurücksetzt, was gezeigt wird reflog, was manchmal kein Ziel ist, z. Sie möchten die Zusammenführung auf dem vom Zweig gezogenen Hauptzweig mit fehlerhaften Daten zurücksetzen (passiert), und nach dieser Zusammenführung haben Sie an anderen Zweigen gearbeitet. reflogzeigt jeden Chage auf anderen Zweigen. Aber git checkout masterund git reset --hard [SH1 of commit on master branch just before merge]wird nur zurückgesetzt aktuellen Master - Zweig Entfernen gezogen merge vom Ursprung.
Vladimir Vukanac

Antworten:

1427

Das Ausführen git pullführt die folgenden Aufgaben der Reihe nach aus:

  1. git fetch
  2. git merge

Der Zusammenführungsschritt kombiniert Zweige, die so eingerichtet wurden, dass sie in Ihrer Konfiguration zusammengeführt werden. Sie möchten den Zusammenführungsschritt rückgängig machen , aber wahrscheinlich nicht den Abruf (macht nicht viel Sinn und sollte nicht notwendig sein).

Verwenden Sie zum Rückgängigmachen der Zusammenführunggit reset --hard das Zurücksetzen des lokalen Repositorys auf einen vorherigen Status. Verwenden Sie git-reflog , um den SHA-1 des vorherigen Status zu finden, und setzen Sie ihn dann zurück.

Warnung

Mit den in diesem Abschnitt aufgeführten Befehlen werden alle nicht festgeschriebenen Änderungen entfernt, was möglicherweise zu einem Arbeitsverlust führen kann:

git reset --hard

Alternativ können Sie auf einen bestimmten Zeitpunkt zurücksetzen, z.

git reset --hard master@{"10 minutes ago"}
jkp
quelle
325
Eine hervorragende Möglichkeit , den vorherigen Zustand, anstelle die Verwendung von GIT-reflog und Kopieren von Hashes zu holen, ist eine Verknüpfung zu verwenden , wie master@{1}, die die vorherige Position ist master, master@{"5 minutes ago"}oder master@{14:30}. Ausführliche Informationen zum Festlegen von Revisionen auf diese Weise finden Sie im man git-rev-parseAbschnitt "Festlegen von Revisionen".
Cascabel
38
In diesem Fall sollte ORIG_HEAD auch funktionieren ("git reset --hard ORIG_HEAD")
Jakub Narębski
@ Jelfromi: Danke für diesen Tipp, ich wusste nicht, dass du so ausführlich über Revisionen sein kannst. Ich wusste, wie man Revisionen in Bezug auf HEAD auswählt, aber als die Frage gestellt wurde, wusste ich nicht, wie weit er in der Zeit zurückgehen wollte.
JKP
Wenn ich zog, heißt es Updating d2c90a3..035ac4d. Hier können Sie auch d2c90a3als Parameter zum Zurücksetzen verwenden.
Thai
Sie müssen keine Hashes eingeben, wenn Sie Reflog verwenden. Sie können auch HEAD @ {1} oder eine beliebige vorherige Nummer verwenden, wie im Reflog definiert.
Simon The Cat
338

Wie die Antwort von jkp, aber hier ist der vollständige Befehl:

git reset --hard a0d3fe6

Dabei wird a0d3fe6 gefunden

git reflog

und schauen Sie sich den Punkt an, an dem Sie rückgängig machen möchten.

Jeffrey Sun.
quelle
Warum kann ich das git reset HEAD --hardzum Beispiel nicht einfach tun ?
Sung Cho
9
@ MikeC Dieser Ansatz ermöglicht es Ihnen, mehrere Pulls zurückzugehen, zum Beispiel
xji
2
Ich konnte die IDs auf der linken Seite nicht verwenden, git reset --hard HEAD@{n}arbeitete aber
E. Sundin
1
Sie hätten eine Antwort auf die Antwort von jkp vorschlagen sollen, anstatt sie hier nach so vielen Jahren fast zu replizieren.
Abhishek Anand
Wenn ich dies git reflogaktiviert habe: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} und bbbbbbb HEAD @ {2}. Wenn ich das tue, werde git reset --hard bbbbbbbich den KOPF 0 und 1 verlieren?
Pmiranda
115

Eine modernere Methode zum Rückgängigmachen einer Zusammenführung ist:

git merge --abort

Und der etwas ältere Weg:

git reset --merge

Die in früheren Antworten beschriebene Methode der alten Schule (Warnung: Alle lokalen Änderungen werden verworfen):

git reset --hard

Aber eigentlich ist es wert , zu bemerken , dass git merge --abortnur äquivalent ist git reset --mergeda MERGE_HEADvorhanden ist. Dies kann in der Git-Hilfe zum Zusammenführen gelesen werden.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Wenn nach einer fehlgeschlagenen Zusammenführung keine vorhanden ist MERGE_HEAD, kann die fehlgeschlagene Zusammenführung rückgängig gemacht werden, git reset --mergejedoch nicht unbedingt mit git merge --abort. Daher handelt es sich nicht nur um alte und neue Syntax für dieselbe Sache . Deshalb finde git reset --mergeich es viel nützlicher in der täglichen Arbeit.

Martin G.
quelle
20
git merge --abortfunktioniert WÄHREND einer Zusammenführung, nicht nachdem sie git pullbeendet ist. Diese Antwort scheint für die Frage irrelevant zu sein.
Abhishek Anand
1
git reset --mergelöscht alle Änderungen, die nicht für das Festschreiben bereitgestellt wurden. Fand das auf die harte Tour heraus.
Theadriangreen
62

es funktioniert beim ersten Gebrauch: git reflog

Finden Sie Ihren SHA Ihres vorherigen Status und machen Sie (HEAD @ {1} ist ein Beispiel)

git reset --hard HEAD@{1}
Ezequiel García
quelle
40

Wenn Sie gitk haben (versuchen Sie, "gitk --all von Ihrer git-Befehlszeile aus" auszuführen), ist dies einfach. Führen Sie es einfach aus, wählen Sie das Commit aus, auf das Sie ein Rollback durchführen möchten (Rechtsklick), und wählen Sie "Master-Zweig auf hier zurücksetzen". Wenn Sie keine nicht festgeschriebenen Änderungen haben, wählen Sie die Option "schwer".

Samuel Carrijo
quelle
8
Dies ist es wert, ausgeführt zu werden, wenn Sie es nicht gesehen haben. Es erscheint eine verrückte GUI.
Evan Moran
35

Angenommen, es $COMMITwar die letzte Festschreibungs-ID, bevor Sie ausgeführt haben git pull. Was Sie brauchen, um den letzten Zug rückgängig zu machen, ist

git reset --hard $COMMIT

.

Bonus:

Wenn ich von Pull spreche, möchte ich einen interessanten Trick teilen,

git pull --rebase

Dieser obige Befehl ist der nützlichste Befehl in meinem Git-Leben, der viel Zeit gespart hat.

Versuchen Sie diesen Befehl, bevor Sie Ihr neues Commit auf den Server übertragen. Es synchronisiert automatisch die neuesten Serveränderungen (mit einem Abruf + Zusammenführen) und platziert Ihr Commit oben im Git-Protokoll. Sie müssen sich keine Gedanken über manuelles Ziehen / Zusammenführen machen.

Details finden Sie unter: http://gitolite.com/git-pull--rebase

Sazzad Hissain Khan
quelle
17

Dies ist der einfachste Weg, um Änderungen rückgängig zu machen.

** Warning **

Bitte sichern Sie Ihre geänderten Dateien, da dadurch die neu erstellten Dateien und Ordner gelöscht werden .

git reset --hard 9573e3e0

Wo 9573e3e0ist Ihre {Commit-ID}?

Manish Goswami
quelle
Diese Antwort ist sehr nützlich, denn wenn wir einen Git-Pull-Ursprungszweig machen, der so etwas bekommt Updating ffce65bd..e929e884, dann den dogit reset --hard ffce65bd
Ernesto Alfonso
15

du kannst tun git reset --hard ORIG_HEAD

seit "pull" oder "merge" ORIG_HEAD auf den aktuellen Status setzen, bevor diese Aktionen ausgeführt werden.

Orlando
quelle
5

Git Pull Do unter Betrieb.

ich. git fetch

ii. git merge

So machen Sie das Ziehen rückgängig:

ich. git reset --hard --- Es wird auch alle lokalen Änderungen rückgängig gemacht

oder

ii. git reset --hard master@{5.days.ago} (wie 10.minutes.ago, 1.hours.ago, 1.days.ago..) zu lokalen Veränderungen zu bekommen.

oder

iii. git reset --hard commitid

Verbesserung:

Verwenden Sie das nächste Mal git pull --rebaseanstelle von git pull.. den Synchronisierungsserver durch Ausführen (Abrufen und Zusammenführen).

GolamMazid Sajib
quelle
4

Wenn eine Zusammenführung fehlgeschlagen ist, was der häufigste Grund für das Rückgängigmachen von a ist git pull, führt git reset --mergedas Ausführen genau das aus, was man erwarten würde: Behalten Sie die abgerufenen Dateien bei, aber machen Sie die Zusammenführung rückgängig, die git pullversucht hat, zusammenzuführen. Dann kann man entscheiden, was ohne die Unordnung zu tun ist, die git mergemanchmal entsteht. Und es ist nicht erforderlich, die genaue Festschreibungs-ID zu finden, die --hardin jeder anderen Antwort angegeben ist.

Davide
quelle