Frage Wie man ein Git-Repository auf ein vorheriges Commit zurücksetzt


Wie kann ich von meinem aktuellen Status zu einem Snapshot zurückkehren, der bei einem bestimmten Commit erstellt wurde?

Wenn ich mache git log, dann bekomme ich folgende Ausgabe:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Wie kann ich zu dem Commit vom 3. November zurückkehren, d. H 0d1d7fc?


6011
2017-11-06 16:58


Ursprung


Antworten:


Das hängt sehr davon ab, was Sie mit "Zurück" meinen.

Vorübergehend zu einem anderen Commit wechseln

Wenn Sie vorübergehend zu ihm zurückkehren möchten, herumalbern und dann wieder dahin zurückkehren, wo Sie sind, müssen Sie nur das gewünschte Commit ausprobieren:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Oder wenn Sie Commits machen wollen, während Sie dort sind, machen Sie einen neuen Zweig, während Sie dabei sind:

git checkout -b old-state 0d1d7fc32

Um dorthin zurückzukehren, wo Sie waren, schauen Sie sich einfach den Zweig an, in dem Sie wieder waren. (Wenn Sie Änderungen vorgenommen haben, wie immer beim Wechseln von Zweigen, müssen Sie sich mit ihnen befassen. Sie könnten sie zurücksetzen, um sie wegzuwerfen; Sie könnten Verstecken, Auschecken, Pop stopfen, um sie mitzunehmen; sie zu einem Zweig dort, wenn Sie dort eine Niederlassung wollen.)

Lösche unveröffentlichte Commits

Wenn Sie andererseits alles, was Sie seitdem getan haben, loswerden wollen, gibt es zwei Möglichkeiten. Wenn Sie eines dieser Commits nicht veröffentlicht haben, setzen Sie einfach Folgendes zurück:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Wenn Sie sich versauen, haben Sie Ihre lokalen Änderungen bereits weggeworfen, aber Sie können zumindest wieder dorthin zurückkehren, wo Sie vorher waren, indem Sie sie erneut zurücksetzen.

Veröffentlichte Commits mit neuen Commits rückgängig machen

Auf der anderen Seite, wenn Sie die Arbeit veröffentlicht haben, möchten Sie wahrscheinlich nicht die Verzweigung zurücksetzen, da dies effektiv Geschichte neu schreibt. In diesem Fall könnten Sie die Commits tatsächlich rückgängig machen. Bei Git hat Zurücksetzen eine ganz bestimmte Bedeutung: Erstellen Sie ein Commit mit dem umgekehrten Patch, um es zu löschen. Auf diese Weise schreiben Sie keine Geschichte neu.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

Das git-revert Manpage Tatsächlich umfasst eine Menge davon in seiner Beschreibung. Ein weiterer nützlicher Link ist Dieser Abschnitt git-scm.com diskutiert git-revert.

Wenn Sie entscheiden, dass Sie die Wiederherstellung nicht rückgängig machen möchten, können Sie die Wiederherstellung rückgängig machen (wie hier beschrieben) oder zurücksetzen, bevor Sie die Wiederherstellung durchführen (siehe vorherigen Abschnitt).

Möglicherweise finden Sie diese Antwort auch hilfreich in diesem Fall:
Wie verschiebe HEAD zurück zu einem früheren Ort? (Freistehendes Kopf)


7825
2017-11-06 17:04



Arbeitskopie auf neuestes Commit zurücksetzen

Um zu einem vorherigen Commit zurückzukehren, ignorieren Sie alle Änderungen:

git reset --hard HEAD

HEAD ist der letzte Commit in Ihrem aktuellen Zweig

Die Arbeitskopie zu einem älteren Commit zurücksetzen

Um zu einem Commit zurückzukehren, das älter ist als das letzte Commit:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Credits gehen zu einer ähnlichen Stack Overflow-Frage, Zurück zu einem Commit durch einen SHA Hash in Git?.


1260
2017-08-21 06:19



Viele komplizierte und gefährliche Antworten hier, aber es ist eigentlich einfach:

git revert --no-commit 0766c053..HEAD
git commit

Dadurch wird alles vom HEAD zurück in den Commit-Hash umgewandelt, was bedeutet, dass dieser Commit-Status in der Arbeitsbaumstruktur wiederhergestellt wird als ob Jedes Commit seitdem war zurück gegangen. Sie können dann den aktuellen Baum festschreiben, und es wird ein brandneues Commit erstellt, das im Wesentlichen dem Commit entspricht, zu dem Sie "zurückgekehrt" sind.

(Das --no-commit flag lässt git alle commits gleichzeitig rückgängig machen - andernfalls werden Sie nach einer Meldung für jedes Commit im Bereich gefragt, in dem Sie Ihren Verlauf mit unnötigen neuen Commits versehen.)

Das ist ein sichere und einfache Möglichkeit, zu einem früheren Zustand zurückzukehren. Keine Historie wird zerstört, daher kann sie für bereits veröffentlichte Commits verwendet werden.


1221
2018-02-12 04:18



Die beste Option für mich und wahrscheinlich andere ist die Git Reset-Option:

git reset --hard <commidId> && git clean -f

Das war die beste Option für mich! Es ist einfach, schnell und effektiv!


Hinweis :  Wie in Kommentaren erwähnt, tun Sie dies nicht, wenn Sie Ihre Zweigstelle mit anderen Personen teilen, die Kopien der alten Commits haben

Auch aus den Kommentaren, wenn Sie eine weniger 'ballzy' Methode wollten, die Sie verwenden könnten

git clean -i 


153
2017-10-22 11:53



Wenn Sie die Nachricht "commommit" löschen, die letzte Commit-Nachricht löschen und die geänderten Dateien in die Staging-Umgebung zurückversetzen möchten, verwenden Sie den folgenden Befehl:

git reset --soft HEAD~1
  • --soft Gibt an, dass die nicht festgeschriebenen Dateien als Arbeitsdateien beibehalten werden sollen --hard was würde sie verwerfen.
  • HEAD~1 ist das letzte Commit. Wenn Sie 3 Commits zurücksetzen möchten, können Sie sie verwenden HEAD~3. Wenn Sie ein Rollback auf eine bestimmte Revisionsnummer durchführen möchten, können Sie auch dessen SHA-Hash verwenden.

Dies ist ein äußerst nützlicher Befehl in Situationen, in denen Sie die falsche Sache begangen haben und diese letzte Festschreibung rückgängig machen möchten.

Quelle: http://nakkaya.com/2009/09/24/git-delete-last-commit/


102
2018-03-04 17:25



Bevor wir antworten, lasst uns etwas Hintergrund hinzufügen und erklären, was das ist HEAD ist.

First of all what is HEAD?

HEAD ist einfach eine Referenz auf das aktuelle Commit (aktuell) der aktuellen Filiale. Es kann nur einen einzigen geben HEAD zu jeder Zeit (außer git worktree).

Der Inhalt von HEAD ist innen gespeichert .git/HEAD, und es enthält die 40 Bytes SHA-1 des aktuellen Commits.


detached HEAD

Wenn Sie nicht auf dem neuesten Commit sind - das heißt HEAD zeigt auf eine vorherige Commit in der Geschichte, die es heißt detached HEAD.

Enter image description here

In der Befehlszeile wird es so aussehen - SHA-1 anstelle des Zweignamens seit dem HEAD zeigt nicht auf die Spitze des aktuellen Zweiges:

Enter image description here


Einige Optionen zum Wiederherstellen von einem getrennten HEAD:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dadurch wird der neue Zweig, der auf den gewünschten Commit zeigt, ausgecheckt. Dieser Befehl wird zu einem gegebenen Commit auschecken.

An dieser Stelle können Sie eine Verzweigung erstellen und von diesem Punkt an arbeiten:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können immer die reflog auch. git reflog zeigt alle Änderungen an, die das Update aktualisiert haben HEAD und das Auschecken des gewünschten Reflog-Eintrags setzt den HEAD zurück zu diesem Commit.

Jedes Mal, wenn der HEAD geändert wird, erscheint ein neuer Eintrag in der reflog

git reflog
git checkout HEAD@{...}

Dies bringt Sie zurück zu Ihrem gewünschten Commit

Enter image description here


git reset HEAD --hard <commit_id>

Bewegen Sie Ihren Kopf zurück zum gewünschten Commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Hinweis: (Seit Git 2.7) Sie können auch die git rebase --no-autostash auch.

Dieses Schema veranschaulicht, welcher Befehl was macht. Wie Sie dort sehen können reset && checkout modifiziere den HEAD.

Enter image description here


101
2018-02-05 21:56



Ich habe viele Möglichkeiten ausprobiert, um lokale Änderungen in Git rückgängig zu machen, und es scheint, dass dies am besten funktioniert, wenn Sie nur zum letzten Commit-Status zurückkehren möchten.

git add . && git checkout master -f

Kurze Beschreibung:

  • Es wird KEINE Commits als erstellt git revert tut.
  • Es wird NICHT Ihren Kopf wie trennen git checkout <commithashcode> tut.
  • Es überschreibt alle lokalen Änderungen und löscht alle hinzugefügten Dateien seit dem letzten Commit in der Verzweigung.
  • Es funktioniert nur mit Verzweigungsnamen, sodass Sie auf diese Weise nur zum letzten Commit in der Verzweigung zurückkehren können.

Ich habe einen viel bequemeren und einfacheren Weg gefunden, die obigen Ergebnisse zu erzielen:

git add . && git reset --hard HEAD

HEAD zeigt auf den neuesten Commit bei Ihrer aktuellen Zweigstelle.

Es ist der gleiche Code wie boulder_ruby vorgeschlagen, aber ich habe hinzugefügt git add . Vor git reset --hard HEAD um alle neuen Dateien zu löschen, die seit dem letzten Commit erstellt wurden, da dies die meisten Leute erwarten, die ich glaube, wenn sie zum letzten Commit zurückkehren.


96
2017-07-29 11:01



Sie können dies mit den folgenden zwei Befehlen tun:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

Es wird dein vorheriges Git-Commit entfernen.

Wenn Sie Ihre Änderungen beibehalten möchten, können Sie auch Folgendes verwenden:

git reset --soft [previous Commit SHA id here]

Dann speichert es Ihre Änderungen.


76
2017-12-12 06:52