web-dev-qa-db-fra.com

Réinitialiser / rétablir une branche entière dans un autre état de branches?

J'ai une branche A et une branche B (et quelques autres branches).

Disons que A l'historique des commits ressemble à:

  • commit 5
  • commit 4
  • commit 3
  • ...

Et B historique des commits:

  • un autre commit
  • commit 4
  • fusion d'autres éléments de la branche C (dans la branche B )
  • commit 3
  • ...

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?

16
daniel451

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.

22
Rüdiger Herrmann

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
12
pratZ

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à.

3
RomainValeri