In Git habe ich versucht, dies zu tun, squash commit
indem ich in einem anderen Zweig zusammengeführt und dann zurückgesetzt habeHEAD
auf den vorherigen Ort zurückgesetzt habe:
git reset origin/master
Aber ich muss da raus. Wie kann ich HEAD zurück zum vorherigen Speicherort verschieben?
Ich habe das SHA-1-Fragment ( 23b6772
) des Commits, in das ich es verschieben muss. Wie kann ich zu diesem Commit zurückkehren?
git
git-checkout
git-reset
git-revert
git-reflog
Timpone
quelle
quelle
git checkout 23b6772
sollte tun.Antworten:
Bevor wir antworten, fügen wir einige Hintergrundinformationen hinzu und erklären, was dies
HEAD
ist.First of all what is HEAD?
HEAD
ist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.Es kann immer nur eine einzige
HEAD
geben (ausgenommengit worktree
).Der Inhalt von
HEAD
wird darin gespeichert.git/HEAD
und enthält die 40 Bytes SHA-1 des aktuellen Commits.detached HEAD
Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass
HEAD
auf ein vorheriges Commit im Verlauf verwiesen wirddetached HEAD
.In der Befehlszeile sieht es folgendermaßen aus: SHA-1 anstelle des Zweignamens, da der
HEAD
nicht auf die Spitze des aktuellen Zweigs zeigt:Einige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
git checkout
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 einen Zweig erstellen und ab diesem Zeitpunkt mit der Arbeit beginnen.
git reflog
Sie können das auch immer verwenden
reflog
.git reflog
zeigt jede Änderung an, die das aktualisiert hat,HEAD
und das Auschecken des gewünschten Reflog-Eintrags setzt das ZurücksetzenHEAD
auf dieses Commit.Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der
reflog
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset --hard <commit_id>
"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.
git rebase --no-autostash
.git revert <sha-1>
"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl zum Zurücksetzen "macht" alle Änderungen rückgängig, die am angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.
Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können,
reset && checkout
ändern Sie dieHEAD
.quelle
Machen
Um zu sehen, ob Sie an der richtigen Position sind:
Du wirst etwas sehen
Schreiben Sie dann den Verlauf auf Ihrer Fernbedienung neu, um die Änderung widerzuspiegeln:
quelle
git push --force
. In vielen Situationen werden Sie für eine Weile die am wenigsten beliebte Person im Team sein ...git push --force-with-lease
(Thoughtbot-Artikel : oughtbot.com/blog/git-push-force-with-lease )revert
wie Commits, befand ich mich in einer unglaublich schwierigen Situation.force-with-lease
gab mir das Vertrauen, die Git-Geschichte der Branche neu zu schreiben, ohne die Arbeit anderer zu beeinträchtigen. Bravo!Schnellstmögliche Lösung (nur 1 Schritt)
Verwenden
git checkout -
Du wirst sehen
Switched to branch <branch_name>
. Bestätigen Sie, dass es sich um den gewünschten Zweig handelt.Kurze Erklärung: Mit diesem Befehl wird HEAD wieder in die letzte Position gebracht. Siehe Hinweis zu den Ergebnissen am Ende dieser Antwort.
Mnemonik: Dieser Ansatz ähnelt der Verwendung
cd -
, um zu Ihrem zuvor besuchten Verzeichnis zurückzukehren. Die Syntax und die zutreffenden Fälle stimmen ziemlich gut überein (z. B. ist es nützlich, wenn HEAD tatsächlich dorthin zurückkehren soll, wo es war).Methodischere Lösung (2 Schritte, aber einprägsam)
Der schnelle Ansatz löst die Frage des OP. Aber was ist, wenn Ihre Situation etwas anders ist: Angenommen, Sie haben Bash neu gestartet und sich dann mit getrenntem KOPF wiedergefunden. In diesem Fall sind hier zwei einfache, leicht zu merkende Schritte.
1. Wählen Sie den gewünschten Zweig aus
Verwenden
git branch -v
Sie sehen eine Liste der vorhandenen lokalen Niederlassungen. Suchen Sie sich den Filialnamen, der Ihren Anforderungen entspricht.
2. Bewegen Sie den KOPF dorthin
Verwenden
git checkout <branch_name>
Du wirst sehen
Switched to branch <branch_name>
. Erfolg!Ergebnisse
Mit beiden Methoden können Sie jetzt wie zuvor mit dem Hinzufügen und Festschreiben Ihrer Arbeit fortfahren: Ihre nächsten Änderungen werden nachverfolgt
<branch_name>
.Beachten Sie, dass beide
git checkout -
undgit checkout <branch_name>
zusätzliche Anweisungen geben, wenn Sie Änderungen festgeschrieben haben, während HEAD getrennt wurde.quelle
git checkout 8acc968
danngit branch -v
hatMyBranch
in der Liste unten ... aber danngit checkout MyBranch
löscht meine Kommentare.git checkout 8acc968
prüft ein Commit, keinen Zweig. WennMyBranch
Sie die gewünschten Commits haben, versuchen Sie esgit checkout MyBranch
. Wenn die Änderungen in Commit 8acc968 nicht enthalten sind, müssen Sie diese Änderungen nach dem Auschecken des Zweigs zusammenführen.git checkout
ein vorheriges Commit gesehen und wollte zum letzten Commit zurückkehren. Aber ohne den letzten Commit-Hash war ich ziemlich verloren. Diese Lösung ist perfekt für meine Situation!Die Frage kann gelesen werden als:
Ich war in losgelöstem Zustand mit
HEAD
at23b6772
und tipptegit reset origin/master
(weil ich quetschen wollte). Jetzt habe ich meine Meinung geändert, wie gehe ich zurückHEAD
zu sein23b6772
?Die einfache Antwort lautet:
git reset 23b6772
Aber ich bin auf diese Frage
HEAD
gestoßen, weil ich es satt hatte, jedes Mal , wenn ich auf das vorherige verweisen wollte, Commit-Hashes oder deren Abkürzung zu tippen (kopieren und einfügen) und googelte, um zu sehen, ob es irgendeine Art von Kurzschrift gab.Es stellt sich heraus, dass es gibt!
git reset -
(oder in meinem Fallgit cherry-pick -
)Was übrigens dasselbe war
cd -
, um zum vorherigen aktuellen Verzeichnis in * nix zurückzukehren! Also Hurra, ich habe zwei Dinge mit einer Klappe gelernt.quelle
Wenn Sie den Befehl ausführen,
git checkout commit_id
ist HEAD getrennt von13ca5593d(say commit-id)
und Branch ist länger verfügbar.Zum vorherigen Speicherort zurückkehren Führen Sie den Befehl schrittweise aus -
git pull origin branch_name
(sag Meister)git checkout branch_name
git pull origin branch_name
Sie kehren mit einem aktualisierten Commit aus dem Remote-Repository zum vorherigen Speicherort zurück.
quelle
Heute habe ich fälschlicherweise ein Commit ausgecheckt und angefangen, daran zu arbeiten, wobei ich einige Commits für einen getrennten HEAD-Status vorgenommen habe. Dann habe ich mit dem folgenden Befehl zum Remote-Zweig gewechselt:
Dann
Dann
Ich habe endlich alle Änderungen in meinem Zweig erhalten, die ich in losem KOPF vorgenommen habe.
quelle
Dies ist möglicherweise keine technische Lösung, funktioniert aber. (wenn einer Ihrer Teamkollegen dieselbe Niederlassung vor Ort hat)
Nehmen wir an, Ihr Filialname lautet branch-xxx .
Schritte zum Lösen:
Hinweis: Auch dies ist keine technische Lösung, aber sie wird auf jeden Fall helfen.
quelle