Question Renommer la branche principale pour les référentiels Git locaux et distants


J'ai la branche master qui suit la branche distante origin/master.

Je veux les renommer master-old à la fois localement et sur la télécommande. Est-ce possible? Pour les autres utilisateurs qui ont suivi origin/master (et qui a toujours mis à jour leurs locaux master branche via git pull), que se passerait-il après avoir renommé la branche distante? Serait leur git pull travaille toujours ou serait-il jeter une erreur qu'il n'a pas pu trouver origin/master plus?

Ensuite, plus loin, je veux créer un nouveau master branche (localement et à distance). Encore une fois, après que je l'ai fait, que se passerait-il maintenant si les autres utilisateurs git pull?

Je suppose que tout cela entraînerait beaucoup de problèmes. Y a-t-il un moyen propre d'obtenir ce que je veux? Ou devrais-je juste laisser master tel qu'il est et créer une nouvelle branche master-new et juste travailler là plus loin?


746
2017-10-06 16:51


origine


Réponses:


La chose la plus proche de renommer est la suppression puis la recréation sur la télécommande. Par exemple:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

Cependant, cela a beaucoup de réserves. Tout d'abord, aucune caisse existante ne connaîtra le renommage - git ne pas tenter de suivre les noms de branches. Si le nouveau master n'existe pas encore, git pull fera une erreur. Si le nouveau master a été créé. l'attraction va tenter de fusionner master et master-old. C'est donc généralement une mauvaise idée, sauf si vous avez la coopération de tous ceux qui ont déjà consulté le référentiel.

Remarque: Les nouvelles versions de git ne vous permettront pas de supprimer la branche maître à distance par défaut. Vous pouvez remplacer cela en définissant le receive.denyDeleteCurrent valeur de configuration à warn ou ignore sur le éloigné dépôt. Sinon, si vous êtes prêt à créer un nouveau master immédiatement, ignorez git push remote :master étape, et passe --force au git push remote master étape. Notez que si vous ne parvenez pas à modifier la configuration de la télécommande, vous ne pourrez pas supprimer complètement la branche master!

Cette mise en garde s'applique uniquement à la branche actuelle master branche); toute autre branche peut être supprimée et recréée comme ci-dessus.


573
2017-10-06 17:35



En supposant que vous êtes actuellement sur master:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. D'abord faire un master-old branche dans le origin référentiel, basé sur le master commit dans le référentiel local.
  2. Créer une nouvelle succursale locale pour cette nouvelle origin/master-old branche (qui sera automatiquement configuré comme une branche de suivi).
  3. Maintenant, pointez votre locale master à tout engagement que vous voulez qu'il pointe vers.
  4. Enfin, le changement de force master dans le origin référentiel pour refléter votre nouveau local master.

(Si vous le faites d'une autre manière, vous avez besoin d'au moins une étape supplémentaire pour vous assurer que master-old est correctement configuré pour suivre origin/master-old. Aucune des autres solutions affichées au moment de la rédaction de cet article ne comprend cela.)


240
2017-09-24 20:21



Avec Git v1.7, je pense que cela a légèrement changé. La mise à jour de la référence de suivi de votre succursale locale vers la nouvelle télécommande est maintenant très facile.

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

146
2018-04-25 17:22



git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

Vous devrez peut-être passer manuellement à new-branch-name avant de supprimer old-branch-name


35
2018-02-10 02:29



Il y a plusieurs façons de renommer la branche, mais je vais me concentrer sur le plus gros problème: "comment permettre aux clients d'avancer rapidement et de ne pas avoir à jouer avec leurs agences locales".

D'abord une image rapide: renaming master branch and allowing clients to fast-forward

C'est quelque chose de vraiment facile à faire; mais n'en abusez pas. L'idée entière dépend des commits de fusion; car ils permettent l'avance rapide, et relient les histoires d'une branche avec une autre.

renommer la branche:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

créer la nouvelle branche "master":

# create master from new starting point
git branch master <new-master-start-point>

créer un commit de fusion pour avoir un historique parent-enfant:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

et le tour est joué.

git push origin master

Cela fonctionne parce que créer un merge commit permet l'avance rapide la branche à une nouvelle révision.

en utilisant un message de validation de fusion sensible:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

25
2018-03-18 00:48



Je suppose que vous posez toujours la même question que dans votre question précédente. Autrement dit, master-new ne contiendra pas de master-old dans son histoire. * Si vous appelez master-new "master", vous aurez effectivement réécrit l'historique. Ce n'est pas important Comment vous entrez dans un état dans lequel le maître n'est pas un descendant d'une position antérieure de maître, simplement qu'il est dans cet état.

Les autres utilisateurs tentant de tirer alors que le master n'existe pas auront simplement leurs tirages échoués (pas de ref sur remote), et une fois qu'il existera de nouveau dans un nouvel endroit, leurs pulls devront tenter de fusionner leur master avec le nouveau master distant, comme si vous fusionniez maître-ancien et maître-nouveau dans votre référentiel. Étant donné ce que vous essayez de faire ici, la fusion aurait des conflits. (S'ils ont été résolus, et que le résultat a été repoussé dans le référentiel, vous seriez dans un état encore pire - les deux versions de l'histoire là.)

Pour répondre simplement à votre question: vous devez accepter que parfois il y aura des erreurs dans votre histoire. C'est d'accord. Ça arrive à tout le monde. Il y a des validations inversées dans le dépôt git.git. L'important est qu'une fois que nous publions l'histoire, tout le monde peut avoir confiance.

* Si c'était le cas, cela équivaudrait à pousser certaines modifications sur master, puis à créer une nouvelle branche là où elle était. Aucun problème.


11
2017-10-06 17:12



le réponse sélectionnée échoué quand je l'ai essayé. Il jette une erreur: refusing to delete the current branch: refs/heads/master. Je suppose que je vais poster ce qui fonctionne pour moi:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

L'astuce consiste à vérifier l'espace réservé juste avant de le pousser vers le référentiel distant. Le reste est explicite, la suppression de la branche maître et le pousser vers le référentiel distant devrait fonctionner maintenant. Extrait de ici.


8
2017-12-25 12:28



Bien. Mes 2 cents. Que diriez-vous de se connecter au serveur, d'aller dans le répertoire git et de renommer la branche dans le référentiel nu. Cela n'a pas tous les problèmes associés à ré-uploader la même branche. En fait, les 'clients' reconnaîtront automatiquement le nom modifié et changeront leur référence distante. Ensuite (ou avant), vous pouvez également modifier le nom local de la branche.


3
2017-12-24 04:50



Qu'en est-il de:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

1
2017-08-17 08:21



C'est le moyen le plus simple et le plus "lisible" que je connaisse:

Déplacer la branche locale en utilisant -m

git branch -m my_old_branch_name my_new_branch_name

Poussez la branche 'déplacée' vers la télécommande, réglez 'en amont' en utilisant -u

git push origin -u my_new_branch_name

(mettre 'en amont' essentiellement 'connecte' votre branche locale à la télécommande, de sorte que des choses comme aller chercher, tirer et pousser fonctionneront)

Supprimer l'ancienne branche de la télécommande

git push origin -D <old_name>

(votre branche locale est déjà partie, car vous l'avez "déplacée" dans la 1ère étape)


1
2017-12-08 01:15



D'accord, renommer une branche à la fois localement et sur la télécommande est assez facile! ...

Si vous sur la branche, vous pouvez facilement faire:

git branch -m <branch>

ou sinon, vous devez faire:

git branch -m <your_old_branch> <your_new_branch>

Ensuite, poussez la suppression vers la télécommande comme ceci:

git push origin <your_old_branch>

Maintenant que vous avez terminé, si vous obtenez une erreur en amont pendant que vous essayez de pousser, faites simplement:

git push --set-upstream origin <your_new_branch>

Je crée également l'image ci-dessous pour montrer les étapes dans la vraie ligne de commande, juste suivez les étapes et vous seriez bon:

enter image description here


1
2017-07-03 13:24