94 votes

Commande git pour rendre une branche comme une autre

J'essaie de prendre une branche avec des changements et de la ramener à l'identique de l'amont dont elle a divergé. Les changements sont à la fois locaux et ont été poussés sur github, donc ni l'un ni l'autre ne peut être modifié. git reset o git rebase sont vraiment viables, puisqu'ils modifient l'historique, ce qui est une mauvaise chose avec une branche qui a déjà été poussée.

J'ai aussi essayé git merge avec diverses stratégies mais aucune d'entre elles n'annule les changements locaux, c'est-à-dire que si j'avais ajouté un fichier, une fusion pourrait remettre d'autres fichiers en ligne, mais j'aurais toujours ce fichier que l'amont n'a pas.

Je pourrais simplement créer une nouvelle branche à partir de l'amont, mais j'aimerais vraiment une fusion qui, en termes d'historique de révision, applique toutes les modifications pour prendre ma branche et la rendre à nouveau identique à l'amont, de sorte que je puisse pousser cette modification en toute sécurité sans altérer l'historique. Existe-t-il une telle commande ou série de commandes ?

12 votes

Si vous ne vous souciez pas de préserver les changements, pourquoi ne pas simplement supprimer et recréer la branche ? "L'histoire du projet" n'a pas besoin d'être sacrée. Git est un outil pour aider les développeurs à communiquer. Si ces changements n'aident pas à cela, jetez-les.

0 votes

+100 @wnoise - surtout si les changements ont déjà été fusionnés.

13 votes

Je tiens à préserver l'histoire à la fois parce qu'elle est publiée à des fins de collaboration et parce que je pourrais avoir envie d'y revenir. Pourquoi s'embêter à utiliser le contrôle de révision si vous ne gardez que la dernière version ?

2voto

sscarduzio Points 385

C'est un peu lourd, mais bon sang, qu'est-ce qui peut bien se passer ?

  • Vérifiez la branche X que vous voulez ressembler à la Y
  • cp -r .git /tmp
  • Vérifiez la branche Y git checkout y
  • rm -rf .git && cp -r /tmp/.git .
  • S'engager & pousser toute différence
  • FAIT.

1voto

kelloti Points 4157

Passer à la branche amont distante et faire un git merge avec la stratégie de fusion fixée à ours .

git checkout origin/master
git merge dev --strategy=ours
git commit ...
git push

Tout l'historique sera toujours présent, mais vous aurez un commit de fusion supplémentaire. L'important ici est de commencer à partir de la version à laquelle vous voulez être et de fusionner ours avec la branche où se trouve actuellement github.

1voto

user3070485 Points 11

Utilisez git reset BACKWARDS !

Vous pouvez faire en sorte qu'une branche ressemble à n'importe quel autre commit avec git reset mais vous devez le faire d'une manière détournée.

Pour faire une branche sur le commit <old> ressemble à un engagement <new> vous pouvez faire

git reset --hard <new>

afin de faire <new> le contenu de l'arbre de travail.

Ensuite, faites

git reset --mixed <old> 

pour revenir à la version originale de la branche mais en laissant l'arbre de travail dans le <new> état .

Ensuite, vous pouvez ajouter et valider les modifications, afin que votre branche corresponde exactement au contenu du fichier <new> commettre.

C'est contre-intuitif que de passer de la <old> à l'état de <new> vous devez faire un git reset de <new> a <old> . Cependant, avec l'option --mixed l'arbre de travail est laissé à <new> et le pointeur de branche mis à <old> de sorte que lorsque les changements sont validés, la branche ressemble à ce que nous voulons.

Avertissement

Ne perdez pas la trace de vos commits, par exemple en oubliant ce que les <old> c'est quand on fait git reset --hard <new> .

1voto

esso Points 58

J'ai suivi ces rôles :

Fetching, reset dur de la branche puis récursif de la leur et enfin push forcé à la branche.

À VOS RISQUES ET PÉRILS

git fetch
git reset --hard <branch>
git merge <branch> -s recursive -X theirs
git push -f <remote> <branch>

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