Wie kann ich HEAD an einen früheren Ort zurückbewegen? (Abgetrennter Kopf) & Commits rückgängig machen

Lesezeit: 10 Minuten

Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
Pauke

In Git habe ich versucht, a squash commit B. durch Zusammenführen in einem anderen Zweig und anschließendem Zurücksetzen HEAD zum vorherigen Ort über:

git reset origin/master

Aber ich muss hier raus. Wie kann ich HEAD zurück an den vorherigen Ort verschieben?

Ich habe das SHA-1-Fragment (23b6772) des Commit, in das ich es verschieben muss. Wie kann ich zu diesem Commit zurückkehren?

  • HEAD ist nur ein Zeiger auf Ihre aktuelle Position (oder Revision, um genau zu sein). git checkout 23b6772 sollte tun.

    – Jaroslaw Admin

    29. Dezember 2015 um 21:54 Uhr


  • Mögliches Duplikat von Revert Git repo to a previous commit

    – Andreas C

    30. Dezember 2015 um 12:15 Uhr

  • @YaroslavAdmin Nein, sollte es nicht. Direktes Auschecken eines Commits ist der Grund für den getrennten HEAD-Zustand (da Remote-Tracking-Zweige nicht selbst ausgecheckt werden können und automatisch auf das Commit verschieben, auf das sie verweisen, wenn Sie dies versuchen, wie es OP getan hat). Entschuldigen Sie auch den nekromantischen Kommentar 🙂 Ich sortiere von hoffen das anfangsproblem ist schon gelöst…

    – Romain Waleri

    24. März 2019 um 21:58 Uhr


Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
CodeWizard

Bevor wir antworten, fügen wir etwas Hintergrund hinzu und erklären, was das ist HEAD ist.

First of all what is 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/HEAD und es enthält die 40 Bytes SHA-1 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.

Geben Sie hier die Bildbeschreibung ein

Auf der Befehlszeile sieht es so aus – SHA-1 anstelle des Zweignamens seit dem HEAD zeigt nicht auf die Spitze des aktuellen Zweigs:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


Einige Optionen zur Wiederherstellung von einem abgetrennten HEAD:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to go back

Dadurch wird der neue Zweig ausgecheckt, der auf das gewünschte Commit zeigt.
Dieser Befehl checkt zu einem bestimmten Commit aus.
An diesem Punkt können Sie einen Zweig erstellen und von diesem Punkt an 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 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

Geben Sie hier die Bildbeschreibung ein


git reset --hard <commit_id>

„Bewege“ deinen 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.
  • Notiz: (Seit Git 2.7) Sie können auch die verwenden git rebase --no-autostash auch.

Geben Sie hier die Bildbeschreibung ein


git revert <sha-1>

“Rückgängig machen” des angegebenen Commit oder Commit-Bereichs.
Der Reset-Befehl macht alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neuer Commit mit dem Undo-Patch wird festgeschrieben, während der ursprüngliche Commit ebenfalls im Verlauf verbleibt.

# Add a 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 zeigt, welcher Befehl was macht.
Wie Sie dort sehen können, reset && checkout modifiziere den HEAD.

Geben Sie hier die Bildbeschreibung ein

  • Wenn Sie sich nicht auf dem letzten Commit befinden – was bedeutet, dass HEAD auf ein früheres Commit in der Historie zeigt, wird es als abgetrennter HEAD bezeichnet es sei denn, dieser frühere Commit in der Geschichte ist die Spitze eines anderen Zweigs. Meiner Erfahrung nach könnte man sagen, dass Sie losgelöst sind, wenn HEAD nicht auf ein Commit zeigt, auf das auch ein Zweig zeigt. Dies gilt nicht für Tags.

    – Tim

    19. April 2016 um 10:25 Uhr

  • Sie können sich in einem getrennten HEAD befinden und gleichzeitig einen Zweig mit demselben Commit wie der HEAD dieses Zweigs haben. Ich verstehe deinen Kommentar nicht

    – CodeWizard

    19. April 2016 um 10:29 Uhr

  • Ich habe Probleme mit Ihrer Verwendung von Inline-Code-Markup für Überschriften 🙂

    – jub0bs

    22. Dezember 2016 um 17:07 Uhr

  • Konnte keinen besseren Weg finden, es zu betonen. Fühlen Sie sich frei zu bearbeiten. du bist mehr als willkommen

    – CodeWizard

    22. Dezember 2016 um 18:04 Uhr

Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
amuliar

Zuerst reset örtlich:

git reset 23b6772

Um zu sehen, ob Sie auf der richtigen Position sind, bestätigen Sie mit:

git status

Sie werden etwas sehen wie:

Auf Branch Master Ihr Branch liegt 17 Commits hinter ‘origin/master’ und kann schnell vorgespult werden.

Dann schreiben Sie die Geschichte um in Ihrem Remote-Tracking-Zweig um die Änderung widerzuspiegeln:

git push --force-with-lease // a useful command @oktober mentions in comments

Verwenden --force-with-lease anstatt --force wird einen Fehler auslösen, wenn andere sich inzwischen auf den entfernten Zweig festgelegt haben, in diesem Fall sollten Sie zuerst abrufen. Mehr Infos in diesem Artikel.

  • Seien Sie AUSSERGEWÖHNLICH VORSICHTIG mit git push --force. In vielen Situationen macht es Sie für eine Weile zur unbeliebtesten Person im Team….

    – Kai v

    10. Februar 2020 um 21:31 Uhr

  • Um den obigen Hinweis zu ergänzen, bin ich gerade auf dieses Zitat gestoßen about.gitlab.com/blog/2014/11/26/keeping-your-code-protected und musste es hinzufügen: “Ein einziger git push –force Befehl kann vielen Leuten leicht den Tag ruinieren: [186 Jenkins] Repositories haben ihre Zweigköpfe zurückgespult, um auf ältere Commits zu verweisen, und tatsächlich wurden die neueren Commits nach dem schlechten Git-Push verlegt.” –sehr unbeliebter Entwickler ….

    – Kai v

    13. Februar 2020 um 23:29 Uhr

  • @KayV schau mal git push --force-with-lease (Thoughtbot-Artikel: gedankenbot.com/blog/git-push-force-with-lease)

    – oktober

    17. Februar 2020 um 20:38 Uhr

  • Nützliche Flagge, @oktober, und ein guter Artikel. Danke, dass du es hier hinzugefügt und mich darauf angesprochen hast.

    – Kai v

    18. Februar 2020 um 1:57 Uhr

  • Danke! Dies hat mir geholfen, eine schlechte Zusammenführung rückgängig zu machen. da Zusammenführungen nicht auf die gleiche Weise reagieren revert als ich mich verpflichtete, befand ich mich in einer unglaublich schwierigen Situation. force-with-lease gab mir das Selbstvertrauen, die Git-Geschichte des Zweigs neu zu schreiben, ohne die Arbeit anderer Leute zu beeinträchtigen. Bravo!

    – fIwJlxSzAPHEZIl

    13. März 2020 um 21:41 Uhr

1646914692 226 Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
Kay v

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: Dieser Befehl bewegt HEAD zurück an seine letzte Position. Siehe Hinweis auf Ergebnisse am Ende dieser Antwort.


Mnemonik: Dieser Ansatz ist dem Verwenden sehr ähnlich cd - um zu Ihrem zuvor besuchten Verzeichnis zurückzukehren. Die Syntax und die anwendbaren Fälle passen ziemlich gut zusammen (z. B. ist es nützlich, wenn Sie tatsächlich wollen, dass HEAD dorthin zurückkehrt, 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 abgetrenntem HEAD wiedergefunden. In diesem Fall sind hier 2 einfache, leicht zu merkende Schritte.

1. Wählen Sie den gewünschten Zweig aus

Verwenden git branch -v

Sie sehen eine Liste der bestehenden lokalen Niederlassungen. Holen Sie sich den Filialnamen, der Ihren Anforderungen entspricht.

2. Bewegen Sie HEAD dorthin

Verwenden git checkout <branch_name>

Du wirst sehen Switched to branch <branch_name>. Erfolg!


Ergebnisse

Bei beiden Methoden können Sie jetzt wie bisher mit dem Hinzufügen und Übertragen Ihrer Arbeit fortfahren: Ihre nächsten Änderungen werden nachverfolgt <branch_name>.

Beachten Sie, dass beides git checkout - und git checkout <branch_name> gibt zusätzliche Anweisungen, wenn Sie Änderungen festgeschrieben haben, während HEAD getrennt war.

  • Dies funktioniert nicht, denn wenn ich es tue (vorausgesetzt, dass 8acc968 HEAD ~ 2 ist) git checkout 8acc968dann git branch -v hat MyBranch in der Liste unten …aber dann git checkout MyBranch löscht meine Kommentare.

    – amuliar

    10. Oktober 2018 um 12:23 Uhr

  • Hallo @amuliar – git checkout 8acc968 checkt einen Commit aus, keinen Branch. Wenn MyBranch hat die Commits, die Sie wollen, versuchen Sie es git checkout MyBranch. Wenn es die Änderungen in Commit 8acc968 nicht enthält, müssten Sie diese Änderungen zusammenführen, nachdem Sie den Zweig ausgecheckt haben.

    – Kai v

    10. Oktober 2018 um 13:57 Uhr


  • Danke für die Antwort! Ich tat git checkout um einen früheren Commit zu sehen 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!

    – zy

    10. Februar 2020 um 5:50 Uhr

  • git checkout - hat nicht unbedingt die Wirkung, die Sie sagen.

    – Mike Nagetier

    12. Februar um 19:38 Uhr

1646914693 726 Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
Antak

Die Frage kann wie folgt gelesen werden:

Ich war in einem getrennten Zustand mit HEAD bei 23b6772 und getippt git reset origin/master (weil ich quetschen wollte). Jetzt habe ich meine Meinung geändert, wie gehe ich zurück zu HEAD dabei sein 23b6772?

Die einfache Antwort lautet: git reset 23b6772

Aber ich bin auf diese Frage gestoßen, weil ich es satt hatte, Commit-Hashes oder ihre Abkürzung jedes Mal einzugeben (Kopieren und Einfügen), wenn ich auf die vorherige verweisen wollte HEAD und googelte, um zu sehen, ob es irgendeine Art von Kurzschrift gab.

Es stellt sich heraus, dass es das gibt!

git reset - (oder in meinem Fall git cherry-pick -)

Was übrigens dasselbe war wie cd - um zum vorherigen zurückzukehren Aktuelles Verzeichnis im *nix! Also hurra, ich habe zwei Dinge mit einer Klappe gelernt.

1646914693 464 Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
Deepak Kumar

Wenn Sie den Befehl ausführen git checkout commit_id dann HEAD abgelöst 13ca5593d(say commit-id) und Filiale wird länger verfügbar sein.

Gehen Sie zurück zur vorherigen Position, führen Sie den Befehl schrittweise aus –

  1. git pull origin branch_name (sagen Meister)
  2. git checkout branch_name
  3. git pull origin branch_name

Sie kehren mit einem aktualisierten Commit aus dem Remote-Repository zum vorherigen Speicherort zurück.

1646914694 811 Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
Peter Mortensen

Heute habe ich fälschlicherweise einen Commit ausgecheckt und angefangen, daran zu arbeiten, wobei ich einige Commits mit einem getrennten HEAD-Zustand gemacht habe. Dann habe ich mit dem folgenden Befehl auf den Remote-Branch gepusht:

git push origin HEAD: <My-remote-branch>

Dann

git checkout <My-remote-branch>

Dann

git pull

Ich habe endlich alle Änderungen in meinem Zweig, die ich in Detached HEAD vorgenommen habe.

1646914694 307 Wie kann ich HEAD an einen fruheren Ort zuruckbewegen Abgetrennter
Sathish Kumar

Das ist vielleicht keine technische Lösung, aber es funktioniert. (falls einer Ihrer Teamkollegen die gleiche Filiale in der Region hat)

Nehmen wir an, Ihr Zweigname lautet Filiale-xxx.

Schritte zur Lösung:

  • Nicht aktualisieren oder ziehen – nichts
  • Erstellen Sie einfach einen neuen Zweig (Zweig-yyy) von Filiale-xxx auf seiner Maschine
  • Das ist alles, alle Ihre bestehenden Änderungen befinden sich in diesem neuen Zweig (Zweig-yyy). Sie können Ihre Arbeit mit diesem Zweig fortsetzen.

Hinweis: Auch dies ist keine technische Lösung, aber es wird sicher helfen.

987880cookie-checkWie kann ich HEAD an einen früheren Ort zurückbewegen? (Abgetrennter Kopf) & Commits rückgängig machen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy