2010-11-04 4 views
5

Je ne connais pas très bien Git et pour l'un de nos dépôts, j'ai fait une erreur. J'ai validé et poussé les changements à une branche nommée "core". Mais ensuite j'ai réalisé que mes changements ne devraient pas être là - j'aurais dû créer une nouvelle branche plusieurs révisions il y a, disons, "core-experimental".Git se ramifiant à partir d'une ancienne révision et annulant la branche actuelle

Pour expliquer, j'ai:

A---B---C---D---E  "core" 

Mais maintenant, je veux changer pour

A---B    "core" 
    \ 
    C---D---E  "core-experimental" 

Personne d'autre dans mon équipe a tiré mes changements encore, de sorte que toute Revient je shouldn ne provoque pas de douleur à personne.

Est-ce possible pour Git?

Répondre

9

Les deux autres réponses fonctionnent très bien, mais vous pouvez réellement éviter d'avoir à rien faire dans votre arbre de travail:

# create core-experimental using core as starting point 
git branch core-experimental core 
# move core 
git branch -f core <SHA1 of B> 

De cette façon, vous pouvez faire même si vous avez des modifications locales dans l'arbre de travail, et sans mettre à jour un tas d'horodatages lors du checkout/reset qui vous obligera à reconstruire (en supposant qu'il s'agit d'un projet compilé).

+0

Agréable, c'est le genre de petit extra qui polit mon git-fu – Benjol

+0

J'utilise Ruby/Python/non-compilé, donc je joue avec des timestamps de fichiers loosey-goosey w/file; cette suggestion est meilleure. –

+0

@Adam: Oui, je ne suis jamais sûr. Parfois, un 'reset --hard' est libre, parfois dans un grand projet compilé, le reset/checkout prend 20 secondes et force une compilation de 10 minutes. Une autre distinction: le 'reset' mettra dans les reflogs" : mise à jour HEAD ", tandis que le' branch -f' mettra "branche: Reset à ". – Cascabel

6
git checkout core 
git branch core-experimental 
git reset --hard <SHA of B> 
git push -f <remote> core 

Ou plus descriptivement ...

  1. Commander noyau
  2. Créer la branche expérimentale à la tête du noyau
  3. Réinitialiser la tête de coeur à l'endroit où vous voulez
  4. Force une simple pression sur le noyau de mise à jour
+0

Cela a bien fonctionné, même avec le noyau poussé à l'origine (que j'avais, contrairement à l'interrogateur). –

1

In cœur:

git branch core-experimental 
git reset --hard <revision-B> 

Et puis:

git push -f 
Questions connexes