zurücksetzen - git reset head




So setzen Sie ein Git-Repository auf ein früheres Commit zurück (20)

Vorsicht! Dieser Befehl kann dazu führen, dass der Commit-Verlauf verloren geht, wenn der Benutzer den falschen Commit falsch eingegeben hat. Für den Fall, dass Sie Fehler machen, sollten Sie immer ein zusätzliches Backup von Ihrem Git haben. :)

Ich hatte ein ähnliches Problem und wollte auf das frühere Commit zurückgreifen. In meinem Fall war ich nicht daran interessiert, eine neuere Verpflichtung einzuhalten, also habe ich verwendet Hard.

So habe ich es gemacht:

git reset --hard CommitId && git clean -f

Dies wird auf das lokale Repository zurückgesetzt. Hier wird nach der Verwendung git push -fdas Remote-Repository aktualisiert.

git push -f

Wie kann ich von meinem aktuellen Status zu einer Momentaufnahme eines bestimmten Commits zurückkehren?

Wenn ich git log mache, erhalte ich 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 kann man ab dem 3. November zum Commit 0d1d7fc , dh 0d1d7fc begehen?


Zusätzliche Alternativen zu den Lösungen von Jefromi

Die Lösungen von Jefromi sind definitiv die besten, und Sie sollten sie auf jeden Fall verwenden. Der Vollständigkeit halber wollte ich jedoch auch diese anderen alternativen Lösungen aufzeigen, mit denen auch ein Commit rückgängig gemacht werden kann (in dem Sinne, dass Sie einen neuen Commit erstellen, der die Änderungen im vorherigen Commit rückgängig macht , genau wie bei git revert ). .

Um klar zu sein, diese Alternativen sind nicht die beste Möglichkeit, Commits rückgängig zu machen , Jefromis Lösungen sind es , aber ich möchte nur darauf hinweisen, dass Sie auch diese anderen Methoden verwenden können, um dasselbe zu erreichen wie git revert .

Alternative 1: Hartes und weiches Zurücksetzen

Dies ist eine etwas modifizierte Version von Charles Baileys Lösung, um ein Commit eines SHA-Hash in Git umzuwandeln. :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}

# Commit the changes
git commit -m "Revert to <commit>"

Dies funktioniert im Wesentlichen dadurch, dass Soft Resets den Status der vorherigen Festschreibung im Index / Staging-Bereich verlassen, die Sie anschließend festschreiben können.

Alternative 2: Löschen Sie den aktuellen Baum und ersetzen Sie ihn durch den neuen

Diese Lösung stammt von der Lösung von svick zu Checkout old Commit und macht es zu einem neuen Commit :

git rm -r .
git checkout <commit> .
git commit

Ähnlich wie in Alternative Nr. 1 wird hiermit der Status <commit> Festschreiben <commit> in der aktuellen Arbeitskopie wiedergegeben. Sie müssen zuerst git rm da git checkout keine Dateien entfernt, die seit <commit> hinzugefügt wurden.


Wiederherstellen der Arbeitskopie zum neuesten Commit

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

git reset --hard HEAD

wobei HEAD der letzte Commit in Ihrer aktuellen Niederlassung ist

Wiederherstellen der Arbeitskopie zu einem älteren Commit

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 [email protected]{1}

git commit -m "Revert to 56e05fced"

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

Die Credits gehen an eine ähnliche -Frage. Wiederherstellen eines Commits durch einen SHA-Hash in Git? .


Abgesehen von dieser genauen Kombination funktionierte hier nichts für mich:

git reset --hard <commit_hash>
git push origin <branch_name> --force

Der Schlüssel hier ist das Pushing, keine zusätzlichen Commits / Commit-Nachrichten usw.


Angenommen, Sie sprechen über den Master und über den jeweiligen Zweig (dies könnte jeder Arbeitszweig sein, mit dem Sie befasst sind):

# Revert local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Revert remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

Ich habe die Antwort in einem Blogbeitrag gefunden. Remote-Git-Repo zu einem bestimmten Commit löschen .


Bevor wir antworten, wollen wir noch etwas Hintergrundinformationen hinzufügen, um zu erklären, was dieser HEAD ist.

First of all what is HEAD?

HEAD ist einfach ein Verweis auf das aktuelle Commit (das neueste) in der aktuellen Niederlassung. Es kann immer nur ein einziger HEAD vorhanden sein (ausgenommen git worktree ).

Der Inhalt von HEAD wird in .git/HEAD gespeichert und enthält die 40 Byte SHA-1 des aktuellen Commits.

detached HEAD

Wenn Sie sich nicht am letzten Commit befinden, bedeutet HEAD dass er auf ein vorheriges Commit in der Historie verweist.

In der Befehlszeile sieht es so aus - SHA-1 anstelle des HEAD da der HEAD nicht auf die Spitze des aktuellen Zweigs zeigt:

Ein paar Optionen, wie man sich von einem getrennten HEAD erholen kann:

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 ausgecheckt, der auf das gewünschte Commit zeigt. Dieser Befehl checkt zu einem bestimmten Commit.

An dieser Stelle können Sie einen Zweig erstellen und ab diesem Zeitpunkt mit der Arbeit beginnen:

# 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 den reflog auch immer verwenden. git reflog zeigt alle Änderungen an, die den HEAD aktualisiert haben. Wenn Sie den gewünschten Eintrag für den reflog überprüfen, wird der HEAD auf diesen Commit zurückgesetzt.

Bei jeder Änderung des HEAD wird ein neuer Eintrag in das reflog

git reflog
git checkout [email protected]{...}

Dadurch gelangen Sie wieder zu Ihrem gewünschten Commit

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.
  • Anmerkung: ( Seit Git 2.7 ) können Sie auch die git rebase --no-autostash .

Dieses Schema zeigt, welcher Befehl was tut. Wie Sie dort sehen können, ändern Sie den HEAD reset && checkout .


Dies hängt stark davon ab, was Sie mit "Zurücksetzen" meinen.

Wechseln Sie vorübergehend zu einem anderen Commit

Wenn Sie vorübergehend dorthin zurückkehren möchten, täuschen Sie herum und kehren Sie dann zu Ihrem Standort zurück. Alles, was Sie tun müssen, ist das gewünschte Commit:

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

Oder wenn Sie Commits machen möchten, während Sie dort sind, machen Sie einen neuen Zweig, wenn Sie gerade dabei sind:

git checkout -b old-state 0d1d7fc32

Um wieder dorthin zu gelangen, wo Sie waren, checken Sie einfach den Zweig, in dem Sie sich befanden. (Wenn Sie Änderungen vorgenommen haben, müssen Sie, wie immer beim Wechseln der Zweige, entsprechend vorgehen. Sie könnten sie zurücksetzen, um sie wegzuwerfen; Sie könnten einlagern, auschecken, einstecken, um sie mitzunehmen; Sie könnten sich verpflichten sie zu einer Niederlassung dort, wenn Sie eine Niederlassung dort wünschen.)

Unveröffentlichte Commits schwer löschen

Wenn Sie dagegen alles, was Sie seitdem getan haben, wirklich loswerden möchten, gibt es zwei Möglichkeiten. Wenn Sie eines dieser Commits nicht veröffentlicht haben, setzen Sie es einfach 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 etwas vermasseln, haben Sie Ihre lokalen Änderungen bereits verworfen, aber Sie können zumindest zu Ihrem vorherigen Standort zurückkehren, indem Sie sie erneut zurücksetzen.

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

Andererseits, wenn Sie die Arbeit veröffentlicht haben, möchten Sie den Zweig wahrscheinlich nicht zurücksetzen, da dies den Verlauf effektiv neu schreibt. In diesem Fall könnten Sie die Commits tatsächlich rückgängig machen. Bei Git hat revert eine sehr spezifische Bedeutung: Erstellen Sie ein Commit mit dem Reverse-Patch, um es aufzuheben. Auf diese Weise schreiben Sie keine Historie 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

Die git-revert Manpage deckt in ihrer Beschreibung viel davon ab. Ein weiterer nützlicher Link ist dieser Abschnitt von git-scm.com, in dem es um git-revert geht .

Wenn Sie sich entscheiden, dass Sie den Vorgang nicht rückgängig machen möchten, können Sie den Vorgang rückgängig machen (wie hier beschrieben) oder auf den Wert vor dem Rücksetzen zurücksetzen (siehe vorheriger Abschnitt).

Diese Antwort kann auch in diesem Fall hilfreich sein:
Wie verschiebe ich HEAD an einen vorherigen Ort? (Freistehender Kopf)


Es gibt einen Befehl (nicht Teil des Kern-Git, aber im git-extras Paket enthalten), der speziell für das Zurücksetzen und Staging alter Commits gilt:

git back

Pro Manpage kann es auch als solches verwendet werden:

# Remove the latest three commits
git back 3

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 auf den neuesten Status der Festschreibung zurückkehren möchten.

git add . && git checkout master -f

Kurze Beschreibung:

  • Es werden KEINE Commits erstellt wie bei git revert .
  • Es wird Ihren git checkout <commithashcode> NICHT git checkout <commithashcode> wie es bei git checkout <commithashcode> Fall ist.
  • Es überschreibt alle Ihre lokalen Änderungen und löscht alle hinzugefügten Dateien seit dem letzten Commit im Zweig.
  • Es funktioniert nur mit Zweignamen, sodass Sie auf diese Weise nur das letzte Commit im Zweig wiederherstellen können.

Ich fand einen viel bequemeren und einfacheren Weg, um die obigen Ergebnisse zu erreichen:

git add . && git reset --hard HEAD

wobei HEAD auf das letzte Commit in Ihrer aktuellen Branche verweist.

Es ist derselbe Code wie boulder_ruby, aber ich habe git add . hinzugefügt git add . Bevor git reset --hard HEAD alle neuen Dateien git reset --hard HEAD , die seit dem letzten Commit erstellt wurden, da dies die meisten Leute erwarten, glaube ich, wenn ich zum letzten Commit zurückkehre.


Sie können alle diese ersten Schritte selbst durchführen und zum git repo zurückkehren.

  1. Laden Sie die neueste Version Ihres Repositorys mit dem Befehl git pull --all aus Bitbucket.

  2. Führen Sie den Befehl git log mit -n 4 von Ihrem Terminal aus aus. Die Nummer nach -n bestimmt die Anzahl der Commits im Protokoll, beginnend mit dem letzten Commit in Ihrem lokalen Protokoll.

    $ git log -n 4

  3. Setzen Sie den Kopf des Repository-Verlaufs mit dem git reset --hard HEAD~N wobei N die Anzahl der Commits ist, die Sie git reset --hard HEAD~N möchten. Im folgenden Beispiel würde der Kopf um einen Commit zurückgesetzt, bis zum letzten Commit im Repository-Verlauf:

  4. Drücken Sie die Änderung auf git repo git push --force, um die Änderung zu erzwingen.

Wenn Sie möchten, dass git Repository zu einem früheren Commit verwendet wird

git pull --all
git reset --hard HEAD~1
git push --force

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

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

Dadurch wird alles vom HEAD zum Commit-Hash zurückgesetzt, was bedeutet, dass der Commit-Status im Arbeitsbaum wiederhergestellt wird, als ob jedes Commit seitdem zurückgegangen wäre. Sie können dann den aktuellen Baum festschreiben, und es wird ein brandneues Festschreiben erstellt, das im Wesentlichen dem Festschreiben entspricht, zu dem Sie "zurückgesetzt" wurden.

(Mit dem Flag --no-commit können Sie alle Commits gleichzeitig rückgängig machen. Andernfalls werden Sie für jedes Commit im Bereich zur Eingabe einer Nachricht aufgefordert, wodurch Ihre Historie mit unnötigen neuen Commits verschmutzt wird.)

Dies ist eine sichere und einfache Möglichkeit, einen früheren Status wiederherzustellen . Da keine Historie zerstört wird, kann sie für bereits veröffentlichte Commits verwendet werden.


Wählen Sie Ihr gewünschtes Commit aus und überprüfen Sie es mit

git show HEAD
git show HEAD~1
git show HEAD~2 

bis Sie das erforderliche Commit erhalten. Damit der HEAD darauf hinweist, tun Sie

git reset --hard HEAD~1

oder git reset --hard HEAD~2 oder was auch immer.


Wenn Sie nach all den Änderungen alle diese Befehle drücken, müssen Sie möglicherweise Folgendes verwenden:

git push -f ...

Und nicht nur git push .


OK, zum vorherigen Commit in git zurückzukehren ist ziemlich einfach ...

Wiederherstellen, ohne die Änderungen beizubehalten:

git reset --hard <commit>

Kehren Sie mit den Änderungen zurück:

git reset --soft <commit>

Erklären Sie: Mit git reset können Sie auf einen bestimmten Status zurücksetzen. Es ist üblich, ihn mit einem Commit-Hash zu verwenden, wie Sie oben sehen.

Aber wie Sie sehen, ist der Unterschied die Verwendung der beiden Flags --soft und --hard . Standardmäßig verwendet git reset das Flag --soft ist jedoch eine gute Praxis, das Flag immer zu verwenden. Ich erkläre jedes Flag:

--weich

Das Standardkennzeichen, wie erläutert, muss nicht angegeben werden, ändert jedoch nicht die Arbeitsstruktur, sondern fügt alle Änderungsdateien hinzu, die zur Übernahme bereit sind, sodass Sie zum Festschreibungsstatus zurückkehren, wodurch Änderungen an den Dateien nicht bereitgestellt werden.

--schwer

Seien Sie vorsichtig mit diesem Flag, es setzt den Arbeitsbaum und alle Änderungen an nachverfolgten Dateien zurück, und alle werden gelöscht!

Ich habe auch das Bild unten erstellt, das in einem echten Leben mit git passieren kann:


Ich glaube, dass einige Leute zu dieser Frage kommen und wissen möchten, wie sie festgeschriebene Änderungen rückgängig machen, die sie an ihrem Master vorgenommen haben - dh alles wegwerfen und zum Ursprung / Master zurückkehren. In diesem Fall machen Sie Folgendes:

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master


Um die Änderungen vom vorherigen Commit in HEAD zu übernehmen und zum vorherigen Commit zu wechseln, führen Sie folgende Schritte aus:

git reset <SHA>

Wenn aus dem vorherigen Commit für HEAD keine Änderungen erforderlich sind und einfach alle Änderungen verwerfen, führen Sie folgende Schritte aus:

git reset --hard <SHA>

Zurücksetzen auf das gewünschte Commit -

git reset <COMMIT_ID>

(um die Verwendung von COMMIT_ID zu überprüfen git log)

Dadurch werden alle geänderten Dateien in den nicht hinzugefügten Zustand zurückgesetzt.

Jetzt können Sie checkoutalle nicht hinzugefügten Dateien nach

git checkout .

Überprüfen Sie git logIhre Änderungen zu überprüfen.

AKTUALISIEREN

Wenn Sie nur einen einzigen Commit in Ihrem Repo haben, versuchen Sie es

git update-ref -d HEAD


Zurücksetzen ist der Befehl zum Zurücksetzen der Commits.

git revert <commit1> <commit2> 

Probe:

git revert 2h3h23233

Es ist in der Lage, die Reichweite des HEADs wie unten angegeben zu übernehmen. Hier sagt ich "Letzte Commit umkehren".

git revert HEAD~1..HEAD

und dann tun git push


Stellen Sie die letzte Änderung fest und ignorieren Sie alle lokalen Änderungen:

git reset --hard HEAD

Wenn Sie einen Fehler beim letzten Commit korrigieren möchten, wäre der Einsatz des Befehls git commit --amend eine gute Alternative . Wenn für das letzte Commit keine Referenz angegeben ist, wird dies ausgeführt, da es ein Commit mit demselben übergeordneten Element wie das letzte Commit erstellt. Wenn kein Verweis auf das letzte Commit vorhanden ist, wird es einfach verworfen und dieses Commit ist das letzte Commit. Dies ist eine gute Möglichkeit, Commits zu korrigieren, ohne Commits zurückzusetzen. Es hat jedoch seine eigenen Einschränkungen.







git-revert