2010-05-27 11 views
39

Le titre n'est pas très clair. Ce que je dois vraiment faire est souvent la suivante:Comment faire pour reculer une branche dans git?

Disons que j'ai un développement en cours avec plusieurs commits c1, c2, ... et 3 branches A, B, C

c1--c2--c3--(B)--c4--(A,C) 

Direction A et C sont au même commit.

Maintenant, je veux la branche A pour revenir où B est, de sorte qu'il loks comme ceci:

c1--c2--c3--(A,B)--c4--(C) 

important est que cela doit se localement et sur GitHub.

Répondre

58

Utilisez la sous-commande de réinitialisation:

git checkout A 
git reset --hard B 
git push --force github 

En tant que sidenote, vous devez être prudent lors de l'utilisation git reset alors qu'une branche a été poussé ailleurs déjà. Cela peut causer des problèmes à ceux qui ont déjà vérifié vos changements.

+3

S'il y a des commits sur la branche A, ils seront perdus par 'git reset --hard B'. S'il y a des validations sur la branche A, alors vous devriez utiliser 'git rebase' pour relocaliser la branche. –

+0

Quel problème exactement pourrait-il causer? –

+0

Vous pouvez jeter une tête de branche que vous avez poussé vers le serveur et qui est tirée par d'autres pendant ce temps. Le serveur ne peut pas construire au-dessus de cette tête enlevée (donc la poussée doit être forcée). Et de même, les développeurs pairs doivent également forcer une traction qui peut être indésirable. –

22

S'il n'y a aucun commits sur la branche A, alors le git reset --hard Bsolution given by Bram Schoenmakers fonctionnera.

Cependant, s'il y a des commits sont branche A qui doit être préservé, alors ce qui suit devrait faire l'affaire:

  1. Faites une copie de sauvegarde de votre repo (juste au cas où)
  2. git checkout A
  3. git rebase -i --onto B SHA1-A^

... où SHA1-A^ est le commit id du parent de votre branche APour plus de détails, reportez-vous au git rebase man page.

REMARQUE: Ceci va réécrire l'historique (comme le fait toujours le rebasage). Une considération spéciale devrait être faite si votre branche A a déjà été poussée à un dépôt public.

1

Supprimez la branche localement et à distance, recréez la branche, repoussez la branche vers le serveur.

git branch -d A 
git push origin :heads/A 
git branch B A 
git push origin A:A 

Alternativement, vous pouvez utiliser la commande suivante pour annuler cette dernière validation.

git revert c4 

qui fera de votre timeline ressembler à:

c1--c2--c3--(B) 
      \ 
       c4--(C) 
       \ 
       (^c4)--(A) 

(^c4) est un commettras que

défait c4

Je ne recommande pas d'utiliser rebase ou revert sur une branche qui a été poussé à un dépôt à distance, ils peuvent causer des tonnes de problèmes pour vous ou toute autre personne utilisant ce repo.

+0

Supprimer et recréer la branche distante causera également beaucoup de problèmes pour toute personne utilisant le repo, cependant. (Comme j'ai appris de l'expérience douloureuse.) – ebneter

+0

Quel est le problème? Je fais ça tout le temps et ça ne cause jamais de problèmes, mais maintenant je me demande si j'ai juste eu de la chance. – kubi

3

J'utilise généralement cette séquence et trouve la façon la plus simple:

git checkout B 
git branch -f A B 
Questions connexes