web-dev-qa-db-fra.com

Comment remplacer entièrement une branche principale de Git par une autre branche?

Duplicate possible:
Transforme la branche Git actuelle en branche master

J'ai deux branches dans mon référentiel Git:

  1. master
  2. seotweaks (créé à partir de master)

J'ai créé seotweaks avec l'intention de le fusionner rapidement dans master. Cependant, c'était il y a trois mois et le code dans cette branche compte 13 versions d'avance sur master.

Il est effectivement devenu notre branche principale de travail car tout le code dans master est maintenant plus ou moins obsolète.

Très mauvaise pratique je sais, leçon apprise.

Savez-vous comment je peux remplacer tout le contenu de la branche master par ceux de seotweaks?

Je pourrais simplement tout supprimer dans master et fusionner, mais cela ne semble pas être la meilleure pratique.

1497
Jason

Vous devriez pouvoir utiliser la stratégie de fusion "la nôtre" pour écraser maître avec seotweaks comme ceci:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

Le résultat devrait être votre maître est maintenant essentiellement seotweaks.

(-s ours est l'abréviation de --strategy=ours)

De les docs à propos de la stratégie 'la nôtre':

Cela résout un nombre quelconque de têtes, mais l'arbre résultant de la fusion est toujours celui de la tête de branche actuelle, ignorant ainsi toutes les modifications de toutes les autres branches. Il est destiné à être utilisé pour remplacer l’ancienne histoire de développement des branches latérales. Notez que cela diffère de l'option -Xours de la stratégie de fusion récursive.

2580
ergosys

Pourquoi ne pas utiliser git branch -m pour renommer la branche master en une autre, puis renommer seotweaks en master? Quelque chose comme ça:

git branch -m master old-master
git branch -m seotweaks master
git Push -f Origin master

Ceci pourrait supprimer les validations dans le maître d'origine, vérifiez votre maître d'origine avant d'exécuter git Push -f Origin master.

439
ZelluX

Vous pouvez renommer/supprimer le maître sur distant, mais cela posera un problème si de nombreuses personnes ont basé leur travail sur la branche principale distante et ont extrait cette branche dans leur référentiel local.
Ce n'est peut-être pas le cas ici puisque tout le monde semble travailler sur la branche 'seotweaks'.

Dans ce cas, vous pouvez:
git remote --show peut ne pas fonctionner. (Faites un git remote show pour vérifier comment votre télécommande est déclarée dans votre référentiel local. Je supposerai 'Origin')
(En ce qui concerne GitHub, house9 commente: "Je devais effectuer une étape supplémentaire, cliquer sur le bouton 'Admin' sur GitHub et régler le '_Default Branch_' à quelque chose d'autre que 'master', puis remettez-le après ")

_git branch -m master master-old  # rename master on local
git Push Origin :master          # delete master on remote
git Push Origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git Push Origin master           # create master on remote
_

Mais:

  • si d'autres utilisateurs essaient d'extraire pendant que le maître est supprimé de la télécommande, leurs extractions échoueront ("pas de référence de ce type sur la télécommande")
  • lorsque le maître est recréé à distance, un pull essayera de fusionner ce nouveau maître sur son maître local (maintenant ancien): beaucoup de conflits. Ils doivent en fait _reset --hard_ passer leur maître local à la branche distante/maître qu'ils vont récupérer et oublier leur maître actuel.
71
VonC

Puisque seotweaks a été créé à l'origine sous la forme d'une branche de master, sa fusion est une bonne idée. Cependant, si vous êtes dans une situation où l’une de vos branches n’est pas vraiment une branche de master ou si votre histoire est si différente que vous voulez simplement effacer la branche master au profit de la nouvelle branche que vous souhaitez. 'ai fait le travail sur vous pouvez faire ceci:

git Push [-f] Origin seotweaks:master

Ceci est particulièrement utile si vous obtenez cette erreur:

! [remote rejected] master (deletion of the current branch prohibited)

Et vous n'utilisez pas GitHub et n'avez pas accès à l'onglet "Administration" pour changer la branche par défaut de votre référentiel distant. De plus, cela ne causera pas de temps mort ni de conditions de course que vous pourriez rencontrer en supprimant master:

git Push Origin :master
29
mholm815

J'ai trouvé que c'était le meilleur moyen de le faire (un problème avec mon serveur ne me permettait pas de le supprimer).

Sur le serveur qui héberge le référentiel Origin, tapez ce qui suit dans un répertoire du référentiel:

git config receive.denyDeleteCurrent ignore

Sur votre poste de travail:

git branch -m master vabandoned                 # Rename master on local
git branch -m newBranch master                  # Locally rename branch newBranch to master
git Push Origin :master                         # Delete the remote's master
git Push Origin master:refs/heads/master        # Push the new master to the remote
git Push Origin abandoned:refs/heads/abandoned  # Push the old master to the remote

Retour sur le serveur qui héberge le référentiel Origin:

git config receive.denyDeleteCurrent true

Crédit à l'auteur de l'article de blog http://www.mslinn.com/blog/?p=772

2
ScottGuymer