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?

Alexandre Gladysh
la source
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
P Shved
la source
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.

Colin D Bennett
la source
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.

Denis Kuznetsov
la source
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