Renommer branche master pour à la fois locaux et distants dépôts Git
J'ai la branche master
qui suit la branche distante origin/master
.
Je veux les renommer pour master-old
à la fois localement et sur la télécommande. Est-ce possible? Pour les autres utilisateurs ayant suivi origin/master
(et qui a toujours mis à jour leurs locaux master
branche via git pull
), ce qui pourrait se produire après j'ai renommé le branche à distance? Leur git pull
encore du travail ou serait-il jeter une erreur qu'il ne trouve pas origin/master
plus?
Puis, plus loin, je veux créer un nouveau master
branche (à la fois localement et à distance). Encore une fois, après j'ai fait cela, ce qui allait se passer maintenant, si les autres utilisateurs à faire git pull
?
Je suppose que tout cela se traduira par un grand nombre de problèmes. Est-il un moyen propre à obtenir ce que je veux? Ou devrais-je simplement laisser master
comme il est et de créer une nouvelle branche master-new
travail juste et il plus loin?
- La recette donnée dans la accepté de répondre ne s'applique pas à une branche de n'importe quel nom, mais les mises en garde (comme indiqué) ne sont pas, en raison de l' (par défaut) rôle particulier de la branche master du dépôt Git.
- Je pense que je ne comprends pas. Quelles mises en garde s'appliquent à maîtriser et ne s'applique pas sur les autres branches? Si ce serait une branche nommée xy et d'autres personnes ont suivi cette direction, comment pourrait-il en être autrement?
- La mise en garde que vous ne pouvez normalement pas supprimer le maître. Ne s'applique pas dit Aristote bien que, de sorte que vous pouvez pour marquer que l'on a accepté la réponse. Vous avez raison, tout
git push -f
affecte la capacité depull
de tout suivi à distance de la branche. - vous pouvez créer une nouvelle branche
master-old
qui pointe vers la même livraison que le précédentmaster
branche. Ensuite, vous pouvez remplacer lemaster
de la direction, avec vos nouveaux changements en faisant unmerge
avec leours
stratégie. Faire une fusion fonctionne lorsque la télécommande ne permet pas aux non-fastforward changements. Cela signifie également que les autres utilisateurs n'ont pas forcé les mises à jour. master
est seule, tant que c'est la seule branche. Dès que vous avez plus d'un, toutes les branches sont sur un pied d'égalité.- Double Possible de Comment faire pour renommer un local Git branch?
Vous devez vous connecter pour publier un commentaire.
La chose la plus proche de renommage est de supprimer puis le recréer sur la télécommande. Par exemple:
Cependant, cela a beaucoup de mises en garde. Tout d'abord, aucun des extractions en sauront sur le renommer - git ne pas de tenter de suivre direction de la renomme. Si la nouvelle
master
n'existe pas encore, git pull erreur. Si la nouvellemaster
a été créé. la pull tentative de fusion demaster
etmaster-old
. Donc, c'est généralement une mauvaise idée, sauf si vous avez la coopération de tout le monde qui a récupéré le dépôt précédemment.Remarque: les nouvelles versions de git ne vous permettra pas de supprimer la branche master à distance par défaut. Vous pouvez la remplacer par la définition de la
receive.denyDeleteCurrent
de configuration de la valeur àwarn
ouignore
sur le distance référentiel. Sinon, si vous êtes prêt à créer un nouveau maître tout de suite, sautez lagit push remote :master
étape, et passer--force
à lagit push remote master
étape. Notez que si vous n'êtes pas en mesure de modifier la distance de la configuration, vous ne serez pas en mesure de supprimer complètement la branche master!De cette mise en garde s'applique uniquement à la branche courante (généralement le
master
direction); une autre branche peut être supprimé et recréé comme ci-dessus.new-branch-name
etold-branch-name
au lieu demaster
/master-old
, donc c'est un problème général.git push remote :master
> fatale: "distant" ne semble pas être un dépôt git fatale: impossible de lire à partir d'un dépôt distant. Assurez-vous d'avoir les droits d'accès corrects et le référentiel existe.git push origin
.git push [TABULATOR]
! [remote rejected] master (refusing to delete the current branch: refs/heads/master) error: failed to push some refs to 'https://github.com/me/repo'
surgit push -f remote :master
En supposant que vous êtes actuellement sur
master
:master-old
branche dans laorigin
référentiel, basé sur de lamaster
s'engager dans le référentiel local.origin/master-old
branche (qui sera automatiquement mis en place correctement suivi de la branche).master
quel que soit le commit que vous voulez qu'il désigne.master
dans leorigin
référentiel pour refléter votre nouveau localmaster
.(Si vous le faites de toute autre manière, vous avez besoin d'au moins une étape de plus pour s'assurer que
master-old
est correctement mis en place pour suivreorigin/master-old
. Aucune des autres solutions affiché au moment de l'écriture de l'inclure.)master
ou d'une autre succursale. La question a été mal intitulé cependant, il pose des questions sur une tâche plus complexe que tout renommer une branche.master
alors qu'ils pourraient juste fairegit fetch && git reset --hard origin/master
à la force de leurs locauxmaster
être le même que celui surorigin
. J'ai documenté ce, ainsi que le cas plus complexe où vous avez locales s'engage sur le dessus demaster
que vous souhaitez conserver, dans la stackoverflow.com/q/4084868Avec Git v1.7, je pense que cela a quelque peu changé. Mise à jour de votre succursale locale de suivi de la référence à la nouvelle télécommande est maintenant très facile.
--set-upstream
est comme suit: une Fois que vous avez votre branche renommé localement et supprimés à l'origine, il suffit de faire:git push -u --all
new_branch
et puis finalement supprimer la distancemaster
à la 2e ligne.git push origin --delete old_branch
est un peu plus lisible.Vous pourriez avoir à passer manuellement à
new-branch-name
avant de supprimerold-branch-name
git branch -d old-branch-name
pour supprimer les anciens locaux de la branche.git push remote-name new-branch-name :old-branch-name
.Il existe de nombreuses façons de renommer la branche, mais je vais me concentrer sur le plus gros problème: "comment permettre aux clients de faire une avance rapide et de ne pas avoir à jouer avec leurs branches localement".
D'abord un rapide tableau:
C'est quelque chose de facile à faire; mais ne pas en abuser.
L'idée repose sur la fusion s'engage; car ils permettent de fast-forward, et de lier les histoires d'une branche à l'autre.
renommage de la branche:
de la création du nouveau "maître" de la direction de la
la création d'une opération de fusion s'engagent à avoir un parent-enfant de l'histoire:
et le tour est joué.
Cela fonctionne parce que la création d'un
merge
commettre permet avance rapide à la direction générale d'une nouvelle révision.à l'aide d'un judicieux de fusionner le message de validation:
git merge -s ours master-old
est l'élément crucial que les autres réponses manquer. Aussi, "facile à faire" ne signifie pas "facile à comprendre, ou de savoir" qui semble être le cas avec beaucoup de git, mais je m'égare.Je suis en supposant que vous êtes toujours demander la même situation que dans votre question précédente. Qui est, maître-nouveau testament contient pas de maître-ancien dans son histoire.* Si vous appelez maître-nouveau "maître", vous avez réécrit l'histoire. Il n'a pas d'importance comment vous entrer dans un état dans lequel le maître n'est pas un descendant d'un ancien poste de maître, simplement que c'est dans cet état.
D'autres utilisateurs qui tentent de tirer en master n'existe pas en auront simplement leur tire pas (pas de telles ref sur la télécommande), et une fois qu'il existe à nouveau dans un nouveau lieu, leur tire vont tenter de fusionner leur maître avec la nouvelle télécommande maître, comme si vous fusionnées maître-vieux-maître de nouveau dans votre référentiel. Compte tenu de ce que vous essayez de faire ici, que la fusion des conflits. (Si ils ont été résolus, et le résultat a été repoussé dans le référentiel, vous seriez dans un état encore pire - les deux versions de l'histoire.)
Pour répondre à votre question simplement: vous devez accepter que, parfois, il y aura des erreurs dans votre histoire. Ce n'est pas grave. Il arrive à tout le monde. Il y a revenue s'engage dans le git.le dépôt git. L'important, c'est qu'une fois que nous publions de l'histoire, c'est quelque chose que chacun peut faire confiance.
*Si elle le faisait, ce serait l'équivalent de pousser certains changements sur master, puis création d'une nouvelle branche où il est utilisé pour être. Pas de problème.
La réponse sélectionnée a échoué lorsque je l'ai essayé. Il renvoie une erreur:
refusing to delete the current branch: refs/heads/master
. Je suppose que je vais poster ce qui fonctionne pour moi:Le truc, c'est à la caisse pour l'espace réservé à droite avant de le pousser de dépôt distant. Le reste est auto-explicatif, la suppression de la branche master et les pousser vers le dépôt distant devrait fonctionner maintenant. Extrait du ici.
Bon. Mes 2 cents. Comment au sujet de loggin dans le serveur, va le répertoire git et changement de nom de la branche dans le dépôt nu. Ce n'est pas tous les problèmes associés à reuploading la même branche. En fait, les "clients" reconnaît automatiquement le nom modifié et le changement de leur référence à distance. Après (ou avant), vous pouvez également modifier le nom local de la direction générale.
Ce sujet:
C'est le plus simple et le plus "lisibles" que je connaisse:
'Move', branche locale à l'aide de m
Pousser le "déplacé", branche de la télécommande, réglez "en amont" de l'aide -u
(paramètre 'en amont' essentiellement 'connecte' à votre succursale locale de la distance, de sorte que des choses comme les extraire, tirer et pousser de travail)
Supprimer l'ancienne direction générale de la télécommande
(à votre succursale locale est déjà parti, parce que vous "déplacé" dans la 1ère étape)
OK, le changement de nom d'une branche à la fois localement et sur la distance est assez facile!...
Si vous à la direction générale, vous pouvez le faire facilement:
git branch -m <branch>
ou si non, vous devez faire:
git branch -m <your_old_branch> <your_new_branch>
Ensuite, poussez la suppression de la distance comme ceci:
git push origin <your_old_branch>
Maintenant que vous faites, si vous obtenez en amont d'erreur lorsque vous essayez de pousser, il suffit de faire:
git push --set-upstream origin <your_new_branch>
J'ai aussi créer l'image ci-dessous pour montrer les étapes dans la vraie ligne de commande, il suffit de suivre les étapes et vous serait bon:
Vous pouvez effectuer les opérations suivantes:
Mais la force de poussée est une mauvaise idée si d'autres personnes partagent ce référentiel. La Force de poussée sera la cause de leur révision de l'histoire à entrer en conflit avec le nouveau.
Suivants peuvent être enregistrés dans le script shell pour faire le travail:
Par exemple:
Veuillez noter qu'ici, à distance par défaut le nom de "l'origine" est codé en dur, vous pouvez prolonger le script pour le rendre si configurable!
Ensuite ce script peut être utilisé avec bash alias, alias git ou, par exemple, sourcetree actions personnalisées.
Je crois que la clé est la réalisation que vous effectuez une double renommer:
master
àmaster-old
et aussimaster-new
àmaster
.De toutes les autres réponses que j'ai synthétisé ce:
où nous devons d'abord définir le
doublerename
Bash fonction:Ceci est similaire à une histoire de changer
git rebase
en ce que la branche de contenu est tout à fait différent, mais il en diffère en ce que les clients peuvent toujours en toute sécurité de l'avance rapide avecgit pull master
.