2008-12-14 6 views
56

Si je consulte une version balisée de mon code source sans créer de branche, Git indique que je ne suis associé à aucune branche. Je suis heureux de me laisser faire des changements et de les vérifier. Où vont ces changements? Si je reviens à 'master' ils disparaissent (écrasés par ce qui était en master) et je n'arrive pas à les retrouver. Ce qui donne? Si Git me laisse commettre des changements contre une branche essentiellement anonyme, je peux sûrement les récupérer?Git commettre contre tag sans branche

Répondre

79

Parce que votre Commit est pas sur une branche, vous ne pouvez pas le voir dans le répertoire de travail, sauf si vous passez commande commit spécifique , en utilisant son SHA1. Vous pouvez trouver le commit en regardant le reflog qui suit les changements dans ce que vous avez extrait du repo. Si votre balise était XXX vous verrez quelque chose comme:

$ 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 

qui vous indique la SHA1 que vous auriez à checkout afin de voir votre commettras dans le répertoire de travail.

$ 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 

Tout cela me semblait un peu bizarre au début, jusqu'à ce que je compris que checkout git place tous les fichiers du projet que d'un particulier commettras dans mon système de fichiers (répertoire de travail). En effet, le répertoire de travail agit comme un navigateur sur le référentiel Git local. Ainsi, vos modifications n'ont pas été remplacées dans le référentiel, elles n'apparaissent tout simplement pas dans votre répertoire de travail lorsque vous avez extrait le fichier maître.

+1

Note à moi: Ensuite, faites 'git checkout master', 'git merge newbranch',' git branche -d newbranch' et 'git push'. – Znarkus

+1

Ou encore plus simple sans créer de branche: 'git checkout master' puis' git merge 96c3b03' (remplacez par SHA1 correct trouvé par 'git reflog') (comme solution par [gjvis bellow] (http://stackoverflow.com/a/8760749/535203)) –

9

Oui, ils seront dans les reflogs.

Vous pouvez nommer la branche à tout moment comme celui-ci:

git checkout -b my-branch-name 
0

Pour répondre à la deuxième question que vous souhaitez utiliser git reset --hard yourtagname

Quant à ce qui vous arrive essentiellement fourchue votre branche au tagname et est resté sur la même branche. Vos engagements dans la vieille fourchette sont toujours là ... ils sont juste difficiles à voir. Vous devrez peut-être utiliser le reflog pour trouver la vieille fourchette.

5

Vous pouvez fusionner le commettras dans master sans une nouvelle branche en trouvant son SHA1 (en utilisant reflog git comme ci-dessus), puis:

git checkout master 
git merge SHA1 
Questions connexes