web-dev-qa-db-fra.com

Git commit contre tag sans succursale

Si je consulte une version marquée de mon code source sans créer de branche, GIT indique que je ne suis pas associé à une branche du tout. Il est heureux de me laisser apporter des changements et de les vérifier. Où vont ces changements? Si je retourne à "Maître", ils disparaissent (écrasé par ce qui était en maître) et je n'arrive pas à les trouver. Ce qui donne? Si Git me permet de commettre des changements contre ce qui est essentiellement une branche anonyme, je peux sûrement les récupérer?

56
Andrew

Parce que votre commettez-vous n'est pas sur une branche, vous ne pouvez pas le voir dans le répertoire de travail, à moins que vous ne commenciez pas ce que vous valez spécifique, en utilisant son SHA1. Vous pouvez trouver le commit en regardant le reflog qui suit les changements dans ce que vous avez vérifié depuis le repo. Si votre tag était XXX vous verrez quelque chose comme:

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

Cela vous dit le SHA1 que vous devriez avoir à checkout afin de voir votre commis 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 semblait un peu bizarre pour moi au début, jusqu'à ce que je réalisais que git checkout place tous les fichiers de projet à compter d'un commit particulier dans mon système de fichiers (répertoire de travail). En effet, la répertoire de travail agit en tant que navigateur sur le référentiel GIT local. Donc, vos modifications n'ont pas été écrasées dans le référentiel , ils ne sont tout simplement pas affichés dans votre répertoire de travail lorsque vous avez vérifié le maître.

79
Paul

Oui, ils seront sur le reflèvement.

Vous pouvez nommer la succursale à tout moment comme ceci:

git checkout -b my-branch-name
8
Dustin

Sinon, vous pouvez fusionner le besoin de revenir dans le Maître sans une nouvelle branche en trouvant son SHA1 (en utilisant Git Reflog comme ci-dessus), puis:

git checkout master
git merge SHA1
5
gjvis

Pour répondre à la deuxième question, vous utiliseriez GIT RESET --HARD YOURTAGNAME

Quant à ce qui se produirait, vous avez essentiellement forcé votre succursale au tagname et resté sur la même branche. Vos commits dans l'ancienne fourche sont toujours là ... ils sont juste difficiles à voir. Vous devrez peut-être utiliser le reflèvement pour trouver l'ancienne fourche.

0
Clintm