141 votes

Réinitialisation de l'autre branche à la branche actuelle, sans checkout

Je suis en train d'écrire quelques scripts pour mon flux de travail Git.

J'ai besoin de 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

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

Est-ce possible ?

0 votes

Quelqu'un sait-il si cela est également possible dans Egit ?

300voto

Colin D Bennett Points 1613

Définir otherbranch pour pointer vers le même commit que currentbranch en courant

git branch -f otherbranch currentbranch

El -f L'option (force) dit git branch Oui, je veux vraiment écraser tout ce qui existe. otherbranch référence avec le nouveau .

De la documentation :

-f
--force

Remise à zéro si elle existe déjà. Sans -f git branch refuse de modifier une branche existante.

9 votes

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

1 votes

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

4 votes

FuadSaud, c'est parce que vous avez déjà otherbranch vérifié. Cette question de l'OS concerne spécifiquement la réinitialisation un autre à un commit différent (c'est-à-dire ne pas réinitialiser la branche extraite). Ce que vous voulez faire, c'est réinitialiser la branche courante avec git reset targetbranch pour forcer la branche courante à être pointée sur targetbranch . Ajouter --hard pour forcer également l'arbre de travail à ce contenu. Ou bien --soft de ne pas toucher à l'index et de ne modifier que la branche elle-même.

98voto

Pavel Shved Points 34706

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

Ce dont vous avez besoin, c'est

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

5 votes

Mec, j'aimerais que ça marche sans le superflu. refs/heads/

47 votes

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

5 votes

Vous pouvez également utiliser -m 'some text' argument pour enregistrer la raison de la mise à jour de la référence à afficher par git reflog OtherBranch comme "synchronisé avec CurrentBranch". Cela peut être utile pour se rappeler pourquoi vous l'avez fait plus tard.

27voto

Denis Kuznetsov Points 61

Vous pouvez synchroniser vos branches à tout moment avec cette commande.

$ 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 commiter tous vos fichiers dans CurrentBranch et que vous ne pouvez pas passer à une autre branche.

0 votes

Peut provoquer "remote : error : denying non-fast-forward".

3 votes

Je n'inclurais pas -f sauf si c'est absolument inévitable. Dans mon cas, cela fonctionne bien sans cela.

1voto

Les autres réponses sont bonnes mais un peu effrayantes. Je ne fais que proposer une autre option pour obtenir exactement ce qui a été demandé, un peu simplement, avec des variations sur des commandes que j'utilise tous les jours.

En bref, aucune de ces options n'affecte la branche dans laquelle vous vous trouvez ou le chef actuel.

git branch -C other_branch (forcer la création de l'autre_branche à partir du HEAD actuel)

Pour réinitialiser other_branch à une branche où vous n'êtes pas...

git branch -C old_branch other_branch (forcer la création de l'autre_branche à partir de l'ancienne_branche)

Pour réinitialiser other_branch à some_branch sur la télécommande, c'est un peu différent...

git pull -f origin old_branch:other_branch (force-pull (qui ignore le contenu déjà à jour) origin/old_branch dans other_branch de local)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X