Ich liebe Git, aber die Tatsache, dass es 35 Antworten auf etwas gibt, das unglaublich einfach sein sollte, offenbart ein riesiges Problem mit Git. Oder sind es die Unterlagen?
– Der Muffinmann
3. Januar 2018 um 22:26 Uhr
Yarin
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 zum Commit-Hash zurückgesetzt, was bedeutet, dass dieser Commit-Status im Arbeitsbaum neu erstellt wird als ob jedes Commit danach 0766c053 zurückgegangen war. Sie können dann den aktuellen Baum committen, und es wird ein brandneues Commit erstellt, das im Wesentlichen dem Commit entspricht, zu dem Sie „zurückgekehrt“ sind.
(Die --no-commit flag lässt git alle Commits auf einmal zurücksetzen – andernfalls wirst du aufgefordert, eine Nachricht für jeden Commit im Bereich einzugeben, was deinen Verlauf mit unnötigen neuen Commits übersät.)
Das ist ein sichere und einfache Möglichkeit, zu einem früheren Zustand zurückzukehren. Der Verlauf wird nicht zerstört, sodass er für bereits veröffentlichte Commits verwendet werden kann.
Wenn Sie wirklich einzelne Commits haben möchten (anstatt alles mit einem großen Commit rückgängig zu machen), dann können Sie bestehen --no-edit anstatt --no-commitsodass Sie nicht für jede Umkehrung eine Commit-Nachricht bearbeiten müssen.
– Benutzer456814
28. Juni 2014 um 20:11 Uhr
Wenn einer der Commits zwischen 0766c053..HEAD eine Zusammenführung ist, wird ein Fehler angezeigt (da kein -m angegeben ist). Dies kann denjenigen helfen, die darauf stoßen: stackoverflow.com/questions/5970889/…
– timhc22
21. November 2014 um 11:55 Uhr
$ git revert --no-commit 53742ae..HEAD kehrt zurück fatal: empty commit set passed
– Alex G
1. August 2016 um 20:30 Uhr
Wenn Sie dieses ‘..HEAD’ am Ende des Befehls entfernen, können Sie nur ein bestimmtes Commit entfernen. Zum Beispiel: git revert --no-commit 0766c053 entfernt nur die spezifischen Änderungen, die für 0766c053 vorgenommen wurden, wobei alle Änderungen nach 0766c053 unverändert bleiben.
– Wensiso
12. August 2021 um 14:22 Uhr
@yarin @timhc22 Ich versuche das, aber ich möchte den Zustand nach einer vorherigen Zusammenführung wiederherstellen. Jede Hilfe ist willkommen! Zuerst versuche ich: git revert --no-commit 5a7e223d6b2ffa5b26653e54db4644690731a7e2..HEAD Fehler: Commit 759cd2ae17703faa54e39cbf707c8aa86f1c8797 ist eine Zusammenführung, aber es wurde keine Option -m angegeben. Ich versuche dann: git revert --no-commit 5a7e223d6b2ffa5b26653e54db4644690731a7e2..HEAD -m 1 Fehler: Mainline wurde angegeben, aber Commit bec2ac84669d0c5dfb57bc9e3eeabb225da7b685 ist kein Merge.
– aksg87
24. September 2021 um 18:17 Uhr
Das habe ich getan, aber dann war ich nicht in der Lage, das Remote-Repository zu übergeben und zu pushen. Ich möchte, dass ein bestimmtes älteres Commit HEAD wird…
– Lennon
24. September 2012 um 18:17 Uhr
@Lennon. Angenommen, Sie haben eine Änderung vorgenommen, sich verpflichtet und sie vorangetrieben. Sie möchten, dass sowohl lokal als auch remote so aussehen, als ob dies nie passiert wäre. Zuerst git reset --hard HEAD^ Sie haben jetzt alle lokalen Änderungen vom letzten Commit weggeblasen. Dann: git push --force origin HEAD Dies nimmt den aktuellen HEAD-Commit im Lokal und überschreibt den HEAD im Remote, wodurch der letzte Commit entfernt wird. Hinweis: Dies ist keine sichere Methode zum Löschen von Geheimnissen, die versehentlich auf eine Fernbedienung übertragen wurden. Gehen Sie davon aus, dass alle Geheimnisse kompromittiert sind, und sehen Sie sich die Einschränkungen für „–force“ an: evilmartians.com/chronicles/…
– Entropo
29. August 2021 um 5:46 Uhr
Nach dem Zurücksetzen müssen Sie tun git push -f. Seien Sie SEHR vorsichtig, da dies die Commits vor demjenigen löscht, auf den Sie von Ihrem Remote-Zweig zurückgesetzt haben!
– Jakob L.
23. November 2021 um 17:30 Uhr
Pogrindis
Die beste Option für mich und wahrscheinlich andere ist die Git-Reset-Option:
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 “ballzy” Methode wollten, die Sie verwenden könnten
git clean -i
Obligatorische Warnung: Tun Sie dies nicht wenn Sie Ihren Zweig mit anderen Personen teilen, die Kopien der alten Commits haben, da die Verwendung eines solchen Hard-Resets sie dazu zwingt, ihre Arbeit mit dem neu zurückgesetzten Zweig neu zu synchronisieren. Eine Lösung, die detailliert erklärt, wie Commits sicher rückgängig gemacht werden können, ohne dass die Arbeit durch einen Hard-Reset verloren geht, finden Sie in dieser Antwort.
– Benutzer456814
28. Juni 2014 um 20:03 Uhr
Es ist erwähnenswert, dass dadurch alle nicht festgeschriebenen Dateien in Ihrem Quellverzeichnis dauerhaft gelöscht werden :/
– Cynder
15. Dezember 2021 um 4:58 Uhr
Richardec
Bevor wir antworten, fügen wir etwas Hintergrund hinzu und erklären, was das ist HEAD ist.
Zunächst einmal, was ist HEAD?
HEAD ist einfach ein Verweis auf das aktuelle Commit (das neueste) im aktuellen Zweig. Es kann nur einen geben HEAD jederzeit (ausgenommen git worktree).
Der Inhalt von HEAD ist innen gespeichert .git/HEADund es enthält den 40-Byte-SHA-1-Hash des aktuellen Commit.
detached HEAD
Wenn Sie nicht auf dem neuesten Commit sind – das heißt HEAD zeigt auf einen früheren Commit in der Geschichte, der aufgerufen wird detached HEAD.
Auf der Befehlszeile sieht es so aus – SHA-1-Hash anstelle des Zweignamens seit dem HEAD zeigt nicht auf die Spitze des aktuellen Zweigs:
Einige Optionen zur Wiederherstellung von einem abgetrennten HEAD:
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 zeigt. Dieser Befehl checkt zu einem bestimmten Commit aus.
An dieser Stelle können Sie einen Zweig 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>
Sie können immer die verwenden reflog auch. git reflog zeigt jede Änderung an, die die aktualisiert hat HEAD und das Auschecken des gewünschten Reflog-Eintrags setzt das HEAD zurück zu diesem Commit.
Jedes Mal, wenn der HEAD geändert wird, gibt es einen neuen Eintrag in der reflog
git reflog
git checkout HEAD@{...}
Dies bringt Sie zurück zu Ihrem 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.
Notiz: (Seit Git 2.7) Sie können auch die verwenden git rebase --no-autostash auch.
Dieses Schema zeigt, welcher Befehl was macht. Wie Sie dort sehen können reset && checkout modifiziere den HEAD.
Obligatorische Warnung: Tun Sie dies nicht wenn Sie Ihren Zweig mit anderen Personen teilen, die Kopien der alten Commits haben, da die Verwendung eines solchen Hard-Resets sie dazu zwingt, ihre Arbeit mit dem neu zurückgesetzten Zweig neu zu synchronisieren. Eine Lösung, die detailliert erklärt, wie Commits sicher rückgängig gemacht werden können, ohne dass die Arbeit durch einen Hard-Reset verloren geht, finden Sie in dieser Antwort.
– Benutzer456814
28. Juni 2014 um 20:03 Uhr
Es ist erwähnenswert, dass dadurch alle nicht festgeschriebenen Dateien in Ihrem Quellverzeichnis dauerhaft gelöscht werden :/
– Cynder
15. Dezember 2021 um 4:58 Uhr
Peter Mortensen
Sie können dies mit den folgenden zwei Befehlen tun:
Verwandte So machen Sie den letzten Git-Commit rückgängig?.
– Benutzer456814
23. Mai 2014 um 17:57 Uhr
Hier ist ein sehr klarer und ausführlicher Beitrag über das Rückgängigmachen von Dingen in Git, direkt von Github.
– Aurelio
8. Juni 2015 um 19:41 Uhr
Ich liebe Git, aber die Tatsache, dass es 35 Antworten auf etwas gibt, das unglaublich einfach sein sollte, offenbart ein riesiges Problem mit Git. Oder sind es die Unterlagen?
– Der Muffinmann
3. Januar 2018 um 22:26 Uhr