Comment remplacer la branche principale en Git, entièrement, à partir d'une autre branche? [dupliquer]
possible Duplicate:
faire de la branche Git actuelle une branche principale
j'ai deux branches dans mon dépôt Git:
-
master
-
seotweaks
(créé à partir demaster
)
j'ai créé seotweaks
avec l'intention de fusionnant rapidement en master
. Cependant, c'était il y a trois mois et le code dans cette branche est 13 versions avant master
.
il est effectivement devenu notre branche principale de travail comme tout le code dans master
est plus ou moins obsolète maintenant.
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 supprimer tout dans master
et fusionner, mais cela ne semble pas être une bonne pratique.
5 réponses
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
)
à Partir de les docs à propos de la "nôtre " stratégie": 151940920"
Cela résout n'importe quel nombre de têtes, mais l'arbre résultant de l' la fusion est toujours celle du chef de branche actuel, ignorant en fait tous les changements de toutes les autres branches. Il est destiné à être utilisé pour remplacer l'histoire ancienne de développement des branches latérales. Notez que ceci est différent de l'option-Xours à la stratégie de fusion récursive.
pourquoi ne pas utiliser git branch-m pour renommer la branche master en une autre, puis renommer seotweaks branch en master? Quelque chose comme ceci:
git branch -m master old-master
git branch -m seotweaks master
git push -f origin master
Cela pourrait supprimer s'engage à l'origine de maître , veuillez vérifier votre origine de maître avant d'exécuter git push -f origin master
.
vous pouvez renommer/remove master sur remote, mais ce sera un problème si beaucoup de gens ont basé leur travail sur la branche remote master et ont tiré cette branche dans leur repo 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.
(Faire un git remote show
pour vérifier comment votre remote est déclaré dans votre rapport local. J 'assumerai' origin
')
(Concernant GitHub, house9 commente: "j'ai dû faire un pas supplémentaire, cliquer le bouton Admin
'sur GitHub et mettre le' Default Branch
'à quelque chose d'autre que' master
', puis le remettre 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 encore:
- si d'autres utilisateurs tentent de tirer pendant que le maître est supprimé sur à distance, leur tire échoue ("ref sur la télécommande")
- quand le maître est recréé à distance, une traction tentera de fusionner ce nouveau maître sur leur maître local (maintenant ancien): beaucoup de conflits. Ils ont en fait besoin de
reset --hard
leur maître local à la branche distante/maître qu'ils vont chercher, et oublier leur maître actuel.
depuis seotweaks
a été créé à l'origine comme une branche de master
, la fusionner à nouveau 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 oblitérer la branche master
en faveur de la nouvelle branche que vous avez fait le travail sur vous pouvez le faire:
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 pour votre dépôt distant. En outre, cela ne causera pas de temps d'arrêt ou de conditions de course comme vous pouvez rencontrer en supprimant maître:
git push origin :master
j'ai trouvé que c'était la meilleure façon de le faire (j'ai eu un problème avec mon serveur ne me laissant pas supprimer).
sur le serveur qui héberge le dépôt origin
, tapez ce qui suit à partir d'un répertoire à l'intérieur du dépôt:
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
de retour sur le serveur qui héberge le dépôt origin
:
git config receive.denyDeleteCurrent true
Crédit à l'auteur du blog http://www.mslinn.com/blog/?p=772