Ich habe in meinem Repository gearbeitet und festgestellt, dass eine Datei lokale Änderungen aufweist. Ich wollte sie nicht mehr, also löschte ich die Datei und dachte, ich könnte einfach eine neue Kopie auschecken. Ich wollte das Git-Äquivalent von machen
svn up .
Verwenden git pull
schien nicht zu funktionieren. Eine zufällige Suche führte mich zu einer Seite, die jemand empfohlen hatte
git checkout HEAD^ src/
( src
ist das Verzeichnis, das die gelöschte Datei enthält).
Jetzt finde ich heraus, dass ich einen abgetrennten Kopf habe. Ich habe keine Ahnung was das ist. Wie kann ich rückgängig machen?
git checkout master
Sie gelangen zurück in die Hauptniederlassung. Wenn Sie Änderungen an der Arbeitskopie löschen wollten, wollten Sie dies wahrscheinlich tungit reset --hard
.git checkout -- src/
create temp branch - checkout temp branch - checkout master - delete temp branch
working copy changes
? Beziehen Sie sich auf die Änderungen, die Sie an Dateien vorgenommen haben, nachdem Sie ein anderes Commit ausgecheckt haben (dh auf die Änderungen, die Sie in einem Status mit getrenntem Kopf vorgenommen haben)?Antworten:
Abgelöster Kopf bedeutet, dass Sie sich nicht mehr in einem Zweig befinden. Sie haben ein einzelnes Commit in der Historie ausgecheckt (in diesem Fall das Commit vor HEAD, dh HEAD ^).
Wenn Sie löschen möchten Ihre Änderungen die mit dem abgetrennten HEAD verknüpft sind
Sie müssen nur den Zweig auschecken, in dem Sie sich befanden, z
Wenn Sie das nächste Mal eine Datei geändert haben und den Status im Index wiederherstellen möchten, löschen Sie die Datei nicht zuerst, sondern tun Sie dies einfach
Dadurch wird die Datei foo auf den Status im Index zurückgesetzt.
Wenn Sie möchten , halten Sie die Änderungen mit dem abgelösten HEAD zugeordnet
git branch tmp
- Hiermit werden Ihre Änderungen in einem neuen Zweig namens gespeicherttmp
.git checkout master
master
, führen Sie sie ingit merge tmp
dermaster
Verzweigung aus. Sie sollten sichmaster
nach dem Ausführen auf dem Zweig befindengit checkout master
.quelle
Previous HEAD position was 7426948...
Wenn Sie Dateien geändert haben, die Sie nicht verlieren möchten, können Sie sie pushen. Ich habe sie im getrennten Modus festgeschrieben und danach können Sie zu einem temporären Zweig wechseln, um sie später in den Master zu integrieren.
Extrahiert aus:
Was tun mit Commit in einem abgetrennten Kopf?
quelle
git stash
? Da ist das das erste, was mir in den Sinn kommt. Das Erstellen eines neuen Zweigs ist ein Overkill.git rebase my-temporary-work
den Zweig auch löschen und dann löschen,git branch -d my-temporary-work
sodass es so aussieht, als hätten Sie sich zunächst für den richtigen Zweig entschieden.git stash
klingt wie das perfekte Werkzeug für diesen Fall. Könnten Sie bitte eine Antwort mit den vorgeschlagenen Schritten schreiben, um dies zu erreichen?Eine Lösung ohne temporären Zweig.
So beenden Sie den getrennten HEAD-Status („fix“), wenn Sie in diesem Modus bereits etwas geändert haben und optional Ihre Änderungen speichern möchten:
Übernehmen Sie die Änderungen, die Sie behalten möchten. Wenn Sie eine der Änderungen übernehmen möchten, die Sie im getrennten HEAD-Status vorgenommen haben, schreiben Sie sie fest. Mögen:
Verwerfen Sie Änderungen, die Sie nicht behalten möchten. Beim Hard-Reset werden alle nicht festgeschriebenen Änderungen verworfen, die Sie im getrennten HEAD-Status vorgenommen haben:
(Ohne dies würde Schritt 3 fehlschlagen und sich über geänderte nicht festgeschriebene Dateien im abgetrennten HEAD beschweren.)
Überprüfen Sie Ihre Filiale. Beenden Sie den Status "Getrennter HEAD", indem Sie den Zweig überprüfen, an dem Sie zuvor gearbeitet haben. Beispiel:
Übernehmen Sie Ihre Verpflichtungen. Sie können jetzt die Commits übernehmen, die Sie im freistehenden HEAD-Zustand durch Kirschernte vorgenommen haben, wie in meiner Antwort auf eine andere Frage gezeigt .
quelle
git reset --hard
war genau das, was ich brauchte, weil ich möchte, dass der Upstream die Quelle ist und die lokalen Änderungen entfernt werden sollten.Abgenommener Kopf bedeutet:
Wenn Sie keine Änderungen vorgenommen haben: Sie können mit dem folgenden Befehl zum Master wechseln
Wenn Sie Änderungen haben, die Sie behalten möchten:
Bei einem abgetrennten HEAD funktionieren die Commits wie gewohnt, außer dass kein benannter Zweig aktualisiert wird. Um den Hauptzweig mit Ihren festgeschriebenen Änderungen zu aktualisieren, erstellen Sie einen temporären Zweig an Ihrer Position (auf diese Weise enthält der temporäre Zweig alle festgeschriebenen Änderungen, die Sie im getrennten HEAD vorgenommen haben). Wechseln Sie dann zum Hauptzweig und führen Sie den temporären Zweig mit zusammen der Meister.
quelle
Folgendes habe ich gerade getan, nachdem mir klar wurde, dass ich auf einem abgetrennten Kopf war und bereits einige Änderungen vorgenommen hatte.
Ich habe die Änderungen übernommen.
Ich erinnerte mich an den Hash (1fe56ad) des Commits. Dann habe ich mir die Filiale angesehen, in der ich hätte sein sollen.
Schließlich habe ich die Änderungen des Commits auf den Zweig angewendet.
Ich denke, das ist ein bisschen einfacher als das Erstellen eines temporären Zweigs.
quelle
git cherry-pick <hash>
.Wenn Sie einige Änderungen vorgenommen haben und dann festgestellt haben, dass Sie sich auf einem abgetrennten Kopf befinden, gibt es dafür eine einfache Lösung: stash -> checkout master -> stash pop:
Sie haben Ihre nicht festgeschriebenen Änderungen und den normalen "angehängten" KOPF, als wäre nichts passiert.
quelle
Wenn Sie ein bestimmtes Commit auschecken
git
, landen Sie in einem abgetrennten Kopf Status mit Das heißt, Ihre Arbeitskopie spiegelt nicht mehr den Status einer benannten Referenz wider (wie "Master"). Dies ist nützlich, um den früheren Status des Repositorys zu untersuchen, aber nicht, was Sie möchten, wenn Sie tatsächlich versuchen, Änderungen rückgängig zu machen.Wenn Sie Änderungen an einer bestimmten Datei vorgenommen haben und diese einfach verwerfen möchten, können Sie den folgenden
checkout
Befehl verwenden:Dadurch werden nicht festgeschriebene Änderungen verworfen und die Datei auf den Status im Kopf Ihres aktuellen Zweigs zurückgesetzt. Wenn Sie bereits festgeschriebene Änderungen verwerfen möchten, können Sie den
reset
Befehl verwenden. Dadurch wird das Repository beispielsweise auf den Status des vorherigen Commits zurückgesetzt, und alle nachfolgenden Änderungen werden verworfen:Wenn Sie das Repository jedoch für andere Personen
git reset
freigeben , kann a störend sein (da dadurch ein Teil des Repository-Verlaufs gelöscht wird). Wenn Sie bereits Änderungen mit anderen Personen geteilt haben, möchten Sie diese im Allgemeinen anzeigengit revert
stattdessen betrachten, wodurch ein "Anticommit" generiert wird. Das heißt, es wird ein neues Commit erstellt, das die fraglichen Änderungen "rückgängig macht".Das Git-Buch enthält weitere Details.
quelle
git checkout path/to/foo
könnte es zu Konflikten kommengit checkout some-branch
, daher wäre es besser,git checkout -- path/to/foo
diese Konflikte zu vermeiden.HEAD befindet sich in einem Zeiger und zeigt daher direkt oder indirekt auf ein bestimmtes Commit:
Befestigt Kopfmittel , dass es bis zu einem gewissen angebracht ist Zweig (dh er weist auf einen Zweig).
Freistehendes HEAD bedeutet , dass es nicht an einem Zweig befestigt, dh er weist direkt auf einige begehen.
Mit anderen Worten:
Um Situationen mit angeschlossenem / abgenommenem KOPF besser zu verstehen, zeigen wir die Schritte, die zum Vierfachen der obigen Bilder führen.
Wir beginnen mit demselben Status des Repositorys (Bilder in allen Quadranten sind gleich):
Jetzt wollen wir durchführen
git checkout
- mit verschiedenen Zielen in den einzelnen Bildern (Befehle auf ihnen sind abgeblendet zu betonen , dass wir nur zu gehen , diese Befehle gelten):Dies ist die Situation nach dem Ausführen dieser Befehle:
Wie Sie sehen können, zeigt der HEAD auf das Ziel des
git checkout
Befehls - auf einen Zweig (die ersten 3 Bilder des Quadruplets) oder (direkt) auf ein Commit (das letzte Bild des Quadrupletts).Der Inhalt des Arbeitsverzeichnisses wird ebenfalls so geändert, dass er dem entsprechenden Commit (Snapshot) entspricht, dh dem Commit, auf das der HEAD (direkt oder indirekt) hinweist.
Wir befinden uns jetzt in der gleichen Situation wie zu Beginn dieser Antwort:
quelle
Da Sie sich im Status "Abgelöster Kopf" in einem temporären Zweig befinden, verwenden
git checkout -
Sie einfach den Zweig, in dem Sie sich zuletzt befanden.quelle
git reflog
und können in eine neue Niederlassung oder übergit cherry-pick
eine bestehende Niederlassung übernommen werden. Siehe diese Frage .Um die Antwort von @Philippe Gerber weiter zu verdeutlichen, hier:
Vorher ist in diesem Fall
cherry-pick
eingit checkout master
notwendig. Darüber hinaus wird es nur mit einemcommit
in benötigtdetached head
.quelle
Nachtrag
Wenn der Zweig, zu dem Sie zurückkehren möchten, der letzte Checkout war, den Sie durchgeführt haben, können Sie ihn einfach verwenden
checkout @{-1}
. Dadurch kehren Sie zu Ihrer vorherigen Kaufabwicklung zurück.Außerdem können Sie diesen Befehl beispielsweise mit einem Alias versehen,
git global --config alias.prev
sodass Sie nur eingeben müssen,git prev
um zur vorherigen Kasse zurückzukehren.quelle
In "losgelöstem Kopf" zu sein bedeutet, dass sich HEAD auf ein bestimmtes unbenanntes Commit bezieht (im Gegensatz zu einem benannten Zweig) (vgl.: Https://git-scm.com/docs/git-checkout Abschnitt Losgelöster Kopf )
Um das Problem zu beheben, müssen Sie nur den Zweig auswählen, der zuvor von ausgewählt wurde
git checkout @{-1}
quelle
Wenn Sie sich in einer Situation mit getrenntem Kopf befinden und neue Dateien erstellt haben, stellen Sie zunächst sicher, dass diese neuen Dateien zum Index hinzugefügt werden, z. B.:
Wenn Sie jedoch nur vorhandene Dateien geändert oder gelöscht haben, können Sie gleichzeitig (-a) hinzufügen und mit einer Nachricht (-m) festschreiben über:
Dann können Sie einfach einen neuen Zweig mit Ihrem aktuellen Status erstellen mit:
Sie haben einen neuen Zweig und alle Ihre Anpassungen werden in diesem neuen Zweig vorhanden sein. Sie können dann weiter auf die Fernbedienung drücken und / oder nach Belieben auschecken / ziehen / zusammenführen.
quelle
Git hat mir gesagt, wie es geht.
wenn Sie getippt haben:
Speichern Sie den Status
Dann:
quelle
Ich wollte meine Änderungen behalten, also behebe ich das einfach ...
diese Arbeit für mich
quelle
Zeigt normalerweise
HEAD
auf einen Zweig. Wenn es nicht auf einen Zweig zeigt, sondern auf einen Commit-Hash69e51
, bedeutet dies, dass Sie einen getrennten HEAD haben. Sie müssen auf zwei Zweige zeigen, um das Problem zu beheben. Sie können zwei Dinge tun, um das Problem zu beheben.hash
quelle
Abgelöster Kopf bedeutet, dass Sie Ihren Zweig nicht richtig ausgecheckt haben oder nur ein einzelnes Commit ausgecheckt haben.
Wenn Sie auf ein solches Problem stoßen, bewahren Sie zuerst Ihre lokalen Änderungen auf, damit Sie Ihre Änderungen nicht verlieren.
Danach ... checken Sie Ihren gewünschten Zweig mit dem folgenden Befehl aus:
Angenommen, Sie möchten den Zweig MyOriginalBranch:
git checkout -b someName origin / MyOriginalBranch
quelle
du hast es wahrscheinlich getan
git reset --hard origin/your-branch
.Versuche es einfach
git checkout your-branch
quelle
arbeitete für mich. Es ging nur darum, den Namen von Remote und Zweig explizit anzugeben.
quelle
In meinem Fall habe ich ausgeführt
git status
und festgestellt, dass sich in meinem Arbeitsverzeichnis einige nicht verfolgte Dateien befinden.Ich musste sie nur reinigen (da ich sie nicht brauchte), um die Rebase auszuführen, die ich ausführen wollte.
quelle
Dies funktioniert bei mir. Es wird ein neuer Zweig für den abgetrennten Kopf zugewiesen:
git checkout neuer_zweig_name losgelöster_kopf_garbage_name
quelle
Der abgetrennte KOPF bedeutet, dass Sie sich derzeit in keinem Zweig befinden. Wenn Sie Ihre aktuellen Änderungen beibehalten und einfach einen neuen Zweig erstellen möchten, gehen Sie wie folgt vor:
Anschließend möchten Sie diesen neuen Zweig möglicherweise mit anderen Zweigen zusammenführen. Immer hilfreich ist der Befehl git "a dog" :
quelle