Bevor wir antworten, sollten wir etwas Hintergrundwissen hinzufügen und erklären, was dies ist HEAD
.
First of all what is HEAD?
HEAD
ist einfach ein Verweis auf die aktuelle Übertragung (latest) auf dem aktuellen Zweig.
Es kann nur eine einzige HEAD
zu jedem beliebigen Zeitpunkt. (ausgenommen git worktree
)
Der Inhalt von HEAD
ist gespeichert in .git/HEAD
und enthält die 40 Bytes SHA-1 der aktuellen Übertragung.
detached HEAD
Wenn Sie nicht auf dem neuesten Stand sind - was bedeutet, dass HEAD
auf eine frühere Übertragung in der Historie verweist, heißt es detached HEAD
.
In der Befehlszeile sieht es dann so aus - SHA-1 anstelle des Zweignamens, da die HEAD
nicht auf die Spitze des aktuellen Zweigs zeigt
Ein paar Möglichkeiten, wie man sich von einem abgetrennten HEAD erholen kann:
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 den gewünschten Commit verweist.
Dieser Befehl führt einen Checkout zu einem bestimmten Commit durch.
An dieser Stelle 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>
Sie können jederzeit die reflog
auch.
git reflog
werden alle Änderungen angezeigt, die die HEAD
und das Auschecken des gewünschten Reflog-Eintrags setzt die HEAD
zurück zu diesem Commit.
Jedes Mal, wenn der HEAD geändert wird, wird ein neuer Eintrag in der reflog
git reflog
git checkout HEAD@{...}
So kommen Sie zurück zu Ihrer gewünschten Verpflichtung
"Bewegen" Sie Ihren HEAD 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
auch.
"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl reset macht alle Änderungen, die in der gegebenen Übertragung vorgenommen wurden, "rückgängig".
Ein neuer Commit mit dem rückgängig gemachten Patch wird übertragen, während der ursprüngliche Commit ebenfalls in der Historie verbleibt.
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Dieses Schema veranschaulicht, welcher Befehl was bewirkt.
Wie Sie sehen können, gibt es reset && checkout
ändern die HEAD
.
2 Stimmen
Siehe diese Anleitung für das Rückgängigmachen von Git Commits auf Local, Public und Git Branch Wie man Git Commits wie ein Profi rückgängig macht
703 Stimmen
Weißt du, was Git braucht?
git undo
, das war's. Dann verschwindet der Ruf von Git, mit Fehlern von uns Normalsterblichen umzugehen. Implementieren Sie, indem Sie den aktuellen Zustand auf einen Git-Stack schieben, bevor Sie einegit
Befehl. Es würde die Leistung beeinträchtigen, daher wäre es am besten, ein Konfigurations-Flag hinzuzufügen, das angibt, ob es aktiviert werden soll.58 Stimmen
@YiminRong Das kann man mit Git's
alias
Funktion: git-scm.com/book/de/v2/Git-Basics-Git-Aliases137 Stimmen
Für VsCode-Benutzer, geben Sie einfach ctrl +shift +G ein und klicken Sie dann auf drei Punkte, d.h., mehr Optionen und klicken Sie dann auf Undo Last Commit
30 Stimmen
@YiminRong Undo was genau? Es gibt Dutzende von sehr unterschiedlichen funktionalen Fällen, in denen "Rückgängigmachen" etwas bedeutet vollständig anders. Ich würde wetten, dass die Hinzufügung eines neuen "Zauberstabs" nur noch mehr Verwirrung stiften würde.
52 Stimmen
@YiminRong Ich kaufe es nicht. Die Leute würden immer noch herumfummeln und Dinge rückgängig machen, die nicht rückgängig gemacht werden sollen. Aber was noch wichtiger ist,
git reflog
kommt dem, was du beschreibst, schon sehr nahe, gibt dem Benutzer aber mehr Kontrolle darüber, was (un)getan werden soll. Aber bitte, nein, "Rückgängig" funktioniert nicht überall gleich, und die Leute würden erwarten viele verschiedene Dinge, die das Feature erreichen soll. Letzte Übertragung rückgängig machen? Letzte Aktion rückgängig machen? Wenn die letzte Aktion ein Push war, wie genau rückgängig machen, (zurücksetzen und pushen) oder (rückgängig machen und pushen)?10 Stimmen
Um etwas Einfaches in Git zu tun, machen Sie entweder Impossibly Hard Task A oder Impossibly Hard Task B. Dann vermasseln Sie es ein wenig und versuchen, es durch Impossibly Hard Task C oder Impossibly Hard Task D rückgängig zu machen.
4 Stimmen
Git ist ein Framework, das die Versionierung vieler Dateien und die Zusammenarbeit ermöglicht. Es erfordert absolute Kontrolle darüber, was Sie tun, um diese Ziele zu erreichen. Es ist großartig genau weil es versucht, alle unnötige "Magie" wegzulassen. Etwas wie
git undo
ist im Allgemeinen eine schlechte Idee, aber es ist lächerlich einfach zu implementieren, wenn man es wirklich will. Aber seien Sie sich bewusst, dass Sie dann dafür verantwortlich sind. Ich finde es wirklich erstaunlich, wie schnell die Leute die Kontrolle aufgeben, um nichts lernen zu müssen. Git ist einfach Sie müssen nur die Konzepte lernen.3 Stimmen
"Dinge rückgängig machen, die nicht rückgängig gemacht werden sollen" - Diese Dinge wären alle Dinge. Wie kann ich meinen Quellcode wirklich etwas anvertrauen, das mich (oder andere) die Geschichte ändern lässt.
8 Stimmen
Argumentation gegen eine
undo
Befehl ist künstliche Schwerfälligkeit. Ja, Sie können dies mit einer Kombination ausreflog
,reset
etcheckout
. Das Problem ist, dass dies für jeden, der es nicht routinemäßig tut, eine völlig unnatürliche Willensbekundung ist. Mercurial hatrollback
und es hat nichts kaputt gemacht. Git sollte auch etwas haben.4 Stimmen
Sie können Folgendes installieren git-extras die eine Reihe von Git-Hilfsfunktionen sind - enthält die
git undo
Befehl, um die letzte Übertragung rückgängig zu machen. Ich benutze ihn ständig, wenn ich gerade etwas übertragen habe (und noch nicht gepusht habe) und eine nicht übertragene Datei hinzufügen oder den Commit-Kommentar ändern muss.0 Stimmen
@ashad - Ihr Vorschlag war für mich genau richtig! Danke!!
2 Stimmen
In Ihrem Fall können Sie einfach den Git-Reset durchführen (wenn Sie nicht in den Zweig gepusht haben). Wenn Sie bereits in den Zweig gepusht haben, führen Sie git reset --hard HEAD^1 aus.
0 Stimmen
Jedes Mal, wenn ich diesen Beitrag brauche, komme ich hierher, löse mein Problem und sage, was für ein schöner Beitrag :) danke euch allen.