Mit git log
habe ich eine alte Version meines Projekts gefunden, mit der ich mich anlegen wollte. Ich habe git checkout version52
verursacht, dass das Projekt in einem ' losgelösten Zustand war, einige Änderungen vorgenommen und dann git commit
darauf gesetzt. Ich wusste nicht, dass dies in einem losgelösten Zustand geschehen würde.
Danach bin ich mit git checkout master
zu meinem Master zurückgekehrt, aber wenn ich git log
mache, erscheinen meine Änderungen nicht mehr. Ich merke jetzt, dass die Änderungen in meinem version52
hängen bleiben.
Ich kann diese Änderungen leicht genug mit git merge version52
erreichen, aber ich habe mich nur gefragt, was ist der Sinn, in detachierten Zuständen in Git zu begehen? Als Neuling hat mich das für eine Weile verwirrt und ich verstehe nicht, warum es erlaubt ist oder wann ich ein solches Feature verwenden soll.
EDIT: Sorry, ich habe vorher "disconnected" geschrieben, aber ich meinte "detached". In git geschieht dies, wenn Sie sich entscheiden, eine zuvor eingecheckte Version Ihres Projekts anzuzeigen.
Für die Zukunft sollten Sie eine Verzweigung erstellt haben, um abzuarbeiten
%Vor%oder
%Vor%Nach dem Kommentar bearbeitet
Das git-Objektmodell, das ich über hier geschrieben habe, verfolgt einfach a Baum der Objekte. Ein Zweig ist ein Zeiger auf ein Commit. Obwohl die beiden verwandt sind, muss kein Zweig auf die Spitze einer Linie von Commits zeigen.
Wenn Sie ein Commit erstellen, erstellen Sie immer noch eine Baumstruktur mit Objekten, die im Repository existieren, bis es alt wird und Sie git-gc ausführen, um diese verwaisten Commits zu bereinigen. Ich denke, was Sie befürchten ist, dass es keine erzwungene Verpflichtung in einer Zweigniederlassung gibt. Dies schafft Flexibilität in dem Tool, das manchmal Benutzer ausspioniert, aber Git ist ein erweitertes Tool.
In Ihrem Fall haben Sie einen Commit gemacht und sind dann zu Ihrem Master-Zweig zurückgekehrt und Sie dachten, Sie hätten Ihre Commits verloren, aber wenn Sie sich die Ausgabe von git reflog
angeschaut hätten, würden Sie sogar den Sha des Commits sehen, den Sie erstellt haben obwohl es nicht auf einem Zweig war. Sie hätten hier eine Abzweigung von git branch branchName <sha of commit>
erstellen können. Oder Sie hätten diese Commits mit / auf einen anderen Zweig zusammenführen oder rebasieren können, ohne die zusätzlichen Schritte des Erstellens und Löschens eines Zweiges nur dafür auszuführen. Okay, das sind nur ein paar zusätzliche Schritte mit nur ein paar Tastenanschlägen; aber es ist in einigen Fällen nützlich.
Die Sache ist, dass ein Zweig nur eine Kurzform zu einem Baum von Commits ist, genauso wie ein Tag eine Kurzschrift zu einem bestimmten Commit ist. Nur wenn Sie in einem Zweig Commits machen, bewegt sich der Verzweigungszeiger zusammen mit dem letzten Commit.
Es gibt immer den head
-Zeiger, der auf den letzten Commit zeigt, den Sie ausgecheckt haben, so dass Sie nie wirklich 'getrennt' sind.
Das Commit zu einem eigenständigen Kopf ist ziemlich nutzlos, wird aber auch während des interaktiven Rebasings verwendet, mit dem Sie den Verlauf eines Baumes neu schreiben können, wenn Sie einen Commit zum Bearbeiten markieren.
Nachdem Git während des Rebasens einen solchen Commit erreicht hat, wird der Prozess gestoppt und Sie können diesen Commit mit git commit --amend
ändern oder sogar neue Commits einfügen, wie Sie es normalerweise tun. Am wichtigsten ist, dass solche Commits zu keiner Verzweigung gehören, wie git status
deutlich zeigt, also verpflichten Sie sich zu einem losgelösten Kopf.
Viele Git-Benutzer, mich eingeschlossen, denken, dass interaktives Rebasieren eines der nützlicheren Git-Features ist und es würde nicht funktionieren, wenn es unmöglich wäre, sich an einen getrennten HEAD zu binden.
Sie scheinen über die Versionskontrolle etwas verwirrt zu sein - Sie machen jedes Mal ein Commit, wenn Sie eine Änderung vornehmen, die funktioniert und Ihre Tests besteht. Normalerweise mache ich ungefähr einmal pro Stunde ein Commit - es gibt mir einen bekannten Zustand, zu dem ich zurückkehren kann, und gibt mir etwas gegen etwas anderes. Ob du "verbunden" bist oder nicht, ist weder hier noch dort.
Tags und Links git