Derzeit führe ich den Befehl aus, um zu einem anderen Git-Commit zu wechseln (im selben Zweig ... eigentlich im Hauptzweig!)
git checkout ea3d5ed039edd6d4a07cc41bd09eb58edd1f2b3a
Jetzt sagt mir jedes Mal, wenn ich diesen Idioten mache, dass ich jetzt einen abgetrennten Kopf habe. Wie gehe ich zu einem älteren Commit und behalte den Kopf immer noch im selben Zweig?
git
version-control
verschlungenes Elysium
quelle
quelle
git checkout
wird HEAD durch einen anderen Commit- oder Zweignamen an diesen neuen Ort verschoben).git revert --no-commit 0766c053..HEAD
bleibt (z. B. um zu einem älteren Commit zurückzukehren): Führen Sie dies aus, wo0766c053
sich das Commit befindet, das Sie auschecken möchten. Dies ist von stackoverflow.com/a/21718540/525872 .Antworten:
Die meiste Zeit, wenn ich das mache, checke ich zu einem temporären Zweig aus:
Nachdem ich fertig bin, lösche ich einfach den Zweig
quelle
Dies hängt davon ab, was Sie beim Auschecken dieses Commits tun möchten. Wenn Sie es nur auschecken, um diese Revision zu erstellen oder zu testen, ist es nichts Falsches, mit einem abgenommenen Kopf zu arbeiten. Denken Sie daran, einen tatsächlichen Zweig zu überprüfen, bevor Sie Commits vornehmen (
git checkout master
, z. B.), damit Sie keine Commits erstellen, die in keinem Zweig enthalten sind.Wenn Sie jedoch ab diesem Punkt mehr Commits durchführen möchten, sollten Sie einen Zweig erstellen. Wenn Sie Commits ausführen, auf die nicht von einem Zweig verwiesen wird, können diese leicht verloren gehen und werden schließlich vom Garbage Collector von git bereinigt, da sich nichts auf sie bezieht. Sie können einen neuen Zweig erstellen, indem Sie Folgendes ausführen:
Zur besseren Veranschaulichung finden Sie hier einige Diagramme, die zeigen, wie sich die Arbeit an einem abgetrennten Kopf von der Arbeit an einem Zweig unterscheidet.
Beginnen wir mit 3 Commits auf
master
, A, B und C.master
ist der aktuelle Zweig, zeigt alsoHEAD
aufmaster
die Punkte, auf die C festgeschrieben werden soll.Wenn wir jetzt ein Commit durchführen, erstellt git ein Commit mit C als übergeordnetem Element (da dies das aktuelle Commit ist, auf das von
HEAD
via verwiesen wirdmaster
) und wird aktualisiertmaster
, um auf dieses neue Commit zu verweisen. Alle unsere Commits sind jetzt inmaster
undHEAD
verweisen auf das neue Commit durchmaster
.Schauen wir uns jetzt B an und geben uns eine freistehende
HEAD
.Hier funktioniert alles gut; Wir können uns alle Dateien ansehen, unser Programm erstellen, es testen usw. Wir können sogar neue Commits erstellen. Wenn wir dies tun, gibt es keinen Zweig, in dem wir uns befinden, sodass wir keinen Zweig auf dieses neue Commit verweisen können. Das einzige, was darauf hinweist, ist
HEAD
:Wenn wir uns später dazu entschließen,
master
erneut auszuchecken, wird sich nichts auf E beziehen.Da sich nichts darauf bezieht, kann es schwierig sein, sie zu finden, und git betrachtet Commits ohne Verweise als abgebrochen (sie treten häufig auf, wenn Sie Patches neu erstellen, Squash-Squashs ausführen oder andere lustige Verlaufsmanipulationen durchführen; sie stellen normalerweise verlassene Patches dar; das interessiert dich nicht mehr). Nach einer bestimmten Zeit betrachtet git es als Müll, der beim nächsten Ausführen der Garbage Collection verworfen wird.
Anstatt eine bloße Revision auszuchecken und einen abgetrennten Kopf zu erhalten, sollten Sie, wenn Sie das Gefühl haben, mehr Commits zu machen
git checkout -b branch B
, einen Zweig erstellen und ihn auschecken. Jetzt gehen Ihre Commits nicht verloren, da sie in einem Zweig enthalten sind, auf den Sie leicht verweisen und der später zusammengeführt werden kann.Wenn Sie dies vergessen und Commits außerhalb eines Zweigs erstellen, müssen Sie sich keine Sorgen machen. Sie können einen Zweig erstellen, der auf die Kopfrevision mit verweist
git checkout -b branch
. Wenn Sie bereits wieder in denmaster
Zweig gewechselt sind und feststellen, dass Sie ein Streu-Commit vergessen haben, können Sie es mithilfe vongit reflog
finden. Dies zeigt Ihnen einen Verlauf dessen, worauf CommitsHEAD
in den letzten Tagen hingewiesen haben. Alles, was sich noch im Reflog befindet, wird nicht als Müll gesammelt, und Referenzen werden im Allgemeinen mindestens 30 Tage lang im Reflog aufbewahrt.quelle
HEAD
Ref haben, der direkt auf einen SHA-1 eines Commits zeigt, anstatt auf einen Zweig, der wiederum auf einen Commit zeigt. Da Ihr Kopf nicht auf einen Zweig verweist, weiß Git nicht, welcher Zweig aktualisiert werden soll, wenn Sie neue Commits hinzufügen. Wie ich zu Beginn meiner Antwort erklärt habe, ist es vollkommen in Ordnung, einen abgetrennten Kopf zu haben, wenn Sie zu einer alten Version zurückkehren, nur um den Code zu erstellen oder zu testen. Sie können jederzeit zu einer Niederlassung mitgit checkout master
oder dergleichen zurückkehren. Es ist nur ein Problem, wenn Sie sich verpflichten, während Sie einen abgetrennten Kopf haben.Wenn Sie einfach zu einem früheren Commit zurückkehren möchten, um damit zu spielen, ohne Änderungen vorzunehmen, können Sie dies tun
Nach diesem Befehl befinden Sie sich in einem Zweig mit dem Namen "(kein Zweig)".
Bestätigen Sie dies mit
Nachdem Sie mit diesem zuvor festgeschriebenen Code gespielt haben, können Sie zu dem Zweig wechseln, in dem Sie sich befanden
Das "(kein Zweig)" wird automatisch gelöscht. Auf diese Weise müssen Sie keinen temporären Zweig erstellen.
quelle
Gits HEAD ist einfach ein Zeiger, der sagt, was sich im Arbeitsverzeichnis befindet. Wenn Sie ein Commit auschecken möchten, das nicht der Leiter eines Zweigs ist, müssen Sie einfach Ihren HEAD umleiten, um auf dieses Commit zu verweisen. Daran führt kein Weg vorbei. Sie können bei diesem Commit einen temporären Zweig erstellen, aber HEAD wird trotzdem vom Master weggeleitet.
Das ist die kurze Erklärung. Die folgende Ausführlichkeit hilft hoffentlich dabei, zu verstehen, wie sich HEAD und Master unterscheiden:
Normalerweise sieht es so aus:
Das heißt: „Das übergeordnete Element von C ist B und das übergeordnete Element von B ist A. Der Zweigmaster zeigt auf C, und ich habe derzeit den Inhalt des Masters überprüft. Wenn ich mich verpflichte, wird der Master außerdem aktualisiert. “
Darin sind einige Annahmen enthalten, die für ein gründliches Verständnis des Festschreibungsgraphen erforderlich sind. Commits beziehen sich nämlich nur auf ihre Eltern, und der Inhalt eines Zweigs sind jene Commits (und nur jene Commits), die durch Folgen der übergeordneten Links erreicht werden können. Der (unveränderte) Inhalt des Arbeitsbaums und des Index muss dem von HEAD benannten Commit entsprechen, entweder indirekt ("symbolisch") oder direkt ("getrennt").
Wenn Sie also ein altes Commit auschecken möchten, muss der HEAD aktualisiert werden, um auf das gewünschte Commit zu verweisen.
git-checkout
macht genau das:Jetzt haben Sie Ihren Zweig hinter sich gelassen, da Sie etwas Altes betrachten. Das ist vollkommen in Ordnung, wie der Ratschlag „losgelöster Kopf“ Ihnen ruhig sagt (Hervorhebung von mir):
Auf der anderen Seite hat das Zurücksetzen Ihres Zweigs auch HEAD dort, wo es sein muss, aber es hätte einen ganz anderen Effekt!
Das Commit C wird zu Müll, da Sie erklärt haben, dass Sie nicht mehr möchten, dass es Teil des Hauptzweigs ist.
Kurz gesagt, alles, was Sie tun müssen, ist zu verstehen, was Git unter „HEAD“ versteht - es ist dort, wo Sie sind, nicht dort, wo sich ein bestimmter Zweig befindet. Und wenn Ihr Standort nicht mit dem eines Zweigs identisch ist, haben Sie keine andere Wahl, als einen abgetrennten KOPF zu verwenden.
(Vielleicht schauen Sie auch in GitHub, gitk oder gitweb nach, um den Commit-Verlauf zu durchsuchen, wenn Sie weiterhin entgleist sind.)
quelle
Die Frage ist etwas vage, aber wenn Sie nur Dateien in Ihrem Arbeitsbaum ändern möchten, können Sie dies einfach tun:
git checkout [commit|branch] -- .
Sie können dann die Änderungen vornehmen und auf Wunsch ein neues Commit erstellen. Das ist manchmal ziemlich nützlich.
quelle
Ich glaube ich verstehe deine Fragen. Hier ist, was ich gefunden habe, um es zu lösen. und es gibt keine GUI-Lösung dafür, Sie können nur den Befehl verwenden, um es zu lösen, und es ist wirklich einfach.
Schritt 1: Erstellen Sie ein Tag des alten Commits, zu dem Sie zurückkehren möchten.
wie Tag v2.0
Schritt 2: Git Checkout v2.0
Hier ist es, jetzt zeigt Ihr HEAD auf 'v2.0' Commit, aber der Master zeigt immer noch auf das letzte Commit.
C:\Program Files\Git\doc\git\html\git-checkout.html
Dieses Dokument kann Ihnen helfenoder geben Sie git help <check> ein
quelle