it-swarm.com.de

Wie kann ich ein Git-Repository auf ein vorheriges Commit zurücksetzen?

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

Wenn ich git log mache, erhalte 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 kann zum Festschreiben vom 3. November zurückgekehrt werden, d. H. Festschreiben 0d1d7fc?

7051
Crazy Serb

Dies hängt stark davon ab, was Sie unter "Zurücksetzen" verstehen.

Wechseln Sie vorübergehend zu einem anderen Commit

Wenn Sie vorübergehend dorthin zurückkehren, herumalbern und dann dorthin zurückkehren möchten, müssen Sie nur das gewünschte Commit auschecken:

# 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, können Sie einen neuen Zweig erstellen, während Sie dort sind:

git checkout -b old-state 0d1d7fc32

Um dorthin zurückzukehren, wo Sie waren, überprüfen Sie einfach die Filiale, in der Sie sich befanden. (Wenn Sie Änderungen vorgenommen haben, wie immer beim Wechseln von Zweigen, müssen Sie diese entsprechend behandeln. Sie können sie zurücksetzen, um sie wegzuwerfen. Sie können sie verstecken, auschecken, Popup-Dateien ablegen, um sie mitzunehmen. Sie können sie festschreiben.) sie zu einer Niederlassung dort, wenn Sie eine Niederlassung dort wollen.)

Unveröffentlichte Commits hart löschen

Wenn Sie andererseits wirklich alles loswerden möchten, was Sie seitdem getan haben, gibt es zwei Möglichkeiten. Wenn Sie keine dieser Commits veröffentlicht haben, setzen Sie 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 es vermasseln, haben Sie Ihre lokalen Änderungen bereits verworfen, aber Sie können durch erneutes Zurücksetzen wieder zu Ihrem ursprünglichen Zustand zurückkehren.

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

Wenn Sie die Arbeit jedoch veröffentlicht haben, möchten Sie den Zweig wahrscheinlich nicht zurücksetzen, da auf diese Weise der Verlauf neu geschrieben wird. In diesem Fall können Sie die Festschreibungen tatsächlich rückgängig machen. Bei Git hat Revert eine ganz bestimmte Bedeutung: Erstellen Sie ein Commit mit dem Reverse-Patch, um es abzubrechen. 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

Die git-revert Manpage behandelt in ihrer Beschreibung tatsächlich eine Menge davon. Ein weiterer nützlicher Link ist dieser Abschnitt auf git-scm.com behandelt git-revert .

Wenn Sie doch nicht zurücksetzen möchten, können Sie das Zurücksetzen (wie hier beschrieben) oder vor dem Zurücksetzen auf zurücksetzen (siehe vorherigen Abschnitt).

Diese Antwort ist möglicherweise auch in folgenden Fällen hilfreich:
Wie kann ich HEAD zurück an einen vorherigen Ort bewegen? (Abgenommener Kopf)

8958
Cascabel

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

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

Dadurch wird alles vom HEAD zurück auf den Festschreibungs-Hash zurückgesetzt, was bedeutet, dass der Festschreibungsstatus im Arbeitsbaum so wiederhergestellt wird, als ob jedes Commit seitdem war zurückgegangen. Sie können dann den aktuellen Baum festschreiben, und es wird ein brandneues Festschreiben erstellt, das im Wesentlichen dem Festschreiben entspricht, auf das Sie "zurückgesetzt" haben.

(Mit dem Flag --no-commit kann git alle Festschreibungen auf einmal rückgängig machen. Andernfalls werden Sie für jede Festschreibung in dem Bereich zur Eingabe einer Nachricht aufgefordert, die Ihren Verlauf mit unnötigen neuen Festschreibungen verunreinigt.)

Dies ist eine sichere und einfache Möglichkeit, ein Rollback auf einen vorherigen Status durchzuführen. Es wird keine Historie zerstört, sodass sie für bereits veröffentlichte Commits verwendet werden kann.

1512
Yarin

Rogue Coder?

Sie arbeiten alleine und möchten nur, dass es funktioniert? Befolgen Sie diese Anweisungen unten. Sie arbeiten seit Jahren zuverlässig für mich und viele andere.

Mit anderen zusammenarbeiten? Git ist kompliziert. Lesen Sie die Kommentare unter dieser Antwort, bevor Sie etwas Unüberlegtes tun.

Zurücksetzen der Arbeitskopie auf das neueste Commit

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

git reset --hard HEAD

dabei ist HEAD das letzte Festschreiben in Ihrem aktuellen Zweig

Zurücksetzen der Arbeitskopie auf ein älteres Commit

So kehren Sie zu einem Commit zurück, 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

Credits gehen zu einer ähnlichen Stapelüberlauf-Frage, Zu einem Commit durch einen SHA -Hash in Git zurückkehren?.

1492
boulder_ruby

Die beste Option für mich und wahrscheinlich auch für andere ist die Option zum Zurücksetzen von Git:

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

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


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

Auch aus den Kommentaren, wenn Sie eine weniger "ballige" Methode wollten, könnten Sie verwenden

git clean -i

190
Pogrindis

Bevor wir antworten, wollen wir einige Hintergrundinformationen hinzufügen und erklären, was dies HEAD ist.

First of all what is HEAD?

HEAD ist lediglich ein Verweis auf das aktuelle Commit (spätestens) für den aktuellen Zweig. Es kann immer nur ein einziges HEAD geben (außer _git worktree_).

Der Inhalt von HEAD ist in _.git/HEAD_ gespeichert und enthält die 40 Bytes SHA-1 des aktuellen Commits.


detached HEAD

Wenn Sie sich nicht auf dem neuesten Commit befinden - was bedeutet, dass HEAD auf ein vorheriges Commit im Verlauf verweist, heißt es detached HEAD.

Enter image description here

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

Enter image description here


Ein paar Möglichkeiten, wie Sie sich von einem abgetrennten HEAD erholen können:


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

An diesem Punkt können Sie eine Verzweigung erstellen und ab diesem Punkt 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 auch immer reflog verwenden. _git reflog_ zeigt jede Änderung an, die das HEAD aktualisiert hat, und das Auschecken des gewünschten Reflog-Eintrags setzt das HEAD auf diesen Commit zurück.

Jedes Mal, wenn das HEAD geändert wird, wird ein neuer Eintrag im reflog

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

Dadurch kehren Sie zu Ihrem gewünschten Commit zurück

Enter image description here


git reset HEAD --hard <commit_id>

"Bewege" deinen 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 den _git rebase --no-autostash_ verwenden.

Dieses Schema zeigt, welcher Befehl was macht. Wie Sie dort sehen können, _reset && checkout_ ändern Sie das HEAD.

Enter image description here

148
CodeWizard

Wenn Sie das Commit aufheben möchten, die letzte Commit-Nachricht löschen und die geänderten Dateien wieder in den Staging-Modus versetzen möchten, verwenden Sie den folgenden Befehl:

git reset --soft HEAD~1
  • --soft gibt an, dass die nicht festgeschriebenen Dateien als Arbeitsdateien im Gegensatz zu --hard aufbewahrt werden sollen, die sie verwerfen würden.
  • HEAD~1 ist das letzte Commit. Wenn Sie 3 Commits rückgängig machen möchten, können Sie HEAD~3 verwenden. Wenn Sie ein Rollback auf eine bestimmte Revisionsnummer durchführen möchten, können Sie dies auch mithilfe des Hashs SHA tun.

Dies ist ein äußerst nützlicher Befehl in Situationen, in denen Sie das falsche Commit ausgeführt haben und das letzte Commit rückgängig machen möchten.

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

131

Ich habe viele Möglichkeiten ausprobiert, um lokale Änderungen in Git wiederherzustellen, und es scheint, dass dies am besten funktioniert, wenn Sie nur zum neuesten Festschreibungsstatus zurückkehren möchten.

git add . && git checkout master -f

Kurze Beschreibung:

  • Es werden KEINE Commits erstellt, wie dies bei git revert der Fall ist.
  • Es wird Ihr HEAD NICHT wie git checkout <commithashcode> trennen.
  • Es wird alle Ihre lokalen Änderungen überschreiben und alle seit dem letzten Festschreiben in der Verzweigung hinzugefügten Dateien LÖSCHEN.
  • Es funktioniert nur mit Filialnamen, so dass Sie auf diese Weise nur zum neuesten Festschreiben in der Filiale zurückkehren können.

Ich habe einen viel bequemeren und einfacheren Weg gefunden, um die oben genannten Ergebnisse zu erzielen:

git add . && git reset --hard HEAD

dabei zeigt HEAD auf das letzte Festschreiben in Ihrem aktuellen Zweig.

Es ist derselbe Code, den boulder_Ruby vorgeschlagen hat, aber ich habe git add . vor git reset --hard HEAD hinzugefügt, um alle neuen Dateien zu löschen, die seit dem letzten Commit erstellt wurden, da dies meiner Meinung nach die meisten Leute erwarten, wenn sie zum letzten Commit zurückkehren .

106
Roman Minenok

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

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

Das vorherige Git-Commit wird entfernt.

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

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

Dann werden Ihre Änderungen gespeichert.

104
kiran boghra

OK, zum vorherigen Commit in Git zurückzukehren ist ganz einfach ...

Machen Sie zurück , ohne die Änderungen beizubehalten :

git reset --hard <commit>

Machen Sie zurück , indem Sie die Änderungen beibehalten :

git reset --soft <commit>

Erklären Sie: Wenn Sie git reset verwenden, können Sie auf einen bestimmten Status zurücksetzen. Die Verwendung mit einem Festschreibungs-Hash, wie oben dargestellt, ist üblich.

Aber wie Sie sehen, werden die beiden Flags --soft und --hard standardmäßig git reset mit --soft verwendet, aber es ist eine gute Praxis, immer das Flag zu verwenden, erkläre ich jede Flagge:


--Sanft

Das Standard-Flag, wie erläutert, muss nicht angegeben werden, ändert nicht den Arbeitsbaum, sondern fügt alle festschreibungsbereiten Änderungsdateien hinzu. Sie kehren also zum Festschreibungsstatus zurück, bei dem Änderungen an Dateien nicht mehr gespeichert werden.


--hart

Seien Sie vorsichtig mit diesem Flag, es setzt den Arbeitsbaum zurück und alle Änderungen an verfolgten Dateien und alle werden verschwunden sein!


Ich habe auch das folgende Bild erstellt, das in der Praxis bei der Arbeit mit git vorkommen kann:

git reset to a commit

68
Alireza

Angenommen, Sie sprechen über den Master und den jeweiligen Zweig (das heißt, dies könnte jeder Arbeitszweig sein, mit dem Sie sich befassen):

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

# Reset remote master branch to November 3rd commit ID
git Push -f Origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

Ich habe die Antwort von in einem Blog-Post gefunden (existiert jetzt nicht mehr)

Beachten Sie, dass dies das Zurücksetzen und Erzwingen der Änderung an der Fernbedienung ist, sodass Sie Probleme verursachen, wenn andere in Ihrem Team bereits git gezogen haben. Du zerstörst die Änderungshistorie, was ein wichtiger Grund ist, warum Leute git an erster Stelle benutzen.

Verwenden Sie lieber "Zurücksetzen" (siehe andere Antworten) als "Zurücksetzen". Wenn Sie ein Ein-Mann-Team sind, spielt es wahrscheinlich keine Rolle.

61
markreyes

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

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

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

61
serdarsenay

Angenommen, Sie haben die folgenden Commits in einer Textdatei mit dem Namen ~/commits-to-revert.txt (ich habe git log --pretty=oneline verwendet, um sie abzurufen)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Erstellen Sie ein Bash Shell-Skript, um alle zurückzusetzen:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

Dadurch wird alles auf den vorherigen Status zurückgesetzt, einschließlich Datei- und Verzeichniserstellungen sowie Löschvorgängen. Übertragen Sie es in Ihren Zweig, und Sie behalten den Verlauf bei, aber Sie haben die gleiche Dateistruktur wiederhergestellt. Warum Git keinen git revert --to <hash> hat, ist mir ein Rätsel.

57

Zusätzliche Alternativen zu Jefromis Lösungen

Jefromis Lösungen sind definitiv die besten, und Sie sollten sie definitiv verwenden. Der Vollständigkeit halber wollte ich jedoch auch diese anderen alternativen Lösungen zeigen, mit denen auch ein Commit rückgängig gemacht werden kann (in dem Sinne, dass Sie ein neues Commit erstellen, mit dem Änderungen in früheren Versionen rückgängig gemacht werden commit , genau wie git revert).

Um klar zu sein, sind diese Alternativen nicht die beste Möglichkeit, Commits , Jefromi's Lösungen sind , aber ich möchte nur darauf hinweisen, dass Sie auch diese anderen Methoden verwenden können, um dasselbe wie git revert zu erreichen.

Alternative 1: Hard- und Soft-Resets

Dies ist eine sehr leicht modifizierte Version von Charles Baileys Lösung für Zurück zu einem Commit durch einen SHA -Hash in Git? :

# 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 unter Verwendung der Tatsache, dass Soft-Resets den Status des vorherigen Commits im Index-/Staging-Bereich beibehalten, den Sie dann festschreiben können.

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

Diese Lösung stammt von Svicks Lösung für Altes Commit auschecken und neues Commit erstellen :

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

Ähnlich wie bei Alternative 1 wird der Status von <commit> in der aktuellen Arbeitskopie reproduziert. Es ist notwendig, zuerst git rm zu machen, da git checkout keine Dateien entfernt, die seit <commit> hinzugefügt wurden.

56
user456814

Hier ist eine viel einfachere Möglichkeit, zu einem vorherigen Commit zurückzukehren (und es in einem nicht gebundenen Zustand zu haben, um damit zu tun, was immer Sie möchten):

git reset HEAD~1

Es sind also keine Commit-IDs usw. erforderlich :)

52
Paul Walczewski

Es gibt einen Befehl (nicht Teil von Core Git, aber im git-extras -Paket), der speziell zum Zurücksetzen und Bereitstellen alter Commits vorgesehen ist:

git back

Gemäß man page kann es auch als solches verwendet werden:

# Remove the latest three commits
git back 3
35
Shadow Man

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

git Push -f ...

Und nicht nur git Push.

34
sivi

Sie können alle diese ersten Schritte selbst ausführen und auf Git Repo zurückschieben.

  1. Ziehen 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. Die Zahl nach dem -n bestimmt die Anzahl der Festschreibungen im Protokoll, beginnend mit der letzten Festschreibung in Ihrem lokalen Verlauf.

    $ git log -n 4

  3. Setzen Sie den Kopf des Repository-Verlaufs mit dem git reset --hard HEAD~N zurück, wobei N für die Anzahl der Commits steht, für die Sie den Kopf zurücknehmen möchten. Im folgenden Beispiel wird der Kopf um eine Festschreibung auf die letzte Festschreibung im Repository-Verlauf zurückgesetzt:

  4. Drücken Sie die Änderung an Git Repo mit git Push --force, um Push the change zu erzwingen.

Wenn Sie möchten, dass das Git-Repository zu einem früheren Commit gehört

git pull --all
git reset --hard HEAD~1
git Push --force
30
Nanhe Kumar

Zurück zu aktuell Festschreiben und Ignorieren aller lokalen Änderungen:

git reset --hard HEAD

Wählen Sie das gewünschte Commit aus und überprüfen Sie es mit

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

bis Sie das gewünschte Commit erhalten. Um den HEAD darauf hinzuweisen, tun Sie Folgendes

git reset --hard HEAD~1

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

26
tonythomas01

Dies ist eine weitere Möglichkeit, direkt auf ein aktuelles Commit zurückzusetzen

git stash
git stash clear

Alle Änderungen, die Sie seit dem letzten Festschreiben vorgenommen haben, werden direkt gelöscht.

PS: Es hat ein kleines Problem; Außerdem werden alle kürzlich gespeicherten Änderungen gelöscht. Was ich in den meisten Fällen denke, sollte keine Rolle spielen.

21
Point Networks

Gehen Sie folgendermaßen vor, um die Änderungen vom vorherigen Commit in HEAD beizubehalten und zum vorherigen Commit zu wechseln:

git reset <SHA>

Wenn keine Änderungen von der vorherigen Übergabe an HEAD erforderlich sind und nur alle Änderungen verworfen werden, gehen Sie wie folgt vor:

git reset --hard <SHA>
21
Vishnu Atrai

Um das Verzeichnis eines Codierers vollständig von versehentlichen Änderungen zu säubern, haben wir Folgendes verwendet:

git add -A .
git reset --hard HEAD

Nur git reset --hard HEAD entfernt Änderungen, aber "neue" Dateien werden nicht entfernt. In ihrem Fall hatten sie versehentlich einen wichtigen Ordner zufällig irgendwohin gezogen, und alle diese Dateien wurden von Git als neu behandelt, sodass ein reset --hard es nicht reparierte. Indem der git add -A . zuvor ausgeführt wurde, wurden alle explizit mit git verfolgt, um beim Zurücksetzen gelöscht zu werden.

21
Chris Moschini

Ich glaube, einige Leute kommen auf diese Frage und möchten wissen, wie sie festgeschriebene Änderungen, die sie an ihrem Master vorgenommen haben, rückgängig machen können - dh alles wegwerfen und zu Origin/master zurückkehren.

git reset --hard Origin/master

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

19
nevster

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

git revert <commit1> <commit2> 

Beispiel:

git revert 2h3h23233

Es ist in der Lage, die Reichweite von HEAD wie unten zu nehmen. Hier sagt ich "Letzte Festschreibung zurücksetzen".

git revert HEAD~1..HEAD

und dann mach git Push

17

Neuestes Commit zurücksetzen:

git reset --hard HEAD

HEAD ist lediglich ein Verweis auf das aktuelle Commit (spätestens) für den aktuellen Zweig. Es kann immer nur ein einziges HEAD geben.

Zurück zu einem älteren Commit: Der schnellste Weg, eine alte Version wiederherzustellen, ist die Verwendung des Befehls reset:

# Resets index to former commit
git reset 56e05fced 

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

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

Dadurch wird Ihr HEAD Zweig auf die angegebene Version zurückgespult. Alle nach dieser Version eingegangenen Commits werden effektiv rückgängig gemacht. Ihr Projekt ist genau so, wie es zu diesem Zeitpunkt war.

Der Befehl reset enthält einige Optionen, eine der interessantesten ist das Flag --soft. Wenn Sie es anstelle von --hard verwenden, behält Git alle Änderungen in diesen "rückgängig" gemachten Commits als lokale Änderungen bei.

Wiederherstellen einer Revision in einem New Local Branch

Wie gesagt, die Verwendung des Befehls reset in Ihrem Zweig HEAD ist eine ziemlich drastische Aktion: Es werden alle Commits (in diesem Zweig) entfernt, die nach der angegebenen Revision eingegangen sind. Wenn Sie sicher sind, dass dies das ist, was Sie wollen, ist alles in Ordnung.

Es gibt jedoch auch einen sichereren Weg, falls Sie es vorziehen, Ihren aktuellen HEAD Zweig unangetastet zu lassen. Da "Zweige" in Git so billig und einfach sind, können wir leicht einen neuen Zweig erstellen, der mit dieser alten Revision beginnt:

git checkout -b old-project-state 0ad5a7a6

Normalerweise wird der Befehl checkout verwendet, um nur die Zweige zu wechseln. Mit dem Parameter -b können Sie jedoch auch einen neuen Zweig erstellen lassen (in diesem Beispiel mit dem Namen old-project-state ). Wenn Sie nicht möchten, dass es bei der aktuellen HEAD Revision beginnt, müssen Sie auch einen Festschreibungs-Hash angeben - die alte Projekt-Revision, die wir wiederherstellen möchten.

Sie haben jetzt einen neuen Zweig mit dem Namen old-project-state , der die alte Version Ihres Projekts widerspiegelt - ohne andere Commits oder Zweige zu berühren oder zu entfernen.

17
Lyes CHIOUKH

Wenn es sich um eine dringende Situation handelt und Sie nur das tun möchten, was der Fragesteller in einer schnellen und schmutzigen Art und Weise gefragt hat vorausgesetzt Ihr Projekt befindet sich im Verzeichnis "Mein Projekt":

  1. Kopieren Sie das gesamte Verzeichnis und nennen Sie es etwas anderes, wie "Mein Projekt - Kopieren".

  2. Machen:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

Sie haben dann zwei Versionen auf Ihrem System ... Sie können Dateien von Interesse oder was auch immer aus dem vorherigen Commit untersuchen, kopieren oder ändern. Sie können die Dateien unter "Mein Projekt - Kopie" vollständig verwerfen, wenn Sie entschieden haben, dass die neue Arbeit nirgendwo hingehen würde ...

Wenn Sie den Projektstatus fortsetzen möchten, ohne die Arbeit tatsächlich zu verwerfen, da diese Festschreibung abgerufen wurde, müssen Sie Ihr Verzeichnis erneut umbenennen: Löschen Sie das Projekt, das die festgeschriebene Festschreibung enthält (oder geben Sie ihm einen temporären Namen), und benennen Sie " Mein Projekt - kopiere "Verzeichnis zurück zu" Mein Projekt ". Dann machen Sie wahrscheinlich ziemlich bald ein weiteres Commit.

Git ist eine brillante Kreation, aber man kann es nicht einfach "on the fly" aufnehmen: auch Leute, die versuchen, es zu erklären , nehmen dies viel zu oft als vorher an Kenntnisse über andere VCS [Versionskontrollsysteme] und viel zu frühes Erforschen und Begehen anderer Verbrechen, wie das Verwenden austauschbarer Begriffe für das "Auschecken" - in einer Weise, die manchmal fast berechnet erscheint, um Anfänger zu verwirren.

Um sich viel Stress zu ersparen, muss man ein Buch über Git lesen - ich würde empfehlen "Versionskontrolle mit Git" . Und wenn Sie mir (oder besser gesagt meinen Narben) vertrauen können, wenn ich "muss" sage, dann können Sie es genauso gut tun JETZT. Ein Großteil der Komplexität von Git entsteht durch Verzweigen und anschließendes Zusammenführen. Aber von Ihrer Frage gibt es keinen Grund, warum die Leute Sie mit der Wissenschaft blenden sollten .

Vor allem, wenn es sich zum Beispiel um eine verzweifelte Situation handelt und Sie ein Neuling bei Git sind!

PS: Ein anderer Gedanke: Es ist (jetzt) ​​eigentlich ganz einfach, das Git-Repository ("repo") in einem anderen Verzeichnis als dem mit den Arbeitsdateien zu speichern. Dies würde bedeuten, dass Sie nicht das gesamte Git-Repository mit der obigen schnellen und fehlerhaften Lösung kopieren müssen. Siehe die Antwort von Fryer mit --separate-git-dir hier . Seien Sie jedoch gewarnt : Wenn Sie ein "separates Verzeichnis" -Repository haben, das Sie nicht kopieren, und einen Hard-Reset durchführen, werden alle nachfolgenden Versionen ausgeführt Ein Commit zum Zurücksetzen geht für immer verloren, es sei denn, Sie haben, wie unbedingt erforderlich, regelmäßig ein Backup Ihres Repository erstellt, vorzugsweise in der Cloud (z. B. Google Drive ).

Zu diesem Thema "Backup in die Cloud" besteht der nächste Schritt darin, (natürlich kostenlos) ein Konto bei GitHub oder (meiner Ansicht nach besser) GitLab zu eröffnen. Sie können dann regelmäßig den Befehl git Push ausführen, um Ihr Cloud-Repo "ordnungsgemäß" zu sichern. Aber darüber zu reden kann auch zu früh sein.

15
mike rodent

Versuchen Sie, auf das gewünschte Commit zurückzusetzen -

git reset <COMMIT_ID>

(um COMMIT_ID zu überprüfen, verwenden Sie git log)

Dadurch werden alle geänderten Dateien auf den Status "Nicht hinzugefügt" zurückgesetzt.

Jetzt können Sie alle nicht hinzugefügten Dateien durch checkout

git checkout .

Aktivieren Sie git log, um Ihre Änderungen zu überprüfen.

UPDATE

Wenn Sie ein und nur Commit in Ihrem Repo haben, versuchen Sie es

git update-ref -d HEAD

13
optimistanoop

Achtung! Dieser Befehl kann zum Verlust des Commit-Verlaufs führen, wenn der Benutzer versehentlich das falsche Commit eingegeben hat. Habe immer ein extra Backup deines Git woanders, nur für den Fall, dass du Fehler machst, als du ein bisschen sicherer bist. :)

Ich hatte ein ähnliches Problem und wollte auf das frühere Commit zurückgreifen. In meinem Fall war ich nicht daran interessiert, ein neueres Commit beizubehalten, daher habe ich Hard verwendet.

So habe ich es gemacht:

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

Dies wird auf das lokale Repository zurückgesetzt. Hier wird nach Verwendung von git Push -f das entfernte Repository aktualisiert.

git Push -f

Da Ihre Commits remote übertragen werden, müssen Sie sie entfernen. Lassen Sie mich annehmen, dass Ihr Zweig sich entwickelt und über Origin verschoben wird.

Sie müssen zunächst Develop aus Origin entfernen:

git Push Origin :develop (note the colon)

Dann müssen Sie sich auf den gewünschten Status entwickeln. Lassen Sie mich annehmen, dass der Commit-Hash EFGHIJK lautet:

git reset --hard EFGHIJK

Zum Schluss Push erneut entwickeln:

git Push Origin develop
12
George Ninan

Auf GitKraken können Sie dies tun:

  1. Klicken Sie mit der rechten Maustaste auf das Commit, das Sie zurücksetzen möchten, und wählen Sie: Auf dieses Commit zurücksetzen/Hard :

enter image description here

  1. Klicken Sie erneut mit der rechten Maustaste auf das Commit und wählen Sie: Aktueller Filialname/Push :

enter image description here

  1. Klicken Sie auf Force Push :

enter image description here

Hinweis : Sie müssen vorsichtig sein, da der gesamte Festschreibungsverlauf nach dem Hard-Reset verloren geht und diese Aktion irreversibel ist. Sie müssen sicher sein, was Sie tun.

10
Ângelo Polotto

Wenn Sie einen Fehler im letzten Commit korrigieren möchten, ist die Verwendung des Befehls git commit --amend eine gute Alternative. Wenn auf die letzte Festschreibung nicht durch einen Verweis verwiesen wird, reicht dies aus, da eine Festschreibung mit demselben übergeordneten Element wie die letzte Festschreibung erstellt wird. Wenn es keinen Verweis auf das letzte Festschreiben gibt, wird es einfach verworfen und dieses Festschreiben ist das letzte Festschreiben. Dies ist eine gute Methode, um Commits zu korrigieren, ohne Commits zurückzusetzen. Es hat jedoch seine eigenen Einschränkungen.

10
Upul Doluweera

Holen Sie sich zuerst die Zeichenfolge, die das Commit an einem bestimmten Datum identifiziert.

git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

es gibt den Commit-Bezeichner aus, nimmt den String (zum Beispiel XXXX) und führt Folgendes aus:

git checkout XXXX
9
Luca C.

Für Rollback (oder zum Zurücksetzen):

  1. git revert --no-commit "Code zum Entfernen festschreiben" HEAD (z. B. git revert --no-commit d57a39d HEAD)
  2. git Commit
  3. git Push

Probieren Sie die obigen zwei Schritte aus und wenn Sie feststellen, dass dies das ist, was Sie wollen, geben Sie Push ein.

Wenn Sie etwas falsch finden, gehen Sie wie folgt vor:

git Revert - Abort

9
Jagraj Singh

Mit SourceTree geht es viel einfacher. Klicken Sie mit der rechten Maustaste auf das gewünschte Commit und wählen Sie im Menü die Option "Kasse".

enter image description here

8
Marcin Szymczak

Noch eine einfachste Lösung; Sie müssen den Zweig ändern, um dies zu tun. Danach können Sie einfach ausführen:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

Ich konnte meine aus irgendeinem Grund nicht manuell wiederherstellen.

  1. Habe die Filiale, die ich haben wollte, ausgecheckt und kopiert.
  2. Checkte die neueste Filiale aus.
  3. Kopierte den Inhalt von der Niederlassung, die ich zum Verzeichnis der spätesten Niederlassung wünschte, überschrieb die Änderungen und festschrieb das.
7
Demodave
git reflog

Wählen Sie die Nummer des HEADs (der HEADs) des Git-Reflogs, zu dem Sie zurückkehren möchten, und führen Sie dies aus (für dieses Beispiel wähle ich die 12 aus):

git reset [email protected]{12} --hard
7
Sérgio

Die einfachste Möglichkeit, einen Zweig auf ein bestimmtes Commit zurückzusetzen, bei dem Sie den gefundenen Verlauf nicht ändern können, besteht darin,

  1. überprüfen Sie das Commit oder den Zweig, von dem Sie zurückkehren möchten.
  2. Bearbeiten Sie .git/HEAD und ändern Sie den Verweis in den Zweig, zu dem Sie zurückkehren möchten.

Sowie:

echo 'ref: refs/heads/example' > .git/HEAD

Wenn Sie dann den Git-Status ausführen, sollten Sie alle Änderungen zwischen dem Zweig, in dem Sie sich befinden, und dem Zweig sehen, zu dem Sie zurückkehren möchten.

Wenn alles gut aussieht, können Sie festlegen. Sie können auch git diff revert..example verwenden, um sicherzustellen, dass es dasselbe ist.

6
jgmjgm

Wenn Sie Änderungen vorübergehend rückgängig machen möchten, weil

  • jemand hat Code geschrieben, der den Build oder die Funktionen, an denen Sie arbeiten, beschädigt

Sie können mit git log nach dem letzten funktionierenden Commit suchen und dann ausführen

git rebase --onto <commitId>

Wenn der Remote-Zweig wieder funktioniert, können Sie

git pull --rebase

Diese Methode ist besser als das Auschecken von Git nach vorübergehenden Änderungen, da Sie sich nicht in einem getrennten Zustand befinden.

5
joseph

Zurücksetzen von bereitgestellten Änderungen und Commits

Mit dem Befehl git reset können Sie den HEAD-Wert ändern - der letzte Commit, den Ihre Arbeitsbaumpunkte für Ihr Repository ausführen. Es ändert entweder den Staging-Bereich oder den Staging-Bereich und den Arbeitsbaum. Gits Fähigkeit, Commits genau nach Ihren Wünschen zu erstellen, bedeutet, dass Sie manchmal Änderungen an den Änderungen rückgängig machen müssen, die Sie mit git add vorgenommen haben. Sie können dies tun, indem Sie git reset HEAD <file to change> aufrufen. Sie haben zwei Möglichkeiten, um Änderungen vollständig zu entfernen. git checkout HEAD <file(s) or path(s)> ist eine schnelle Möglichkeit, Änderungen an Ihrem Staging-Bereich und Ihrem Arbeitsbaum rückgängig zu machen. Gehen Sie mit diesem Befehl jedoch vorsichtig um, da er alle Änderungen an Ihrem Arbeitsbaum entfernt. Git weiß nichts über diese Änderungen, da sie noch nie festgeschrieben wurden. Es gibt keine Möglichkeit, diese Änderungen wiederherzustellen, wenn Sie diesen Befehl ausführen. Ein weiterer Befehl, der Ihnen zur Verfügung steht, ist git reset --hard. Es ist für Ihren Arbeitsbaum gleichermaßen zerstörerisch - alle nicht festgeschriebenen oder bereitgestellten Änderungen gehen verloren, nachdem Sie es ausgeführt haben. Das Ausführen von git reset -hard HEAD bewirkt dasselbe wie das Auschecken von Git HEAD. Es ist lediglich keine Datei oder kein Pfad erforderlich. Sie können --soft mit git reset verwenden. Das Repository wird auf das von Ihnen angegebene Commit zurückgesetzt und alle diese Änderungen werden durchgeführt. Alle Änderungen, die Sie bereits gespeichert haben, sind nicht betroffen, und auch nicht die Änderungen in Ihrem Arbeitsbaum. Schließlich können Sie mit --mixed den Arbeitsbaum zurücksetzen, ohne Änderungen zu speichern. Hierdurch werden auch alle Änderungen aufgehoben, die gespeichert wurden.

Commit rückgängig machen

Manchmal machen wir Fehler. Ein Commit, das nicht freigegeben werden sollte, wird in ein öffentliches Repository verschoben, ein Commit weist einen Fehler auf, der nicht behoben werden kann und rückgängig gemacht werden muss, oder Sie benötigen den Code einfach nicht mehr call for git revert. Der Befehl git revert macht genau das, was Sie erwarten. Durch Anwenden eines umgekehrten Commits auf den Verlauf wird ein einzelner Commit zurückgesetzt. Manchmal müssen Sie mehrere Commits zurücksetzen, um eine Änderung vollständig rückgängig zu machen. Sie können -no-commit verwenden, oder Sie können -n verwenden, um Git anzuweisen, die Wiederherstellung durchzuführen, aber die Änderung nicht zu bestätigen. Auf diese Weise können Sie alle Zurücksetzungs-Commits zu einem Commit kombinieren. Dies ist hilfreich, wenn Sie ein Feature zurücksetzen müssen, das mehrere Commits umfasst. Stellen Sie sicher, dass Sie die Festschreibungen in umgekehrter Reihenfolge rückgängig machen - die neueste Festschreibung zuerst. Andernfalls könnten Sie Git verwirren, indem Sie versuchen, noch nicht vorhandenen Code wiederherzustellen.

2
SAIguru011