2010-03-11 5 views
3

Je suis relativement nouveau à git et j'ai quelques problèmes tôt. J'ai fait plusieurs engagements, mais quand j'essaie de les pousser, je reçois une réponse qui dit que tout est à jour. Je me sens comme mon problème est le même sur la liste dans this question, mais il formule les recommandations suivantes:Qu'est-ce que git checkout master + git reset --hard do?

$ git log -1 
# note the SHA-1 of latest commit 
$ git checkout master 
# reset your branch head to your previously detached commit 
$ git reset --hard <commit-id> 

À quoi correspond exactement « vérifier le maître » faire? Je veux juste ne pas perdre les changements que j'ai fait ...

capture d'écran de gitk:
enter image description here

+0

Quelle question est "this" question? Vous n'avez pas fourni de lien. –

+0

désolé, voir modifier :) – danwoods

Répondre

3

L'extraction d'une branche déplace le pointeur local HEAD afin qu'il pointe sur le même commit que celui référencé par la branche. Par exemple:

Lorsque sur la branche mybranch (les C s sont commits):

     HEAD 
         | 
         V 
      master  mybranch 
      |   | 
      V   V 
C1 -------> C2 -------> C3 

Après avoir exécuté git checkout master:

  HEAD 
      | 
      V 
      master  mybranch 
      |   | 
      V   V 
C1 -------> C2 -------> C3 

Cela déplace également les fichiers dans votre répertoire de travail tel que requis pour qu'il est un instantané parfait de ce à quoi le projet ressemblait à ce moment-là. Il ne supprime pas ou ne modifie pas les validations, de sorte que vous ne perdrez pas de travail dans une branche en en extrayant un autre. Ce qui s'est passé dans le cas d'une "tête détachée" telle que décrite dans cette autre question est que C3 n'est pas associée à une branche. Afin de résoudre ce problème, vous devez mettre à jour le commit vers lequel pointe la branche master afin qu'il inclue les nouveaux éléments (C3). Extraire master dit à git que vous travaillez maintenant avec la branche master, puis faire un reset dur avec le SHA1 du commit que vous voulez pour être à la pointe de votre branche master met à jour les références de branche à ce que vous voulez.

Edit:

Dans ce cas, une tête détachée était pas la question. Rappelez-vous juste que commettre et pousser sont deux choses différentes dans git. La validation ne communique pas avec un référentiel central comme dans Subversion. Après avoir apporté des modifications à votre répertoire de travail, vous exécutez git add filename une fois pour chaque fichier que vous avez modifié, où filename est le nom du fichier. Une fois que tous les fichiers ont été ajoutés à l'index, vous les validez avec git commit.

Un raccourci pour cela est d'utiliser git commit -a qui ajoutera automatiquement les fichiers modifiés à l'index avant de valider. Cela vous permet d'ignorer les étapes git add. Notez que git commit -a n'ajoutera que fichiers modifiés. Si vous introduisez un nouveau fichier qui n'a jamais été validé, vous devez l'ajouter manuellement avec git add.Une fois votre validation effectuée, vous pouvez exécuter git push pour envoyer cette validation à votre référentiel distant et mettre à jour les branches distantes. Cela ne fait que de la communication à distance. Contrairement à Subversion, le commit lui-même est géré localement, sans aucune interaction avec le serveur.

+0

Alors, pardonnez-moi si je suis lent, quand je vérifie le maître tous mes fichiers reviendront à la façon dont ils étaient avant les changements et les commits, mais quand je le pousse, tout va bien mettre à jour; Est-ce exact? – danwoods

+0

En supposant que vous exécutez les commandes que vous avez mentionnées dans votre question entre vérifier le maître et le pousser. Lorsque vous appuyez sur, git envoie toutes les validations de votre branche maître locale qui n'existent pas encore dans la branche principale distante. Ensuite, il met à jour le pointeur de branche distante 'origin/master' pour pointer sur le même commit que votre' master' local. –

+0

J'ai exécuté les trois commandes de l'autre poste et je suis toujours en train de dire que tout est à jour – danwoods

-1

git checkout master est de changer votre zone de travail à la branche maître également connu sous le nom tronc dans un autre système de contrôle de version.

+0

Mes "working are"? Est-ce que cela écrase tout changement? – danwoods

+0

Un peu large, je pense qu'il vaut la peine de mentionner ce que «reset» fait pour répondre à une question. – electblake

Questions connexes