1982 votes

Faire de la branche Git actuelle une branche master

J'ai un référentiel dans Git. J'ai créé une branche, puis j'ai effectué quelques modifications à la fois sur le master et sur la branche.

Puis, des dizaines de commits plus tard, j'ai réalisé que la branche est dans un bien meilleur état que le master, donc je veux que la branche "devienne" le master et ne tienne pas compte des changements sur le master.

Je ne peux pas le fusionner, car je ne veux pas conserver les modifications sur master. Que dois-je faire ?

Extra : Dans ce cas, l'"ancien" maître a déjà été utilisé. push -vers un autre dépôt tel que GitHub. En quoi cela change-t-il les choses ?

3 votes

Vérifiez les réponses à la question très similaire stackoverflow.com/q/2862590/151641

6 votes

J'ai eu le même problème, mais j'ai simplement supprimé le master et renommé une autre branche en master : stackoverflow.com/a/14518201/189673

12 votes

@jayarjo vous devez éviter cela si vous le pouvez car cela va réécrire l'histoire et causer des problèmes à tous les autres lorsqu'ils essaieront de tirer master.

2464voto

Jefromi Points 127932

Le problème avec les deux autres réponses est que le nouveau maître n'a pas l'ancien maître comme ancêtre, donc lorsque vous le poussez, tous les autres seront perturbés. C'est ce que vous voulez faire :

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

Si vous souhaitez que votre historique soit un peu plus clair, je vous recommande d'ajouter quelques informations au message de validation de la fusion afin de préciser ce que vous avez fait. Changez la deuxième ligne en :

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

29 votes

Note sur les "stratégies" de fusion de git : --strategy=ours est différent de --strategy=recursive -Xours . C'est à dire que "la nôtre" peut être une stratégie en soi (le résultat sera la branche courante quoi qu'il arrive), ou passée comme une option à la stratégie "récursive" (apporte les changements de l'autre branche, et préfère automatiquement les changements de la branche courante quand il y a un conflit).

1 votes

Si vous souhaitez continuer à travailler sur des branches basées sur "better_branch", devez-vous conserver "better_branch" jusqu'à ce qu'elles soient également fusionnées dans master ou pouvez-vous supprimer "better_branch" ?

0 votes

@Woody C'est vraiment une question complètement différente (et je vous encourage à poser des questions en tant que questions), mais la réponse courte est que si vous avez une branche, aucun des commits y menant ne disparaît, qu'il y ait ou non une branche pointant vers l'un d'entre eux. Les branches ne sont que des pointeurs vers les commits ; supprimer la branche n'a aucun effet sur les commits.

83voto

Dietrich Epp Points 72865

Edit : Vous n'avez pas dit que vous aviez poussé vers un repo public ! Cela fait une grande différence.

Il existe deux méthodes, la méthode "sale" et la méthode "propre". Supposons que votre branche s'appelle new-master . C'est la manière propre :

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

Les fichiers de configuration seront ainsi modifiés pour correspondre aux branches renommées.

Vous pouvez aussi le faire de la façon la plus simple, sans mettre à jour les fichiers de configuration. C'est un peu ce qui se passe sous le capot de l'application ci-dessus...

mv -i .git/refs/new-master .git/refs/master
git checkout master

2 votes

Merci. Une dernière question. Je vais le pousser sur github. Que se passera-t-il là-bas, si je fais cela ?

3 votes

@Karel : Cela va créer un peu de désordre pour les autres utilisateurs ; ils devront réinitialiser leur master au master github. Si vous voulez éviter de leur causer des problèmes, jetez un œil à ma réponse.

6 votes

@Dietrick Epp : Je ne suis pas sûr que ce soit une bonne idée de suggérer la façon sale. Cela va gâcher le suivi à distance, les reflogs... je ne peux pas penser à une raison pour laquelle vous le feriez.

47voto

Alan Haggai Alavi Points 34260

Renommez la branche en master par :

git branch -M branch_name master

13 votes

Malheureusement, git ne suit pas les renommages de branches, donc si vous avez déjà poussé votre dépôt vers un dépôt distant et que d'autres personnes ont des modifications locales sur leur ancienne branche master locale, ils auront des problèmes.

0 votes

Y a-t-il une différence entre ceci et git checkout master&&git reset --hard better_branch ?

0 votes

@thSoft Et si c'est seulement moi qui utilise le dépôt ?

14voto

VonC Points 414372

Les solutions données ici (renommer la branche dans 'master') n'insistent pas sur les conséquences pour le repo distant (GitHub) :

  • si vous n'avez rien poussé depuis la création de cette branche, vous pouvez la renommer et la pousser sans problème.
  • si vous avez poussé master sur GitHub, vous devrez 'git push -f' la nouvelle branche : vous ne pouvez plus pousser en mode avance rapide .

    -f
    --force

En général, la commande refuse de mettre à jour un ref distant qui n'est pas un ancêtre du ref local utilisé pour le remplacer. Ce drapeau désactive la vérification. Cela peut faire perdre des commits au référentiel distant ; utilisez-le avec précaution.

Si d'autres personnes ont déjà tiré votre repo, elles ne pourront pas tirer le nouvel historique du master sans remplacer leur propre master par la nouvelle branche master de GitHub (ou sans avoir à gérer de nombreuses fusions).
Il y a alternatives à un git push --force pour les dépôts publics .
La réponse de Jefromi (fusionner les bonnes modifications au master original) est l'une d'entre elles.

13voto

user2064284 Points 21

On peut aussi extraire tous les fichiers de l'autre branche dans master :

git checkout master
git checkout better_branch -- .

et ensuite valider tous les changements.

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