2010-12-17 3 views
8

Mit git log habe ich eine alte Version meines Projekts gefunden, mit der ich mich anlegen wollte. Ich tat git checkout version52 verursacht das Projekt zu sein in einem 'abgelöst' Zustand, machte einige Änderungen, dann tat git commit auf es. Ich wusste nicht, dass dies in einem abgetrennten Zustand geschehen würde.Warum sollte `git commit` im losgelösten Zustand verwendet werden?

Danach ging ich zurück zu meinem Master mit git checkout master aber wenn ich mache git log meine Änderungen nicht mehr angezeigt. Ich merke jetzt, dass die Änderungen in meinem version52 stecken bleiben.

Ich kann diese Änderungen leicht genug mit git merge version52 bekommen, aber ich frage mich nur, was ist der Punkt in der Lage sein, in detached states 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 eine solche Funktion verwenden soll.

EDIT: Sorry, ich schrieb "getrennt" zuvor, aber ich meinte "gelöst". In git geschieht dies, wenn Sie sich entscheiden, eine zuvor eingecheckte Version Ihres Projekts anzusehen.

+0

dies ist eine Frage für Super User, nein? – yoda

+0

Was ist ein getrennter Zustand - beziehen Sie sich auf einen abgetrennten HEAD? –

+0

Ja, tut mir leid, ich meinte "freistehend" – Lan

Antwort

6

Für die Zukunft sollten Sie einen Zweig erstellt haben

git branch branchName version52 
git checkout branchName 

oder

git checkout -b brannchName version52 

Herausgegeben nach Kommentar abzuarbeiten

Das git-Objektmodell, das ich geschrieben habe, etwa here, verfolgt einfach einen Baum von Objekten. Ein Zweig ist ein Zeiger auf ein Commit. Obwohl die beiden verwandt sind, müssen Sie keinen Zweig haben, der auf die Spitze einer Zeile von Commits zeigt.

Wenn Sie ein Commit erstellen, erstellen Sie noch eine Baumstruktur von 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 für Commits in einer Branche 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 die Ausgabe von git reflog betrachtet hätten, würden Sie die sha des Commits sehen, das Sie erstellt haben Es war nicht auf einem Ast. Sie hätten hier eine Verzweigung 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 eine Verzweigung nur eine Kurzform zu einem Baum der Commits ist, so wie ein Tag eine Kurzschrift zu einem bestimmten Commit ist. Nur wenn Sie bei einem Zweig Commits machen, bewegt sich der Zweigzeiger mit dem letzten Commit.

Es gibt immer die head Zeiger, die spätestens Punkte verpflichten, dass Sie ausgecheckt haben, so dass Sie nie wirklich ‚getrennt‘

+0

nützlich auch bei der Arbeit an einem Team – yoda

+0

Ja, ich weiß jetzt, das ist was ich getan hätte. Aber gibt es Zeiten, in denen es sich als nützlich erweist, in einen losgelösten Zustand zu gehen? – Lan

-3

Sie scheinen ein bisschen verwirrt über die Versionskontrolle - Sie machen jedes Mal einen 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 Sie "verbunden" sind oder nicht, ist weder hier noch dort.

+0

Ich denke, Sie haben die Frage missverstanden. Er spricht davon, dass sich seine Geschichte in einem nicht verbundenen Zustand befindet, nicht dass er nicht mit seinem Quellcode-Kontrollserver verbunden ist. – Abizern

+0

Sorry, meine Schuld für das Schreiben "getrennt" statt "getrennt" in meiner ursprünglichen Frage. – Lan

3

auf eigenem einen frei stehenden Kopf Begehen sind ziemlich nutzlos, aber es ist auch Wird während der interaktiven Umbasierung verwendet, mit der Sie den Verlauf eines Baums 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 keinem Zweig gehören, wie git status deutlich zeigt, so dass Sie sich zu einem abgetrennten Kopf verpflichten.

Viele Git-Benutzer, mich eingeschlossen, denken, dass interaktive Neufassung eine der nützlicheren Git-Funktionen ist und es würde nicht funktionieren, wenn es unmöglich wäre, zu einem getrennten HEAD zu kommen.

Verwandte Themen