Wie kann ich zurückkehren, ein Git-repository zu einem vorherigen commit?
Wie kann ich wiederherstellen von meinem aktuellen Zustand, um einen snapshot einer bestimmten verpflichten?
Wenn ich git log
, dann bekomme ich die folgende Ausgabe:
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
Wie gehen zurück auf das Begehen von November 3, D. H. Begehen 0d1d7fc
?
- Im Zusammenhang Wie rückgängig machen der letzten Git commit?.
- Hier ist eine sehr klare und Gründliche post zum Rückgängigmachen Dinge im git direkt von Github.
- Verwandte: Rollback auf einen alten Git-commit in einem öffentlichen repo. Beachten Sie, dass diese Frage fügt eine Einschränkung, dass das repo öffentlich ist.
- Ich Liebe git, aber die Tatsache, dass es 35 Antworten auf etwas, das sollte sein unglaublich einfach macht ein großes Problem mit git. Oder ist es die docs?
- Sie könnten fügen Sie ein button-Funktionalität für dass wie SVN in der Geschichte
- Wie ist die Sprache die "Falle" in die Verwendung des Wortes wiederherstellen, wie umgangssprachlich Bedeutung reset auch nicht angesprochen hier??? 6594 upvotes so weit, und nicht ein Bearbeiten auf diese Weise, betonen den Unterschied? Es wäre nicht mehr verwirrend, finden Sie unter "speichern einer Datei" hier mit dem Ausdruck "Begehung"...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser hängt weitgehend davon ab, was meinen Sie mit "revert".
Wechseln vorübergehend auf einen anderen commit
Wenn Sie möchten, um vorübergehend zurück, um es, rumtoben, dann kommen Sie zurück zu, wo Sie sind, alles, was Sie tun müssen, ist check-out die gewünschte commit:
Oder wenn Sie wollen, verpflichtet, während Sie dort sind, gehen Sie vor und machen eine neue Filiale, während du dabei bist:
Gehen Sie zurück zu, wo Sie waren, schauen Sie doch einfach in der Filiale waren Sie wieder ein. (Wenn Sie änderungen vorgenommen haben, wie immer beim wechseln der Zweige, Sie werden mit Ihnen zu tun haben, als angemessen. Könnten Sie zurücksetzen, um Sie wegzuwerfen; Sie konnte stash, Kasse, stash pop und nehmen Sie Sie mit; Sie verpflichten konnte, der Sie zu einem Zweig dort, wenn Sie möchten, eine Niederlassung dort).
Festplatte löschen unveröffentlichte verpflichtet
Wenn auf der anderen Seite wollen Sie wirklich loszuwerden, alles, was Sie seit damals gemacht habe, gibt es zwei Möglichkeiten. Eine, wenn Sie noch nicht veröffentlicht diesen begeht, einfach reset:
Wenn Sie Durcheinander bringen, haben Sie bereits weggeworfen, Ihre lokalen änderungen, aber man kann zumindest dorthin zurück, wo Sie waren, bevor Sie durch das zurücksetzen wieder.
Undo veröffentlicht, begeht mit neuen commits
Auf der anderen Seite, wenn Sie veröffentlicht haben, die Arbeit, die Sie wahrscheinlich nicht wollen, um die reset-Zweig, da es effektiv, die Geschichte umzuschreiben. In diesem Fall könnte man ja wieder die verpflichtet. Mit Git, revert hat eine sehr spezifische Bedeutung: erstellen Sie einen commit mit der rückwärts-patch, um es aufheben. Auf diese Weise müssen Sie nicht umschreiben der Geschichte.
Den
git-revert
- manpage tatsächlich deckt eine Menge von dieser in seiner Beschreibung. Ein weiterer nützlicher link ist diese git-scm.com Abschnitt über die git-revert.Wenn Sie sich entscheiden Sie nicht wollen, um wieder, nachdem alle, können Sie wiederherstellen der wiederherstellen (wie hier beschrieben) oder reset-zurück vor dem revert (siehe den vorherigen Abschnitt).
Finden Sie auch diese Antwort hilfreich in diesem Fall:
Wie bewegen Sie den KOPF zurück zu einer vorherigen Position? (Freistehende Leiter)
Already up-to-date.
. Ich reparierte mein problem durch kopieren der Dateien aus dem neuen Zweig und externen Ordner, überprüfen master zurück, dann kopieren Sie die Dateien wieder manuell überschreiben dann allesgit add
ing undgit commit
ing alles zu meistern. Danach habe ich gelöscht, die neue (aber vorübergehende) Niederlassung.git checkout -
überprüft, die das bisherige denken, Sie hätten ausgecheckt;git checkout <branch>
wäre die explizite Art und Weise. (Mit etwas über Git hier bitte vorsichtig sein, Befehle ausführen, wenn Sie nicht verstehen, was Sie tun.)git revert HEAD~3
als das beste wat zurück3
verpflichtet ist, wichtig bin-Konvention.git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
git revert --no-commit hash1 hash2 ...
und nach das Begehen jeder einzelne zurückzukehren, die in einem commitgit commit -m "Message"
git push origin master
nach revert.git revert HEAD~2..HEAD
. Passiert...git stash && git reset --hard && git stash pop
? Würde nichtgit reset 0d1d7fc32
das gleiche zu erreichen?--mixed
ist Standard fürreset
bleibt der arbeiten Baum unstaged wie vor dem reset.git checkout -b old-state 0d1d7fc32
werdengit checkout 0d1d7fc32 -b old-state
statt?git checkout [-b <new_branch>] [<start_point>]
. Was du geschrieben hast, könnte auch funktionieren, aber es ist nicht die normale Reihenfolge von Optionen und Argumenten, und es ist nicht dokumentiert wie die Arbeit.git clean -f -d -n
zu sehen, welche Dateien werden nicht verfolgt, undgit clean -f -d
um Sie zu löschen.git tag -d some-tag-name
git checkout master
git reset --mixed
..
es ist wichtig - es lenkt git heraus zu überprüfen den Zustand von 0d1d7fc32 im aktuellen Verzeichnis, aber es hinterlässt KOPF, wo es war. Es ist das gleiche, wie mit so etwas wiegit checkout other-branch path/to/file
-, das lassen Sie auf den aktuellen branch und nur check-out der angegebenen Datei. In diesem Fall haben wir Check-out das gesamte aktuelle Verzeichnis statt einer Datei, aber immer noch nicht ändern KOPF..
ist ein Pfad. Alles, was in dergit checkout
Mann Seite über die Check-out bestimmte Pfade gilt auch hier, einschließlich des ersten Satz unter, was Sie zitiert: "Wenn <Pfade> oder --patch gegeben, der git checkout nicht wechseln Zweigen."git checkout <branch> <path>
es nicht, wechseln Sie zu dem Zweig, und wenn Siegit checkout <commit> <path>
es nicht trennen KOPF durch die Umstellung auf das commit.git checkout 0d1d7fc32
ich dann täuschen Sie sich um, und jetzt git nicht lassen Sie mich zurückkommen: Ihre lokalen änderungen die folgenden Dateien würde überschrieben werden durch die Kasse: Quiz2/ViewController.swift Bitte committen Sie Ihre änderungen oder verstauen Sie, bevor Sie wechseln können äste. Aborting--Wie bekomme ich Sie zurück?git branch -D fool_around
Wie würde das funktionieren, wenn ich gehen Sie zurück zu einem vorherigen commit und rumtoben?git push -f origin master
zu beheben entfernten, nachdem Sie sich mit festen lokalen.git push origin master
aber das will ich jetzt löschen de las drei commits auf meinem lokalen und drücken Sie dann die änderungen, um die Fernbedienung auch VOLLSTÄNDIG LÖSCHEN ein commit vor der gewünschten.git push --force
. Es gibt eine Tonne von bestehenden Fragen zu diesem Thema, z.B. stackoverflow.com/q/10510462/119963 stackoverflow.com/q/6310208/119963 stackoverflow.com/q/10298291/119963force
. Aber da habe ich nicht viel Erfahrung mit Git ich bin nicht vollkommen überzeugt, deshalb würde ich gerne wissen, wenn das der richtige Weg oder wenn es einen Weg gibt, um zu bestätigen und sicher sein, es gibt nichts, was vor von meinem eigentlichen Begehen und einfach überschreiben de Geschichte in den lokalen und remote?git checkout -b old-state 0d1d7fc32
gibt mir eine Fehlermeldungfatal: Cannot update paths and switch to branch 'oldApi' at the same time.
ich musste es tun, getrennt durch den ersten Aufrufgit checkout 0d1d7fc32
und danngit checkout -b old-state
.git revert HEAD
?Viele komplizierte und gefährliche Antworten hier, aber es ist eigentlich ganz einfach:
Diese wird wieder alles vom KOPF wieder auf die commit-hash, das heißt, es wird neu erstellen, die commit-Zustand in der Arbeitswelt Baum als wenn jedem commit da gewesen war und ging zurück. Sie können dann verpflichten, den aktuellen Baum, und es wird ein ganz neues commit im wesentlichen äquivalent zu dem commit Sie "rückgängig" zu.
(Die
--no-commit
flag lets git revert alle änderungen auf einmal - sonst werden Sie aufgefordert, eine Nachricht für jeden commit im Bereich littering Ihre Geschichte mit unnötigen commits.)Dies ist ein einfache und sichere Weg, um rollback zu einem vorherigen Zustand. Keine Geschichte zerstört, so kann es verwendet werden, der für übertragungen, die bereits öffentlich gemacht wurden.
--no-edit
statt--no-commit
, so dass Sie nicht haben, Bearbeiten Sie eine commit-Nachricht für jede Umkehrung.git diff --cached
.-m "...."
sonst würde es versuchen, öffnen Sie VIM und wäre nicht in der Lage zu speichern und vermasseln alles.$ git revert --no-commit 53742ae..HEAD
zurückfatal: empty commit set passed
git revert --no-edit 6e286400dbe..HEAD
,git reset --hard 6e286400dbe
so Ihre lokale repo werden nun auf Status der commit -6e286400dbe
81bcc9e HEAD{0}; e475924 HEAD{1}, ...
(ausgit reflog
), und ich wollte das rückgängig machen, was ich in81bcc9e
, dann hatte ich zu tungit revert e475924..HEAD
git revert --no-commit
istgit diff <commit-you-want-to-revert-to> > my-diff; patch -R -t -p1 < my-diff
. Dieser Ansatz hat nicht das problem zu-m option was given
, und keine Geschichte ist entweder zerstört.Rogue Coder?
Arbeiten auf eigene Faust und nur wollen, dass es funktioniert? Befolgen Sie diese Anweisungen unten, hab Sie arbeitete zuverlässig für mich und viele andere seit Jahren.
Arbeit mit anderen? Git ist kompliziert. Lesen Sie die Kommentare unterhalb dieser Antwort, bevor Sie etwas tun, Hautausschlag.
Zurücksetzen Arbeitskopie zum Letzten Commit
Zurückkehren zu einem vorherigen commit, ignoriert alle änderungen:
KOPF, wo ist der Letzte commit in den aktuellen branch
Zurücksetzen Die Arbeitskopie auf eine Ältere Commit
Wieder auf einem commit, der älter ist als die letzten commit:
Credits gehen an einem ähnlichen Stack Overflow Frage, Wieder eine Begehung durch einen SHA-hash in Git?.
git reset --hard 56e05fc; git reset --soft HEAD@{1}; git commit
.-m
Flagge, gefolgt von einer Zeichenfolge in Klammern wie Ihre commit-Kommentar in etwa so:git commit -a -m 'commit message'
git reset --hard HEAD
rückgängig gemacht und die Vorherige commit (wie Sie sagten), aber es ließ auch Dateien im repo. So ist es streng genommen nicht zurückgenommen (eben) zu dem vorherigen commit. So, nach dem Versuch, das Konzept. Ich habe nicht einfach gelöscht, meine lokale Kopie geklont und die repo. Das ist nicht bequem, aber löst das problem.Die beste option für mich und wohl auch andere ist die Git reset option:
War dies die beste option für mich! Es ist einfach, schnell und effektiv!
Hinweis : Wie bereits erwähnt in den Kommentaren nicht tun, wenn Sie teilen Sie Ihre Zweigstelle mit anderen Menschen, die Kopien der alten begeht
Auch aus den Kommentaren, wenn Sie wollte einen weniger "ballzy' Methode, die Sie verwenden könnten,
git clean -i
git push -f
Flagge.. Aber Vorsicht, überschreibt er den remote - .. Werden Sie sicher, dass Sie wissen, was Sie wollen, zu tun.. .clean -f
. Ich brauchte nicht zu sparen, von meiner Arbeit.. noch wollte ich Einchecken, keine Sache. Ich wollte nur wieder zurück zu einer älteren Begehen, da das bauen war dann vorbei.Bevor die Antwort fügen wir einige Hintergrundinformationen, die erklären, was diese
HEAD
ist.First of all what is HEAD?
HEAD
ist einfach ein Verweis auf den aktuellen commit (neueste Version) auf den aktuellen branch. Es kann nur eine einzigeHEAD
jederzeit (ohnegit worktree
).Den Inhalt
HEAD
gespeichert ist im inneren.git/HEAD
, und es enthält die 40 bytes SHA-1 der aktuellen Begehen.detached HEAD
Wenn Sie nicht auf dem neuesten Begehen - was bedeutet, dass
HEAD
verweist auf einen vor commit in der Geschichte es heißtdetached HEAD
.In der Befehlszeile wird wie folgt Aussehen - SHA-1 statt der branch-name, da die
HEAD
ist, die nicht auf die die Spitze des aktuellen Zweiges:Ein paar Möglichkeiten auf wie Sie erholen sich von einer freistehenden LEITER:
git checkout
Diese wird checkout neuen Niederlassung zeigt auf der gewünschten Begehen. Mit diesem Befehl wird die Kasse zu einem bestimmten commit.
An dieser Stelle können Sie erstellen Sie einen Zweig, und anfangen zu arbeiten, von dieser Stelle auf:
git reflog
Können Sie immer die
reflog
als gut.git reflog
zeigt jede änderung, die Aktualisierung derHEAD
und Check-out die gewünschte reflog Eintrag wird dieHEAD
zurück zu diesem verpflichten.Jedes mal den KOPF geändert wird, wird es einen neuen Eintrag in der
reflog
Diese erhalten Sie zurück zu Ihrem gewünschten commit
git reset HEAD --hard <commit_id>
"Bewegen" Ihren Kopf nach hinten, um die gewünschte Begehen.
git rebase --no-autostash
als gut.Dieses schema zeigt, welcher Befehl was macht. Wie Sie sehen können gibt es
reset && checkout
ändern Sie dieHEAD
.git reflog
, das ist genau das was ich brauchtegit reset HEAD^
- hart`Wenn Sie wollen "uncommit", lösche das Letzte commit-Nachricht, und setzen Sie die modifizierten Dateien wieder in Inszenierung, verwenden Sie den Befehl:
--soft
zeigt an, dass die nicht übernommenen Dateien beibehalten werden sollen als Dateien im Gegensatz zu--hard
würde Sie vernichten.HEAD~1
ist das Letzte commit. Wenn Sie zurücksetzen möchten 3 verpflichtet, die Sie nutzen könntenHEAD~3
. Wenn Sie möchten, um rollback zu einer bestimmten revision-Nummer, die man auch tun könnte, ist, dass mit Hilfe seiner SHA-hash.Dies ist ein sehr nützlicher Befehl, in Situationen, in denen Sie begangen, um die falsche Sache, und Sie rückgängig machen wollen, die letzten commit.
Quelle: http://nakkaya.com/2009/09/24/git-delete-last-commit/
Ich habe versucht, eine Menge von Möglichkeiten, um wiederherstellen lokale änderungen im Git, und es scheint, dass dies funktioniert am besten, wenn Sie nur wollen, um wieder auf den neuesten commit state.
Kurze Beschreibung:
git revert
tut.git checkout <commithashcode>
tut.Fand ich eine viel bequemer und einfacher Weg, das zu erreichen die Ergebnisse oben:
wo KOPF auf die neueste verpflichten, an Sie den aktuellen Zweig.
Es ist der gleiche code wie boulder_ruby vorgeschlagen, aber ich habe
git add .
vorgit reset --hard HEAD
zu löschen, alle neu erstellten Dateien seit der letzten übertragung, da dies ist, was die meisten Leute erwarten, dass ich glaube, wenn das zurücksetzen auf das Letzte commit.Können Sie dies tun, indem Sie die folgenden zwei Befehle:
Wird es nehmen Sie Ihre Vorherige Git commit.
Wenn Sie möchten, um Ihre änderungen beizubehalten, die Sie auch verwenden können:
Dann wird es sichern Sie Ihre änderungen.
OK, geht zurück zum vorherigen commit im git ist ganz einfach...
Wieder , ohne zu halten die änderungen:
Wieder mit halten die änderungen:
Erklären: mit git-reset, können Sie zurücksetzen, um einen bestimmten Zustand, ist es üblich, verwenden Sie es mit einem commit-hash, wie Sie oben sehen.
Aber wie Sie sehen, der Unterschied ist mit den zwei Fahnen
--soft
und--hard
standardmäßiggit reset
mit--soft
Flagge, aber es ist eine gute Praxis, immer mit der fahne, erkläre ich jede fahne:- weichen,
Den default-flag, wie Sie erklärt, nicht zur Verfügung stellen müssen, es nicht ändern Sie die Arbeitsgruppe Baum, aber alle hinzufügen, änderungen an Dateien bereit, zu Begehen, so gehen Sie zurück, um die commit-status, die änderungen an Dateien bekommen unstaged.
--hard
Seien Sie vorsichtig mit dieser Option, Sie setzt die arbeiten Baum und alle änderungen nachverfolgt Dateien und alles wird Weg sein!
Ich auch das Bild unten, das kann passieren, im realen Leben arbeiten mit git:
Nichts hier war für mich abgesehen von dieser exakten Kombination:
Schlüssel hier ist, zwingen, push, keine zusätzlichen commit/commit-Nachrichten etc.
Vorausgesetzt, Sie reden über master und auf, die jeweiligen Zweig (das heißt, dies könnte eine Zweig mit Ihnen):
Fand ich die Antwort in einen blog-post (jetzt nicht mehr vorhanden)
Beachten Sie, dass dieses Zurücksetzen und Zwingen die änderung auf der Fernbedienung, so dass, wenn andere in Ihrem team haben, die bereits von git gezogen, verursachen Sie Probleme für Sie. Werden Sie zu zerstören, die änderung der Geschichte, ist ein wichtiger Grund, warum Menschen verwenden Sie git in den ersten Platz.
Besser wiederherstellen (siehe andere Antworten), als reset.
Wenn Sie ein ein-Mann-team, dann ist es wahrscheinlich egal.
Sagen, Sie haben die folgenden commits in eine text-Datei mit dem Namen
~/commits-to-revert.txt
(ich habegit log --pretty=oneline
um Sie zu bekommen)Erstellen Sie eine Bash shell-Skript zum wiederherstellen jeder von Ihnen:
Dieser kehrt alles wieder in den vorherigen Zustand, einschließlich Datei-und Verzeichnis-Kreationen und Löschungen, Begehen Sie in Ihrer Filiale und behalten Sie die Geschichte, aber Sie haben es wieder auf die gleiche Datei-Struktur. Warum Git nicht
git revert --to <hash>
ist mir schleierhaft.git revert HEAD~3
zu entfernen, die letzten 3 commitsgit revert -n master~3..master~1
Arbeit ? (Gesehen von kernel.org/pub/software/scm/git/docs/git-revert.html)git revert --no-commit <start>..<end>
, weilgit revert
übernimmt ein commit-Auswahl in neue (oder alle?) Versionen von Git. Beachten Sie, dass der start der Reihe nicht rückgängig machen.Zusätzliche Alternativen zu Jefromi Lösungen
Jefromi Lösungen sind definitiv die besten, und Sie sollten auf jeden Fall nutzen Sie. Aber der Vollständigkeit halber wollte ich auch zeigen, diese anderen, alternativen Lösungen, können auch verwendet werden, um ein revert commit (in dem Sinne, dass Sie erstellen Sie einen neuen commit rückgängig macht änderungen in vorherigen commit, genau wie das, was
git revert
tut).Klar zu sein, diese alternativen sind nicht der beste Weg, um wieder begeht, Jefromi Lösungen, aber ich möchte nur darauf hinweisen, dass auch diese anderen Methoden, das gleiche zu erreichen wie
git revert
.Alternative 1: Hard-und Soft-Resets
Dies ist eine sehr leicht modifizierte version von Charles Bailey, der die Lösung für Wieder eine Begehung durch einen SHA-hash in Git?:
Dieser funktioniert im Grunde durch die Verwendung der Tatsache, dass soft-resets verlassen wird der Zustand der vorherigen commit-inszeniert in der index/staging-Bereich, die Sie dann verpflichten.
Alternative 2: Löschen der Aktuellen Struktur und mit dem Neuen zu Ersetzen
Diese Lösung kommt von svick die Lösung Kasse alt Begehen und machen es zu einem neuen commit:
Ähnlich wie alternative #1, diese reproduziert der Staat
<commit>
im aktuellen Arbeitsverzeichnis kopieren. Es ist notwendig, dies zu tungit rm
ersten weilgit checkout
wird nicht entfernen Sie die Dateien, die Hinzugefügt wurden, seit<commit>
.git revert HEAD~2..HEAD
von @Cascabel ist (@Jefromi s) verbunden Lösung. Ich bin nicht zu sehen, die problem.Hier ist ein viel einfacher Weg zurück zu einem vorherigen commit (und haben es in einen ungebunden Zustand, zu tun, was immer Sie mögen):
Also, keine Notwendigkeit für commit-ids und so weiter 🙂
Nachdem alle änderungen, wenn Sie drücken Sie alle diese Befehle, die Sie haben könnten, zu verwenden:
Nicht nur
git push
.Gibt es einen Befehl (nicht Teil der Kern-Git, aber es ist in der git-extras Paket) speziell für das zurücksetzen und Inszenierung alten begeht:
Pro die Mann Seite, es kann auch als solches verwendet werden:
Können Sie füllen Sie alle diese ersten Schritte sich selbst und schieben Sie zurück zum git-repo.
Ziehen Sie die neueste version Ihres repository von Bitbucket mit der
git pull --all
Befehl.Führen Sie das git-log-Befehl mit -n 4 vom terminal aus. Die Zahl nach der Option-n legt die Anzahl der commits in der log ab dem letzten commit in Ihrer lokalen Geschichte.
$ git log -n 4
Zurücksetzen der Leiter der repository-Historie mit Hilfe der
git reset --hard HEAD~N
wobei N die Anzahl von commits, die Sie wollen, nehmen Sie den Kopf zurück. Im folgenden Beispiel wäre der Kopf wieder einverpflichten, bis zum letzten commit in das repository-Historie:
Drücken Sie den Wechsel zu git-repo mit
git push --force
zu zwingen schiebendie ändern.
Wenn Sie möchten, dass git-repository zu einem vorherigen commit
Wieder letzten Begehen, und ignorieren Sie alle lokalen änderungen:
Wählen Sie den gewünschten Begehen, und überprüfen Sie es von
bis Sie die erforderliche Begehen. Um den KOPF Stelle, um das,
oder
git reset --hard HEAD~2
oder was auch immer.git show HEAD
entspricht nur mitgit log HEAD -1
.Halten die änderungen aus dem vorherigen commit auf den KOPF und bewegen zum vorherigen Begehen, tun:
Wenn änderungen sind nicht erforderlich, von der vorherigen übertragung auf den KOPF und nur alle änderungen verwerfen, tun:
Vollständig zu reinigen ein coder ' s Verzeichnis von einigen zufälligen Veränderungen, die wir verwendet haben:
Nur
git reset --hard HEAD
loswerden änderungen, aber es wird nicht loszuwerden, die "neuen" Dateien. In Ihrem Fall würden Sie versehentlich gezogen ein wichtiger Ordner irgendwo zufällig, und alle Dateien, die behandelt wurden, als neue von Git, so einreset --hard
trifft nicht zu beheben. Durch ausführen dergit add -A .
vorher, es explizit verfolgt Sie alle mit git, ausgelöscht werden, indem der reset.Dies ist eine weitere Möglichkeit, um direkt wieder auf einen aktuellen Begehen
Es direkt löscht alle änderungen, die Sie machen, die seit dem letzten commit.
PS: Es hat ein kleines problem; es löscht auch alle, die Sie vor kurzem gespeichert stash änderungen. Ich glaube, das sollte in den meisten Fällen keine Rolle.
Ich glaube, manche Menschen kommen auf diese Frage wissen zu wollen, wie rollback verpflichtet, Veränderungen, die Sie vorgenommen haben, in Ihrem Meister - also alles wegwerfen, und gehen Sie zurück zu origin/master, in dem Fall, tun Sie Folgendes:
https://superuser.com/questions/273172/how-to-reset-master-to-origin-master
Zurückkehren, ist der Befehl zum zurücksetzen des commits.
Beispiel:
git revert 2h3h23233
Ist es, die fähig-Bereich aus dem KOPF, wie unten. Hier 1 sagt "revert letzten commit."
git revert HEAD~1..HEAD
tun, und dann
git push
Revert Letzten Commit :
HEAD
ist einfach ein Verweis auf den aktuellen commit (neueste Version) auf den aktuellen branch. Es kann nur eine einzigeHEAD
zu einem bestimmten Zeitpunkt.Zurücksetzen auf einen Älteren Commit :
Der Schnellste Weg zur Wiederherstellung einer alten version ist die Verwendung des
reset
Befehl:Diese werden Rückspulen Ihr KOPF Zweig in der angegebenen version. Alle commits, die kam, nachdem dieser version sind effektiv rückgängig gemacht; dein Projekt ist genau so, wie es war an diesem Punkt in der Zeit.
Den reset-Befehl kommt mit ein paar Optionen, die interessanter sind die
--soft
Flagge. Wenn Sie es verwenden anstelle von--hard
, Git halten alle änderungen in diesen "undone" verpflichtet als lokale änderungen.Wiederherstellen einer Revision in einem Neuen Lokalen Zweig
Wie gesagt, mit dem reset-Befehl auf Ihrem
HEAD
branch ist eine ziemlich drastische Maßnahme: es wird entfernen Sie alle commits (in diesem Zweig), die kam nach der angegebenen revision. Wenn Sie sicher sind, dass dies ist, was Sie wollen, ist alles in Ordnung.Allerdings gibt es auch eine sicherer Weise in den Fall, Sie es vorziehen, zu verlassen Ihre aktuelle KOPF, Zweig unberührt. Da die "Zweige" sind so Billig und einfach in Git, wir können einfach erstellen Sie einen neuen Zweig, der fängt an, die alte revision:
Normalerweise, wird der checkout-Befehl wird verwendet, um nur switch-Verzweigungen. Sofern allerdings der -b-parameter, Sie können auch lassen es einen neuen branch erzeugen (benannt alt-Projekt-Staat in diesem Beispiel). Wenn Sie nicht wollen, es zu starten an der aktuellen HEAD-revision, müssen Sie zusätzlich eine commit-hash - die alte Projekt-revision, die wir wiederherstellen wollen.
Haben Sie nun einen neuen Zweig namens alt-Projekt-Staat spiegelt die alte version Ihres Projekts - ohne Sie zu berühren oder sogar entfernen Sie alle anderen begeht oder Zweige.
Wenn die situation ist ein dringend, und Sie wollen einfach nur zu tun, was der Fragesteller fragte quick-and-dirty Weg, vorausgesetzt, Ihr Projekt unter das Verzeichnis "mein Projekt":
Kopieren Sie das ganze Verzeichnis und nennen es etwas anderes, wie "mein Projekt - Kopie"
Tun:
Haben Sie dann zwei Versionen auf Ihrem system... können Sie prüfen, kopieren oder ändern von Dateien von Interesse, oder was auch immer, aus dem vorherigen commit. Sie kann komplett verwerfen Sie die Dateien unter "mein Projekt - Kopie", wenn Sie sich entschieden haben, die neue Arbeit war, nirgendwo zu gehen...
Die offensichtliche Sache, wenn Sie wollen, zu tragen auf dem Stand der Projekt, ohne tatsächlich verwerfen die Arbeit, da dieser abgerufen Begehen ist, benennen Sie Ihr Verzeichnis wieder: Löschen Sie das Projekt mit den abgerufenen commit (oder geben Sie einen temporären Namen) und benennen Sie Ihre "mein-Projekt - kopieren" - Verzeichnis wieder in "mein Projekt". Dann wahrscheinlich noch ein commit ziemlich bald.
Git ist eine brillante Schöpfung, aber Sie können sich nicht einfach "Holen Sie es auf der fliege": auch Menschen, die versuchen, es zu erklären viel zu oft davon ausgehen Vorkenntnisse von anderen VCS [Versionskontrollsysteme] und vertiefen sich viel zu tief, viel zu schnell, und Begehen andere Verbrechen, wie die Verwendung von austauschbaren Begriffe für "Check-out" - in einer Weise, die manchmal erscheinen fast berechnet zu verwirren Anfänger.
Ersparen sich viel stress, den Sie haben ziemlich viel zu Lesen, ein Buch über Git - ich empfehle "Versionskontrolle mit Git". Und wenn Sie mir Vertrauen können (oder eher meine Narben), wenn ich sage "müssen", es folgt, dass Sie könnte genauso gut tun es JETZT. Viel von der Komplexität von Git kommt aus verzweigen und dann erneute Zusammenführung. Aber aus Ihrer Frage, es gibt keinen Grund, warum sollten die Menschen blendet Sie mit der Wissenschaft.
Vor allem, wenn, zum Beispiel, dies ist eine verzweifelte situation und du bist ein Neuling mit Git!
PS: Ein anderer Gedanke: Es ist (jetzt) eigentlich ganz einfach zu halten die Git-repositories ("Repos") in einem anderen Verzeichnis als die, die mit den Dateien arbeiten. Dies würde bedeuten, dass Sie nicht kopieren Sie den gesamten Git repository mit der oben genannten quick & dirty Lösung. Siehe die Antwort von Friteuse mit --separate-git-dir hier. Gewarnt werden, aber: Wenn du ein "separates Verzeichnis" repository, das Sie kopieren Sie nicht, und Sie tun einen hard-reset, werden alle Versionen nach dem reset commit wird für immer verloren sein, es sei denn, Sie haben, wie Sie sollte unbedingt regelmäßig gesichert repository, vorzugsweise in die Cloud (z.B. Google Drive) unter anderen stellen.
Auf das Thema "sichern in der Cloud", der nächste Schritt ist, ein Konto zu eröffnen (natürlich kostenlos) mit GitHub oder (besser aus meiner Sicht) GitLab. Sie können dann regelmäßig eine
git push
Befehl zum sichern Ihrer Cloud-repo "richtig". Aber wieder, reden über dies kann zu schnell zu viel.Versuchen Sie das zurücksetzen auf die gewünschte commit -
git reset <COMMIT_ID>
(um zu prüfen, COMMIT_ID verwenden
git log
)Dieser setzt alle geänderten Dateien zu un-Addierte Zustand.
Nun können Sie
checkout
alle un-added Dateien vongit checkout .
Überprüfen
git log
zu überprüfen, ob Ihre änderungen.UPDATE
Wenn Sie einzige commit in das Repository, versuchen
git update-ref -d HEAD
Als Ihr begeht geschoben werden, aus der Ferne, die Sie brauchen, um Sie zu entfernen. Lassen Sie mich annehmen, dass Ihr Zweig ist zu entwickeln und es über geschoben Herkunft.
Müssen Sie zuerst entfernen Sie entwickeln sich aus Herkunft:
Dann brauchen Sie, um zu entwickeln, um den status, den Sie wollen, lassen Sie mich davon ausgehen, das commit-hash ist EFGHIJK:
Schließlich, schieben entwickeln wieder:
Ich habe ähnliche Problem und wollte wieder zurück zu früheren Commit. In meinem Fall war ich nicht intetessered zu halten neuere Begehen, daher habe ich verwendet
Hard
.Dies ist, wie ich es gemacht habe:
Diese wieder auf lokale repository, hier nach der Verwendung
git push -f
aktualisiert remote-repository.Wenn Sie möchten, zu korrigieren einige Fehler im letzten commit eine gute alternative wäre mit git commit --amend Befehl. Wenn der Letzte commit ist nicht spitz, die von jeder Referenz, dies wird den trick tun, wie Sie es schaffen, einen commit mit den gleichen Eltern als die letzten commit. Wenn es keine Referenz auf den letzten commit, wird es einfach verworfen werden, und diese zu Begehen, werden die letzten commit. Dies ist eine gute Möglichkeit zur Korrektur verpflichtet, ohne Rückgriff verpflichtet. Allerdings hat es seine eigenen Grenzen.
Auf GitKraken Sie dies tun können:
Obs.: Sie müssen in der Pflege, weil alle die commit Historie nach dem hard-reset verloren gegangen sind und diese Aktion nicht rückgängig gemacht werden. Sie müssen sicher sein, was Sie tun.
Für rollback (oder wiederherstellen):
Versuchen, die beiden oben genannten Schritte, und wenn Sie finden, dass das, was Sie wollen, dann git push.
Wenn Sie feststellen, etwas falsch zu machen:
Erste, die die Zeichenfolge identifiziert, die ein commit in ein paar Tag, so:
druckt er die commit-id, die Zeichenfolge in Anspruch nehmen (z.B. XXXX) und tun:
Weiteres einfachste Lösung; Sie haben zu ändern, Niederlassung, dies zu tun, aber danach kann man nur laufen:
Es kann getan werden viel einfacher, mit SourceTree. Klicken Sie einfach rechts auf commit, die Sie suchen, und wählen Sie 'Checkout' aus dem Menü.
Konnte ich nicht wiederherstellen mine manuell für einige Grund also hier ist, wie ich landete, es zu tun.
Wählen Sie die Anzahl der LEITER(s) des git reflog, wo Sie wollen zurückkehren und tun (für dieses Beispiel wähle ich die 12):
Die am wenigsten komplizierte Weg, um wieder einen Zweig auf eine bestimmte Begehen, wo Sie nicht ändern können, die Geschichte, die ich gefunden habe ist:
Wie:
Wenn du dann git status, sollten Sie alle änderungen, die zwischen der Zweigniederlassung sind Sie auf und die, die Sie wiederherstellen möchten,.
Wenn alles gut aussieht, können Sie verpflichten. Sie können auch mithilfe von git diff, revert..Beispiel, um sicherzustellen, dass es dasselbe.
Wenn Sie möchten, um vorübergehend änderungen zurücknehmen, da
Können Sie suchen, für die Letzte be-commit mit git log führen
Wenn der remote-Zweigstelle wieder funktioniert, können Sie
Diese Methode ist besser als git-checkout für temporäre änderungen, weil Sie nicht in einem abgenommenen Zustand.
Zurücksetzen Inszeniert Änderungen und Commits
Den
git reset
Befehl können Sie den KOPF - die neueste verpflichten, Ihre Arbeits-Baum Punkte zu-repository. Es ändert entweder den staging-Bereich oder den staging-Bereich und arbeiten Baum. Git ' s Fähigkeit, Handwerk begeht, genau wie Sie wollen, bedeutet, dass Sie manchmal brauchen, um änderungen rückgängig machen die änderungen, die Sie inszeniert mit git add . Sie können tun, dass durch den Aufrufgit reset HEAD <file to change>
. Sie haben zwei Möglichkeiten, um loszuwerden, ändert sich komplett.git checkout HEAD <file(s) or path(s)>
ist ein schneller Weg, um änderungen rückgängig zu machen, um Ihren staging-Bereich und arbeiten Baum. Seien Sie vorsichtig mit diesem Befehl, jedoch, weil es entfernt alle änderungen, um Ihre arbeiten Baum. Git weiß nicht, über diese änderungen, da Sie nie begangen wurden. Es gibt keinen Weg, um diese änderungen zurück, sobald Sie diesen Befehl ausführen. Ein weiterer Befehl zur Verfügunggit reset --hard
. Es ist genauso destruktiv zu Ihrem Arbeits-Baum-alle nicht festgeschriebenen änderungen oder inszeniert änderungen gehen verloren, nachdem es läuft. Läuftgit reset -hard
KOPF macht das gleiche wie git checkout HEAD . es ist einfach nicht erforderlich, einen Datei-oder Pfadnamen zu arbeiten.Sie können--soft
mit git reset.Es setzt dem repository, commit, den Sie angeben und Stufen alle diese Veränderungen. Alle änderungen, die Sie bereits inszeniert sind nicht betroffen, noch sind die änderungen im working tree.Schließlich können Sie mit--mixed
zum zurücksetzen der arbeiten Baum ohne Inszenierung keine änderungen.Dies auch unstages alle änderungen, die inszeniert sind.Zurücksetzen Verpflichtet
Manchmal machen wir Fehler. Ein commit sollte nicht geteilt werden gedrängt, zu einem öffentlichen repository, commit hat einen bug, der nicht behoben werden kann und muss rückgängig gemacht werden, oder vielleicht haben Sie einfach nicht brauchen, dass der code nicht mehr.Diese Fälle fordern alle auf, sich
git revert
.Diegit revert
Befehl macht genau das, was Sie erwarten könnte. Es wird einem commit durch anwenden einer rückwärts Begehen, um die Geschichte.Manchmal müssen Sie zum zurücksetzen mehrere commits komplett rückgängig machen, ändern. Sie können-no-commit
verwenden, oder Sie können-n
zu sagen Git durchzuführen, die zurückkehren, aber nicht so weit, zu Begehen, zu ändern. Diese können Sie kombinieren alle die revert-commits in einem commit, die ist nützlich, wenn Sie brauchen, um wieder eine Funktion, die sich über mehrere begeht. Stellen Sie sicher, dass Sie zurückkehren, begeht Sie in umgekehrter Reihenfolge-die neuesten commit ersten. Andernfalls könnten Sie verwirren, Git, indem Sie versuchen, zurücksetzen code, der noch nicht existiert.Ich wollte nicht sehen, mit cherry-pick:
cherry-pick A: