J'ai la branche master
qui suit la branche distante origin/master
.
Je veux les renommer master-old
localement et sur la télécommande. Est-ce possible?
Pour les autres utilisateurs qui ont suivi origin/master
(et qui ont toujours mis à jour leur master
branche locale via git pull
), que se passerait-il après avoir renommé la branche distante?
Est-ce que cela git pull
fonctionnerait encore ou lancerait-il une erreur qu'il ne pourrait plus trouver origin/master
?
Ensuite, plus loin, je veux créer une nouvelle master
branche (à la fois localement et à distance). Encore une fois, après avoir fait cela, que se passerait-il maintenant si les autres utilisateurs le faisaient git pull
?
Je suppose que tout cela entraînerait beaucoup de problèmes. Existe-t-il un moyen propre d'obtenir ce que je veux? Ou devrais-je simplement laisser master
tel quel et créer une nouvelle branche master-new
et y travailler plus loin?
la source
git push -f
affecte la capacitépull
de n'importe quelle branche de suivi à distance.master-old
qui pointe vers le même commit que lamaster
branche précédente . Ensuite, vous pouvez remplacer lamaster
branche avec vos nouvelles modifications en effectuant unmerge
avec laours
stratégie. La fusion fonctionne lorsque la télécommande n'autorise pas les modifications non rapides. Cela signifie également que les autres utilisateurs n'auront pas de mises à jour forcées.master
n'est spécial que tant qu'il s'agit de la seule branche existante. Dès que vous en avez plusieurs, toutes les branches sont sur un pied d'égalité.Réponses:
La chose la plus proche du changement de nom est la suppression puis la recréation sur la télécommande. Par exemple:
Cependant, cela comporte de nombreuses mises en garde. Tout d'abord, aucun retrait existant ne connaîtra le changement de nom - git n'essaie pas de suivre les renommages des branches. Si le nouveau
master
n'existe pas encore, git pull sortira en erreur. Si le nouveaumaster
a été créé. la traction tentera de fusionnermaster
etmaster-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à vérifié le référentiel.Remarque: les versions plus récentes de git ne vous permettront pas de supprimer la branche principale à distance par défaut. Vous pouvez remplacer cela en définissant la
receive.denyDeleteCurrent
valeur de configuration surwarn
ouignore
sur le référentiel distant . Sinon, si vous êtes prêt à créer un nouveau master immédiatement, sautez l'git push remote :master
étape et passez--force
à l'git push remote master
étape. Notez que si vous ne pouvez pas modifier la configuration de la télécommande, vous ne pourrez pas supprimer complètement la branche principale!Cette mise en garde ne s'applique qu'à la branche actuelle (généralement la
master
branche); toute autre branche peut être supprimée et recréée comme ci-dessus.la source
new-branch-name
etold-branch-name
au lieu demaster
/master-old
, c'est donc un problème général.En supposant que vous êtes actuellement sur
master
:master-old
branche dans leorigin
référentiel, basée sur lamaster
validation dans le référentiel local.origin/master-old
branche (qui sera automatiquement configurée correctement en tant que branche de suivi).master
vers le commit sur lequel vous souhaitez qu'il pointe.master
dans leorigin
référentiel pour refléter votre nouveau localmaster
.(Si vous le faites d'une autre manière, vous avez besoin d'au moins une étape supplémentaire pour vous assurer qu'il
master-old
est correctement configuré pour effectuer le suiviorigin/master-old
. Aucune des autres solutions publiées au moment de la rédaction de cet article ne comprend cela.)la source
master
ou dans une autre succursale. La question était cependant mal intitulée, elle concerne une tâche plus complexe que de simplement renommer une branche.master
allumés, ils pourraient simplement fairegit fetch && git reset --hard origin/master
pour forcer leur section localemaster
à être la même que celle activéeorigin
. J'ai documenté cela, ainsi que le cas plus complexe où vous avez des commits locaux en plus de ceuxmaster
que vous souhaitez conserver, dans stackoverflow.com/q/4084868Avec 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 désormais très facile.
la source
--set-upstream
est la suivante: Une fois que votre branche a été renommée localement et supprimée à l'origine, faites simplement:git push -u --all
new_branch
puis supprimer éventuellement la télécommandemaster
avec la 2ème ligne.git push origin --delete old_branch
est légèrement plus lisible.Vous devrez peut-être basculer manuellement vers
new-branch-name
avant de supprimerold-branch-name
la source
git branch -d old-branch-name
pour supprimer l'ancienne branche locale.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 d'avancer rapidement et de ne pas avoir à jouer avec leurs branches localement" .
D'abord une image rapide:
C'est quelque chose de facile à faire; mais n'en abusez pas. L'idée repose sur des commits de fusion; car ils permettent une avance rapide et lient les historiques d'une branche à une autre.
renommer la branche:
création de la nouvelle branche "master":
créer un commit de fusion pour avoir un historique parent-enfant:
et le tour est joué.
Cela fonctionne car la création d'une
merge
validation permet d' avancer rapidement la branche vers une nouvelle révision.en utilisant un message de validation de fusion sensible:
la source
git merge -s ours master-old
est l'élément crucial que les autres réponses manquent. En outre, "facile à faire" ne signifie pas "facile à comprendre ou à découvrir", ce qui semble être le cas avec beaucoup de git, mais je m'égare.Je suppose que vous posez toujours la même question que dans votre question précédente . Autrement dit, master-new ne contiendra pas master-old dans son historique. * Si vous appelez master-new "master", vous aurez effectivement réécrit l'historique. Peu importe comment vous entrez dans un état dans lequel le maître n'est pas un descendant d'une position précédente de maître, simplement qu'il est dans cet état.
Les autres utilisateurs qui tentent de tirer alors que le maître n'existe pas verront simplement leurs tirages échouer (aucune référence de ce type sur la télécommande), et une fois qu'il existera à nouveau dans un nouvel emplacement, leurs tirages devront tenter de fusionner leur maître avec le nouveau maître distant, comme si vous avez fusionné master-old et master-new dans votre référentiel. Étant donné ce que vous essayez de faire ici, la fusion entraînerait des conflits. (S'ils étaient résolus et que le résultat était repoussé dans le référentiel, vous seriez dans un état encore pire - les deux versions de l'historique là-bas.)
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 annulées dans le référentiel git.git. L'important est qu'une fois que nous publions l'histoire, c'est une chose à laquelle chacun peut faire confiance.
* Si c'était le cas, cela équivaudrait à pousser certains changements sur master, puis à créer une nouvelle branche là où elle était. Aucun problème.
la source
La réponse sélectionnée a échoué lorsque je l'ai essayée. Il renvoie une erreur:
refusing to delete the current branch: refs/heads/master
. Je suppose que je posterai ce qui fonctionne pour moi:L'astuce consiste à passer à l'espace réservé juste avant de le pousser vers le référentiel distant. Le reste est explicite, la suppression de la branche principale et la pousser vers le référentiel distant devrait fonctionner maintenant. Extrait d' ici .
la source
Bien. Mes 2 cents. Que diriez-vous de vous 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 au re-upload de 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 succursale.
la source
Qu'en est-il de:
la source
C'est la manière la plus simple et la plus lisible que je connaisse:
'Déplacer' la branche locale en utilisant -m
Poussez la branche «déplacée» vers la télécommande, définissez «en amont» à l'aide de -u
(définir «en amont» «connecte» essentiellement votre branche locale à la télécommande, de sorte que des choses comme l'extraction, la traction et la poussée fonctionnent)
Supprimer l'ancienne branche de la télécommande
(votre succursale locale a déjà disparu, car vous l'avez "déplacée" lors de la 1ère étape)
la source
OK , renommer une branche à la fois localement et sur la télécommande est assez facile! ...
Si vous êtes en succursale, 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 lorsque 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 en ligne de commande réelle, suivez simplement les étapes et vous seriez bon:
la source
Vous pouvez effectuer les opérations suivantes:
Mais pousser de force est une mauvaise idée si d'autres personnes partagent ce référentiel. La poussée de force entraînera un conflit entre leur historique de révision et le nouveau.
la source
Les éléments suivants peuvent être enregistrés dans le script shell pour effectuer le travail:
Par exemple:
Veuillez noter qu'ici le nom distant par défaut "origine" est codé en dur, vous pouvez étendre le script pour qu'il soit configurable!
Ensuite, ce script peut être utilisé avec des alias bash, des alias git ou, par exemple, dans des actions personnalisées sourcetree.
la source
Je crois que la clé est la réalisation que vous effectuez un double changement de nom:
master
versmaster-old
et aussimaster-new
versmaster
.De toutes les autres réponses, j'ai synthétisé ceci:
où nous devons d'abord définir la
doublerename
fonction Bash:Ceci est similaire à un changement d'historique
git rebase
en ce que le contenu de la branche est assez différent, mais il diffère en ce que les clients peuvent toujours avancer rapidement en toute sécuritégit pull master
.la source
la source