Git: annuler toutes les modifications sur une branche locale divergente

117

J'ai une branche thématique locale qui suit une branche distante. Par souci d'argumentation, disons que les historiques de commit ressemblent à ceci:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Après avoir examiné les historiques de validation relatifs, je veux maintenant annuler toutes les modifications apportées à la phobosbranche locale et en faire une copie directe de origin/phobos, de sorte que l'histoire locale ressemble à ceci:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Je ne veux vraiment pas que les changements locaux soient apportés à la phobosbranche, et je ne veux vraiment pas que des fusions apparaissent dans le référentiel d'origine par la suite. (Donc, la fusion n'est pas ce que j'ai en tête.)

Cela semble être très simple, mais mon google-fu m'a échoué. Comment puis-je faire cela?

Electrons_Ahoy
la source

Réponses:

79

Supprimez la branche, puis recréez-la:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
mipadi
la source
37
Un problème avec cette approche par rapport à la réinitialisation de la tête de la branche, est que la suppression de la branche emporte le reflog de la branche. La réinitialisation de la branche, par contre, préserve non seulement le reflog, mais enregistre en fait la réinitialisation dans le reflog. Cela rend l'opération facilement réversible plus tard, si nécessaire.
Dan Molding
9
@Electrons_Ahoy Je vous suggère de changer la réponse acceptée ici en celle de Dan (afin que les gens comme moi qui ont cherché sur Google comment le faire soient susceptibles de choisir la méthode la plus sûre).
Steve Chambers
4
La réponse de @ DanMoulding n'implique pas la suppression d'une succursale locale lorsqu'elle n'est pas nécessaire. C'est beaucoup plus sûr.
brma
@brma: Comment ça? Il ne fait que pointer une branche vers un nouveau commit.
mipadi
5
La réponse de Dan Moulding est plus sûre. Je pense que vous devriez sélectionner celui-là.
Daniel Apt
331
git checkout phobos
git reset --hard origin/phobos

Cela indique à Git de réinitialiser la tête de phobossur le même commit que origin/phobos, et de mettre à jour l'arbre de travail pour qu'il corresponde.

Moulage Dan
la source
35
OMI ceci devrait être la réponse acceptée; il émet la commande "reset" pour transplanter le pointeur de branche, au lieu d'effectuer une intervention chirurgicale avec suppression / recréation.
vdboor
En fait, j'ai essayé celui-ci en premier et il a jeté une tonne d'erreurs faisant par copie locale presque inutilisable. Supprimer / recréer était peut-être moins élégant, mais je n'ai pas eu à poser de questions complémentaires.
Electrons_Ahoy
3
@Electrons_Ahoy: Hmm, ce n'est certainement pas normal. Cette réinitialisation devrait normalement être une opération sans problème si votre dépôt est en bon état de fonctionnement.
Dan Moulding
ou même si c'est hinky. Utilisez git reflog pour trouver le chemin de votre domicile si vous avez "accidentellement" émis cette commande sans lire réellement ce qu'elle fait. :)
dbn
Cela fonctionne également si vous êtes sur la branche et que vous l'avez gâchée localement.
slott le