11 Stimmen

Wie behebe ich das Auschecken von HEAD^ in Git

Okay, ich habe einige Änderungen an meinem Projekt vorgenommen, die zu einem riesigen Durcheinander geführt haben. Ich hatte die Änderungen bereits festgeschrieben, um später darauf zurückgreifen zu können, und dann git checkout HEAD^ verwendet, um den vorherigen Commit auszuchecken. Wenn ich nun Änderungen an meinem Projekt vornehme, wird in der Befehlszeile der SHA-1 als Arbeitszweig angezeigt (statt Master)

Ich weiß nicht alles, was es über Git zu wissen gibt, aber ich vermute, dass HEAD immer noch auf meine kaputte Kopie verweist, da ich auf einer Tangente unterwegs bin und das Problem gelöst habe. Wie kann ich HEAD auf den letzten Commit verweisen, mit dem ich arbeite?

Ich vermute, dass es mit Rebase zu tun hat, aber ich bin mir nicht 100%ig sicher.

Danke.

23voto

Chris Johnsen Punkte 199970

Wenn ich jetzt Übertragungen an meinem Projekt vornehme, wird in der Befehlszeile der SHA-1-Zweig als Arbeitszweig angezeigt (anstelle von master)

Dies bedeutet wahrscheinlich, dass Sie einen "abgetrennten HEAD" haben. Ein abgetrennter HEAD verweist direkt auf einen Commit, anstatt auf einen Zweig zu verweisen (der dann auf einen Commit verweist). Ein abgetrennter Kopf ist wie ein unbenannter Zweig.

Dieser Zustand wurde verursacht durch Ihre git checkout HEAD^ Befehl als HEAD^ bezieht sich auf eine Übertragung, nicht auf einen Zweignamen. Sie wollten wahrscheinlich Folgendes tun git reset --hard HEAD^ - während Meister war immer noch der aktive Zweig -, um die letzte Übertragung von Meister (er würde noch auf der Festplatte existieren und über das Reflog erreichbar sein, bis sein Eintrag im Reflog abläuft).

Wie kann ich HEAD auf den letzten Commit verweisen, mit dem ich arbeite?

HEAD ist immer das Commit, von dem aus Sie arbeiten, egal ob es losgelöst ist oder nicht.

Wenn Sie meinen: "Wie kann ich die Meister zum letzten Commit, mit dem ich arbeite", dann ist das dasselbe wie die Frage "Wie kann ich die Meister zeigen auf HEAD ?". Die Antwort lautet

git branch -f master HEAD

(Sie können auch weglassen HEAD da dies die Standardeinstellung ist). Dies setzt zwangsweise zurück Meister zu der aktuellen Übergabe an HEAD . Alle Übertragungen auf Meister die nicht über einen anderen Zweig oder die aktuelle Verzweigung erreichbar sind HEAD ist fortan nur noch über das Reflog erreichbar und wird schließlich garbage collected (das wirft, von Meister alles, was in Meister die nicht in HEAD ). Wahrscheinlich möchten Sie auch Ihre HEAD zu diesem aktualisierten Master.

git checkout master

Anstelle der beiden obigen Befehle könnten Sie auch folgende Befehle einfügen HEAD zuerst, dann zurücksetzen Meister mit diesen beiden aufeinanderfolgenden Befehlen:

git checkout master         # reattach, commit at HEAD is now the unwanted commit
git reset --hard HEAD@{1}   # reset master to the commit at HEAD before the prior command

Le site HEAD@{1} Notation verwendet, um auf Einträge im Reflog zuzugreifen. Dieses Beispiel bedeutet einfach "der vorherige HEAD " (d.h. "die Übergabe bei HEAD vor der letzten Operation, die sich auf HEAD ").

3voto

Edward Anderson Punkte 12871
git checkout HEAD
git reset HEAD^

Dadurch wird die letzte Übertragung gelöscht. Bestätigen Sie, dass es funktioniert hat mit svn log .

Ich habe bemerkt, dass Sie dies mit git-svn gekennzeichnet haben. Das funktioniert nur, wenn Sie den verpfuschten Commit noch nicht an svn weitergegeben haben. Wenn dies der Fall ist, müssen Sie einen Reverse-Merge des verpfuschten Commits wie folgt durchführen:

$ git log
commit 30480f327040f812cb2afffdd1cdd374bf26fe83
Author: you
Date: today

    messed up commit

$ git revert 30480f327040f812cb2afffdd1cdd374bf26fe83

wobei 30480f327040f812cb2afffdd1cdd374bf26fe83 der Hash der verpfuschten Übertragung ist.

1voto

Greg Hewgill Punkte 882617

Ich denke, was Sie suchen, ist git reset :

git checkout HEAD
git reset --hard HEAD^

Dies bringt "master" zurück zu einer Revision vor dem aktuellen HEAD. Das, womit Sie im Moment arbeiten, wird als "abgetrennter Kopf" bezeichnet, da es keinen symbolischen Namen hat, der mit ihm verbunden ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X