J'ai une branche A et une branche B (et quelques autres branches).
Disons que A l'historique des commits ressemble à:
Et B historique des commits:
Fondamentalement, ce que je veux, c'est "supprimer" toutes les modifications apportées par les validations certaines autres validations et fusion d'autres éléments de la branche C vers la branche B .
Je veux que l'arbre de travail de la branche B soit exactement le même que la branche A 'arbre de travail.
Comment puis-je y parvenir?
Une façon d'y parvenir est d'utiliser git reset
. Sur la branche B
exécutez
git reset --hard A
Par la suite, la branche B
pointe vers le head-commit de A
. L'option --hard
Réinitialise l'index et l'arborescence de travail afin que tous les fichiers suivis soient réinitialisés à la version dans la branche A
. L'ancien HEAD commit-ID de A
est stocké dans .git/ORIG_HEAD
Afin de permettre d'annuler la modification.
Alternativement - sans être sur la branche B
- vous pouvez supprimer la branche B
et la recréer comme ceci:
git branch -d B # delete branch B
git branch B A # re-create branch B and let it point to the commit of branch A
Autre que la première suggestion, cela laissera l'index et l'arbre de travail intacts.
Si vous voulez que votre branche B
ressemble exactement à la branche A
. Vous pouvez simplement faire un reset --hard
git checkout branch-B
git reset --hard branch-A
Attention, vous perdrez des commits dans ce cas. Votre branche-B ressemblera exactement à la branche-A, quelles que soient les validations de la branche-B qui n'étaient pas présentes dans la branche-A, elles seront perdues. De plus, si la branche B est partagée avec d'autres personnes, il n'est pas recommandé d'effectuer cette opération.
Dans ce cas, vous pouvez essayer de rétablir les commits que vous ne voulez pas dans la branche-B
git revert <sha-of-"some other commit">
git revert <sha-of-"merge of other stuff from branch C (into branch B)">
Le deuxième commit ressemble à un commit de fusion, vous devrez peut-être également passer le parent.
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1
Pour terminer, ajoutons cette manière très simple d'y parvenir:
git branch -f branchB branchA
Il tire parti du fait que les branches dans git ne sont que de simples pointeurs. Cette commande remplace simplement la référence à la validation de pointe d'une branche par une autre. Pas besoin de procéder à des changements de structure complexes pour construire quelque chose que vous avez déjà.