2008-12-14 7 views
56

Wenn ich eine markierte Version meines Quellcodes auschecke, ohne eine Verzweigung zu erstellen, zeigt Git an, dass ich überhaupt keiner Verzweigung zugeordnet bin. Es ist schön, mich Änderungen vornehmen zu lassen und sie zu überprüfen. Wohin gehen diese Änderungen? Wenn ich zurück zum "Master" wechsle, verschwinden sie (überschrieben mit dem, was Master war) und ich kann sie nicht mehr finden. Was gibt? Wenn Git mich Änderungen gegen einen im Wesentlichen anonymen Zweig vornimmt, kann ich sie sicher zurückholen?Git Commit gegen Tag ohne Verzweigung

Antwort

79

Weil Ihr begehen ist nicht auf jedem Zweig, Sie es nicht im Arbeitsverzeichnis sehen, es sei denn Sie Prüfung, dass bestimmte verpflichten mit seinem SHA1. Sie können die Festschreibung finden, indem Sie sich die reflog ansehen, die Änderungen in dem verfolgt, was Sie aus dem Repo ausgecheckt haben.

$ git reflog 
7a30fd7... [email protected]{0}: checkout: moving from master to XXX 
ddf751d... [email protected]{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master 
96c3b03... [email protected]{2}: commit: example commit on tag XXX, not on any branch 
7a30fd7... [email protected]{3}: checkout: moving from master to XXX 

, dass Sie die SHA1 erzählt, dass Sie checkout haben, um würde zu Ihrem begehen im Arbeitsverzeichnis zu sehen: Wenn Ihr Tag XXX war werden Sie so etwas wie zu sehen.

$ git checkout 96c3b03 
Note: moving to "96c3b03" which isn't a local branch 
If you want to create a new branch from this checkout, you may do so 
(now or later) by using -b with the checkout command again. Example: 
    git checkout -b <new_branch_name> 
HEAD is now at 96c3b03... example commit on tag XXX, not on any branch 
$ git checkout -b newbranch 
$ git branch    #lists all branches 
    feature1 
    master 
    * newbranch 

schien Dies alles ein wenig seltsam auf den ersten mir, bis ich, dass git checkout Orte alle Dateien Projekt realisiert als eines in mein Dateisystem (Arbeitsverzeichnis) insbesondere begehen. Das Arbeitsverzeichnis fungiert als Browser im lokalen Git-Repository. Ihre Änderungen wurden nicht in dem Repository überschrieben, sie werden nur nicht in Ihrem Arbeitsverzeichnis angezeigt, wenn Sie den Master ausgecheckt haben.

+1

Note to self: Dann 'git checkout master' tun, 'git merge newbranch',' git branch -d newbranch' und 'git push'. – Znarkus

+1

Oder noch einfacher, ohne eine Verzweigung zu erstellen: 'git checkout master' und dann' git merge 96c3b03' (ersetzen durch die korrekte SHA1 gefunden durch 'git reflog') (wie die Lösung von [gjvis bellow] (http://stackoverflow.com)/a/8760749/535203)) –

9

Ja, sie werden in Reflogs sein.

Sie können die Filiale jederzeit wie folgt nennen:

git checkout -b my-branch-name 
0

die zweite Frage beantworten Sie git reset --hard yourtagname

Als für das, was Sie auf dem gleichen Zweig im Wesentlichen gegabelte Ihre Branche passieren würde, an dem Tag-Namen verwenden würden, und blieben. Deine Verpflichtungen in der alten Gabel sind immer noch da ... sie sind nur schwer zu sehen. Möglicherweise müssen Sie den Reflog verwenden, um die alte Verzweigung zu finden.

5

Alternativ können Sie das ohne einen neuen Zweig zurück in Master fusionieren begehen, indem er seine SHA1 zu finden (git reflog wie oben) und dann:

git checkout master 
git merge SHA1