Réinitialiser une autre branche à l'état actuel sans paiement


110

J'écris des scripts pour mon workflow Git.

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

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?


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

Réponses:


84

Les flux de travail que vous décrivez ne sont pas équivalents: lorsque vous effectuez, reset --hardvous perdez toutes les modifications de l'arborescence de travail (vous voudrez peut-être les apporter reset --soft).

Ce dont tu as besoin c'est

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

3
Mec, je souhaite que cela fonctionne sans le superflu refs/heads/
ELLIOTTCABLE

41
Une manière beaucoup plus agréable de faire ceci est git push . current:other. Cela fonctionne sans refs/heads(/ cc @elliottcable) et 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.
Lily Ballard

4
Vous pouvez également utiliser l' -m 'some text'argument pour enregistrer la raison pour laquelle la mise à jour de la référence doit être affichée par une git reflog OtherBranchcommande, telle que «synchronisé avec CurrentBranch». Il peut être utile de se rappeler pourquoi vous l'avez fait plus tard.
Levi Haskell du

18
Pourquoi utiliseriez-vous git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchou git push . CurrentBranch OtherBranchquand vous pourriez utiliser le nettoyant beaucoup (IMO) à la git branch -f OtherBranch CurrentBranchplace? (Voir ma réponse sur git branch -f ci-dessous)
Colin D Bennett

1
@BenHymers Donc la page de manuel de "git push" est un putain de mensonge. Il décrit la commande comme "Mettre à jour les références distantes ...". alors qu'en fait, il peut très bien mettre à jour les références locales.
Kaz

228

Définir otherbranchpour pointer vers le même commit qu'en currentbranchexécutant

git branch -f otherbranch currentbranch

L' -foption (force) dit git branch oui, je veux vraiment écraser toute otherbranchréférence existante par la nouvelle .

De la documentation :

-f
--force

Réinitialiser si existe déjà. Sans -f, git branch refuse de changer une branche existante.


6
C'est la réponse la plus simple. Merci!
Robert Karl

Je reçois fatal: Cannot force update the current branch.en essayant de faire ça.
Fuad Saud

4
@FuadSaud c'est parce que vous avez déjà otherbranchvérifié. Cette question SO concerne spécifiquement la réinitialisation d' une autre branche à un commit différent (c'est-à-dire ne pas réinitialiser la branche extraite). Ce que vous voulez faire est de réinitialiser la branche actuelle avec git reset targetbranchpour forcer la branche actuelle à être pointée targetbranch. Ajoutez --hardpour forcer également l'arborescence de travail à ce contenu. Ou --softpour laisser l'index seul et ne changer que la branche elle-même.
Colin D Bennett

Bon, donc, je sais pour réinitialiser. Ce que je cherchais, c'était un moyen de toujours pointer le maître local vers l'amont / le maître, indépendamment de ce qui a été vérifié. Je pensais branch -fpouvoir faire ça.
Fuad Saud

9
Imo, cela devrait être la réponse acceptée. Cela a tellement amélioré mon flux de travail!
lethal-guitar

23

Vous pouvez synchroniser avec cette commande vos branches à tout moment

$ git push . CurrentBranch:OtherBranch -f

Aussi sans -f il remplace 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 donc pas passer à une autre branche.


Peut provoquer "à distance: erreur: refus de non-avance rapide"
Basilevs

3
Je n'inclurais pas d' -foption à moins que ce ne soit absolument inévitable. Cela fonctionne bien sans cela dans mon cas.
Melebius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.