2009-10-19 4 views
79

J'écris des scripts pour mon flux de travail Git.Git: réinitialiser l'autre branche au courant sans passer à la caisse

Je dois réinitialiser une autre branche (existante) à la branche actuelle, sans passer à la caisse.

Avant:

CurrentBranch: commit A 
OtherBranch: commit B 

Après:

CurrentBranch: commit A 
OtherBranch: commit A 

équivalent de

$ git checkout otherbranch 
$ git reset --soft currentbranch 
$ git checkout currentbranch 

(Remarque --soft: Je ne veux pas affecter l'arbre de travail.)

Est-ce possible?

+0

Est-ce que quelqu'un sait si cela est possible dans Egit? – zedoo

Répondre

59

Les flux de travail que vous décrivez ne sont pas équivalents: lorsque vous effectuez reset --hard, vous perdez tous les changements dans l'arborescence de travail (vous pourriez vouloir le faire reset --soft).

Qu'est-ce que vous avez besoin est

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch 
+0

Bien, merci. Je ne veux pas affecter l'arbre de travail. –

+2

Man, je souhaite que cela fonctionne sans les refs/heads/'superflus ... – ELLIOTTCABLE

+32

Une façon beaucoup plus agréable de le faire est' git push. courant: autre'. Cela fonctionne sans 'refs/heads' (/ cc @elliottcable), et cela vous empêche également de mettre à jour la branche extraite. Notez que vous devrez peut-être passer -f (ou utiliser '+ current: other') si la mise à jour n'est pas une avance rapide. –

15

Vous pouvez synchroniser avec cette commande vos branches à tout moment

$ git push . CurrentBranch:OtherBranch -f 

également sans -f il remplacer cet ensemble de commandes

$ git checkout OtherBranch 
$ git merge CurrentBranch 
$ git checkout CurrentBranch 

Cela peut être utile lorsque vous n'avez pas besoin de valider tous vos fichiers dans CurrentBranch et que vous ne pouvez pas passer à un autre b ranchs.

+0

Peut provoquer "remote: erreur: refus de l'avance rapide" – Basilevs

+0

Je ne voudrais pas inclure l'option '-f' sauf si c'est absolument inévitable. Ça marche bien sans ça dans mon cas. – Melebius

140

Set otherbranch pour pointer en même commettre que currentbranch en exécutant

git branch -f otherbranch currentbranch 

L'option -f (force) dit git branchoui, je veux dire vraiment écraser toute référence otherbranch existante par la nouvelle.

De l'documentation:

-f
--force

Reset to if exists already. Without -f git branch refuses to change an existing branch.

+2

C'est la réponse la plus facile. Merci! –

+0

Je reçois 'fatale: impossible de forcer la mise à jour de la branche actuelle. 'En essayant de le faire. –

+3

@FuadSaud c'est parce que vous avez déjà 'otherbranch' extrait. Cette question SO concerne spécifiquement la réinitialisation * d'une autre * branche vers une validation différente (c'est-à-dire ne réinitialisant pas la branche extraite). Ce que vous voulez faire est de réinitialiser la branche actuelle avec 'git reset targetbranch' pour forcer la branche actuelle à être pointée sur' targetbranch'. Ajoutez '--hard' pour forcer l'arbre de travail à ce contenu. Ou '--soft' pour laisser l'index seul et ne changer que la branche elle-même. –

Questions connexes