2016-05-29 7 views
1

Ich bin immer in losgelöstem Zustand Kopfzustand. Ich weiß nicht warum und ich weiß nicht, was es ist.Wie kann man vermeiden, in git in losgelösten Kopfzustand zu geraten?

Jedes Mal, wenn ich versuche, von diesem Zustand zu erholen, verliere ich einige Dateien (vom letzten Commit, das ich im losgelösten Kopfzustand gemacht habe).

Ist es möglich, diesen Zustand vollständig zu vermeiden, oder ist es von Entwurf?

+1

'git reflog' ist dein Freund. – AD7six

+0

Vermeiden Sie 'git checkout sha1'. hier könnte sha1 HEAD sein, FETCH_HEAD. Und es gibt einige andere Fälle, die zu einem abgelösten HEAD-Zustand führen. Wenn Sie genau wissen, mit welchem ​​Zweig Sie arbeiten, ist es in Ordnung, im abgetrennten HEAD-Zustand zu bleiben. – ElpieKay

Antwort

2

Freistehendes Kopf Zustand von Design im git existiert und kann normalerweise nicht ausgeschaltet werden. Sie können nur in freistehendem Kopf Zustand erhalten, wenn Sie nach Ihrem Repository klonen, wie diese zum Beispiel

git checkout $specific_commit 

etwas tun, wenn Sie an der Spitze des genannten Zweiges sind master

#1 -> #2 -> #3 
      ^
      master 
      ^
      HEAD 

und Sie tun

git checkout HEAD~ 

das Commit direkt vor was HEAD derzeit zeigt. Dann werden Sie in dem folgenden Zustand am Ende

#1 -> #2 -> #3 
    ^ ^
     |  master 
     | 
     HEAD 

Von diesem Punkt, den Sie in frei stehendem Kopf Zustand sind, das heißt HEAD Punkte zu einem bestimmten begehen und nicht an der Sprungmarke. Zuvor zeigte HEAD auf das Branchenlabel master, welches wiederum auf das spezifische Commit (Astspitze) zeigte. Jetzt, was auch immer Sie commit, werden Sie machen, dass sie auf dem getrennten Zweig sein werden, der kein Zweig-Etikett (d. H. Verweis) hat. Running git branch wird Ihnen sagen, wenn Sie in distanzierten Kopf Zustand.

$ git branch 
* (detached from 60e425a) 
    master 

Hinweis der Stern *, die Ihrem aktuellen Zweig anzeigt. Wenn Sie jetzt einen neuen Commit machen, wird git repo so aussehen.

#1 -> #2 -> #3 
     | ^
     |  master 
     | 
     \----> #5 
      ^
      HEAD 

, wenn Sie jetzt zurück zum Master wechseln, indem git checkout master dann tun HEAD schaltet master und Zweig, der erstellt wurde, wenn Sie #5 erstellt begehen wird nicht mehr jedes Etikett haben, das heißt eine symbolische Referenz #5 zu begehen zu navigieren. Das bedeutet, dass Ihr Commit effektiv verloren geht.

Sie haben also zwei Möglichkeiten.

  1. Wenn Sie nicht in den Zustand losgelöster Köpfe gelangen wollen, tun Sie einfach nicht git checkout $specific_commit. Bleiben Sie immer an der Spitze der gleichnamigen Filiale wie master. Sie können dies überprüfen, indem Sie git branch ausführen.
  2. Wenn Sie sich in dem abgelösten Kopf Zustand zu tun finden und vielleicht Sie bereits verpflichtet gemacht, dass Sie nicht wollen, zu „losen“ dann, als Flow oben vorgeschlagen, müssen Sie wie neue Sprungmarke/Referenz schaffen, so

    git checkout -b myNewBranch

, die das Repository wie so

#1 -> #2 -> #3 
     | ^
     |  master 
     | 
     \----> #5 
      ^
      myNewBranch 
      ^
      HEAD 

Dann aussehen wird, wenn Sie Hexe zurück zu master Sie können immer zurück zum Commit #5 und alle nachfolgenden Commits auf diesem Zweig, indem Sie git checkout myNewBranch tun.

3

Arbeiten Sie nur mit lokalen Niederlassungen und dann werden Sie nie in den gelösten Zustand kommen. Beispielsweise können Sie anstelle von git checkout origin/master do git checkout master && git pull origin master auch Tracking-Optionen für Zweigstellen anzeigen.

zu vermeiden Um Änderungen bereits sitzen in einem frei stehenden HEAD verlieren, erstellen Sie einen Zweig für sie: git branch someNameForTheBranch

+0

Im Moment habe ich 'git checkout master', ich verliere meine Änderungen. Ich möchte sie nicht verlieren. – Dims

+0

@Dims deine Frage war mehr auf, wie man vermeidet, in diesen Zustand zu kommen. Die Wiederherstellung ist etwas anders, siehe das Update meiner Antwort. –

+0

@Dims Nein, Sie verlieren sie nicht. 'git reflog' listet den HEAD-Verlauf auf, in dem Sie den zuletzt gelöschten HEAD finden konnten. – ElpieKay

1

Wenn Sie git checkout sha1 zu tun pflegten, Sie -b Option hinzufügen sollten automatisch einen neuen Zweig zu erstellen, die auf SHA1 begehen und Bewegen auf es.

Die Priorität besteht darin, zu vermeiden, in diesem Zustand zu sein. Wenn Sie die freistehende Kopf Situation korrigieren möchten, können Sie

git stash 
git checkout -b StartingPointOfYourBranch 
git stash pop 

„StartingPointOfYourBranch“ hat eine Referenz sein: SHA1, origin/master ...