2010-03-18 4 views
6

J'ai créé un dépôt Git local sur mon ordinateur portable, puis j'ai poussé la source vers Heroku en créant une branche distante. Après quelques jours de validations et de poussées, je dois revenir à un commit précédent. Voici ce que j'ai fait.Git checkout <SHA> et Heroku

cd <app root> 
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73 

Quelqu'un m'a dit que faire la caisse a créé un nouvel arbre de travail et non la branche elle-même, quand je poussais les changements de rollback à Heroku, il a dit que tout est à jour et rien a été poussé. Comment puis-je résoudre cette situation? Merci d'avance pour votre aide.

Répondre

8

Lorsque vous extrayez un nom engager directement (en utilisant le hachage SHA-1 de l'objet commit) au lieu de vérifier un nom de branche, vous vous retrouvez avec un « détaché TÊTE". HEAD est le "ref" qui garde la trace de ce qui est actuellement extrait. Il se détache lorsque vous relisez directement un commit au lieu d'une branche (il n'est attaché à aucune branche). Aucune branche n'est mise à jour lorsque vous détachez HEAD du référentiel. Vous pourriez penser à l'état de tête détaché comme si vous aviez une branche anonyme empruntée.


Pour remettre en place la tête de votre dépôt, vous voulez enregistrer le HEAD courant comme une branche et vérifiez que ramifient:

  1. Pour enregistrer le HEAD courant dans une nouvelle branche faire :

    git branch <new-branch-name> 
    
  2. pour remplacer une branche existante, vous devez utiliser --force:

    git branch --force <existing-branch-name> 
    
  3. Rattachez tête de votre référentiel en vérifiant la nouvelle/branche mise à jour:

    git checkout <branch-name> 
    

    (où <branch-name> est le même que <new-branch-name> ou <existing-branch-name>, selon lequel des deux ci-dessus les commandes que vous avez utilisé)

Cette séquence (git branch pour faire un point de ref à la validation HEAD en cours, puis git checkout cette branche mise à jour) portera tout contenu non engagé que vous pourriez avoir dans votre index de travail et/ou arbre.


À l'avenir, si vous voulez «faire reculer la branche courante à certains précédente livraison, vous devez utiliser ce au lieu de détacher votre dépôt de HEAD:

git reset --hard <commit> 

Cela réinitialisera la branche courante (ou votre HEAD détaché, si elle est déjà détachée) au commit nommé, et fait que l'index et l'arbre de travail reflètent ce commit (c'est-à-dire qu'il rejette tout commit depuis le commit spécifié avec tout contenu non-validé). L'état HEAD détaché est utile pour revoir les anciens états, et parfois pour le travail à court terme que vous n'êtes pas sûr de conserver.A part ça, vous voulez probablement l'éviter.

2

Vous souhaitez réinitialiser:

git reset --hard 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73
+0

Merci, cela va retourner l'arbre de travail dans la branche? – Bob

+0

C'est ce que vous auriez probablement dû faire au début, mais cela ne réglera pas votre situation. Si votre TETE est toujours détachée, elle ne sera pas rattachée à une branche. S'il vous plaît voir ma réponse. –

+1

Il va réinitialiser votre tête actuelle à la validation spécifiée. Vous aurez donc besoin de 'git checkout master' (ou de n'importe quelle branche que vous voulez restaurer), puis utilisez la commande' git reset'. – Chris

Questions connexes