431 votes

Renommer des branches à distance dans Git

S'il y a un dépôt que j'ai seulement git:// (et je me contenterais généralement de pousser et de tirer), existe-t-il un moyen de renommer les branches dans ce dépôt de la même manière que je le ferais localement avec la fonction git branch -m ?

50 votes

La question "dupliquée" liée demande de renommer une branche "à la fois localement et à distance". Cette question, cependant, demande seulement comment renommer les branches à distance, ce qui permet une simplification. Voici ce que je fais pour renommer une branche sur le serveur sans avoir besoin de vérifier et / ou de créer une branche locale : git push origin origin/old_name:refs/heads/new_name && git push origin :old_name .

1 votes

@sschuberth : vous pouvez donner les deux commandes en une seule fois. Et cela devrait vraiment être la réponse à cette question.

2 votes

@JoachimBreitner Vous avez raison, j'ai déjà procédé à cette optimisation en ce script de la mienne.

495voto

Sylvain Defresne Points 15231

Il vous suffit de créer une nouvelle branche locale avec le nom souhaité, de la pousser vers votre branche distante, puis de supprimer l'ancienne branche distante :

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

Ensuite, pour voir l'ancien nom de la branche, chaque client du référentiel devrait faire :

$ git fetch origin
$ git remote prune origin

NOTE : Si votre ancienne branche est votre branche principale, vous devez modifier les paramètres de votre branche principale. Sinon, lorsque vous exécutez $ git push origin :old-branch-name vous obtiendrez l'erreur suivante "suppression de la branche actuelle interdite" .

0 votes

Si le nouveau nom et l'ancien sont les mêmes, cela ne va-t-il pas simplement supprimer la branche ? Si vous changez l'ordre des poussées, je pense que c'est un peu plus sûr.

8 votes

Eh bien, si l'ancien et le nouveau nom sont les mêmes, cela signifie que vous n'avez pas besoin de renommer la branche, donc il n'y a pas de raison de lancer la commande en premier lieu ;-)

9 votes

Bien sûr. Je veux simplement dire que si vous l'appelez de manière automatisée (comme une fonction faisant partie d'un autre script), vous pourriez aussi bien ne pas lui faire faire la mauvaise chose si vous pouvez l'éviter.

306voto

sschuberth Points 3073

Si vous voulez vraiment juste renommer des branches à distance, sans renommer les branches locales en même temps vous pouvez le faire avec une seule commande :

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

J'ai écrit ce script ( git-rename-remote-branch ) qui fournit un raccourci pratique pour faire ce qui précède facilement.

Comme une fonction bash :

git-rename-remote-branch(){
  if [ $# -ne 3 ]; then
    echo "Rationale : Rename a branch on the server without checking it out."
    echo "Usage     : ${FUNCNAME[0]} <remote> <old name> <new name>"
    echo "Example   : ${FUNCNAME[0]} origin master release"
    return 1 
  fi

  git push $1 $1/$2\:refs/heads/$3 :$2
}

Pour intégrer le commentaire de @ksrb : Ce que cela fait essentiellement, c'est deux poussées en une seule commande, d'abord git push <remote> <remote>/<old_name>:refs/heads/<new_name> pour pousser une nouvelle branche distante basée sur l'ancienne branche de suivi à distance, puis git push <remote> :<old_name> pour supprimer l'ancienne branche distante.

10 votes

Pour ceux qui voudraient un alias de cette commande : rename = "!f() { git push origin origin/$1:refs/heads/$2 :$1 ; } ; f" ceci peut être utilisé comme > git rename <ancien_nom> <nouveau_nom>.

0 votes

C'est la seule solution qui fonctionne si vous avez déjà configuré votre branche locale pour suivre la branche distante avec son ancien nom.

35 votes

Pour ceux qui sont curieux de savoir ce que signifie cette commande, il s'agit essentiellement de 2 poussées git push <remote>/<old_name>:refs/heads/<new_name> signifie pousser une nouvelle télécommande qui utilise l'ancienne télécommande comme src. puis git push [space]:<old_name> signifie supprimer l'ancienne télécommande

183voto

Shashank Hegde Points 97

Vérifiez d'abord la branche que vous voulez renommer :

git branch -m old_branch new_branch
git push -u origin new_branch

Pour supprimer une ancienne branche de remote :

git push origin :old_branch

14 votes

Lorsque vous poussez la branche renommée (new_branch) vers la branche distante (origin), vous devez également configurer son amont pour suivre la branche avec le nouveau nom (par ex. git push -u origin new_branch ) sinon la branche renommée (new_branch) continuera à suivre l'origin/old_branch. Et une fois que vous avez supprimé l'ancienne_branche distante, la nouvelle_branche continuera à suivre l'origine/l'ancienne_branche, bien que cette branche ait disparu.

0 votes

@DolphinDream J'ai modifié la réponse pour inclure votre changement utile en amont.

11voto

Kevin Ballard Points 88866

Bien sûr. Il suffit de renommer la branche localement, de pousser la nouvelle branche, et de pousser une suppression de l'ancienne.

Le seul vrai problème est que les autres utilisateurs du dépôt n'auront pas de branches de suivi locales renommées.

1 votes

Donc, en essayant de supprimer master, j'ai essayé $ git clone ../src $ cd src $ git branch notmaster $ git checkout notmaster $ git branch -d master $ git push ../src :master Mais il se plaint : La refspec de destination ne correspond pas à une ref existante sur le distant et ne commence pas par refs/, et nous ne sommes pas en mesure de deviner un préfixe basé sur la ref source. error : failed to push some refs to '../alpha/' Le distant a vraiment une branche appelée master

2voto

CPHPython Points 2219

TL;DR

"Renommer" une branche distante est en fait un processus en 2 étapes (pas nécessairement ordonnées) :

  • suppression de l'ancienne branche distante ( git push [space]:<old_name> comme ksrb a expliqué ) ;
  • pousser dans une nouvelle branche distante (différence entre quelques commandes de réponses ci-dessous).

Suppression de

J'utilise TortoiseGit et lorsque j'ai essayé de supprimer la branche par la ligne de commande, j'ai obtenu ceci :

$ git push origin :in
  • fatal : 'origin' ne semble pas être un dépôt git

  • fatal : Impossible de lire le référentiel distant.

Veuillez vous assurer que vous avez les bons droits d'accès et que le référentiel existe.

Cela était probablement dû à Concours de beauté ne pas avoir le clé privée chargé (qui TortoiseGit se charge automatiquement dans Concours de beauté ). De plus, j'ai remarqué que TortoiseGit Les commandes n'ont pas le origin ref en eux (par exemple git.exe push --progress "my_project" interesting_local:interesting ).

J'utilise également Bitbucket et, comme d'autres gestionnaires git en ligne du genre (GitHub, GitLab), j'ai pu supprimer la branche distante directement via leur interface (page des branches) :

Delete branch Bitbucket

Cependant, en TortoiseGit vous pouvez également supprimer les branches distantes par le biais de Parcourir les références :

Browse References menu

En cliquant avec le bouton droit de la souris sur une branche distante (liste des branches distantes), la fonction Supprimer la branche distante s'affiche :

TortoiseGit remote branch delete

Pousser

Après avoir supprimé l'ancienne branche distante, j'ai poussé directement dans une nouvelle branche distante via TortoiseGit en tapant simplement le nouveau nom dans le A distance : du champ de la Pousser et cette branche a été automatiquement créée et visible dans la fenêtre Bitbucket .

Cependant, si vous préférez toujours le faire manuellement, un point qui n'a pas encore été mentionné dans ce fil de discussion est que -u = --set-upstream .

De git push docs , -u est juste un alias de --set-upstream Ainsi, les commandes dans les réponses de Sylvain ( -set-upstream new-branch ) y Shashank ( -u origin new_branch ) sont équivalentes, puisque la réf. à distance La valeur par défaut est origin si aucune autre réf n'a été définie auparavant :

  • git push origin -u new_branch = git push -u new_branch de la description des documents :

    Si la configuration est manquante, elle prend par défaut la valeur suivante origin .

En fin de compte, je n'ai pas tapé manuellement ou utilisé l'une des commandes suggérées par les autres réponses ici, donc peut-être que cela pourrait être utile à d'autres personnes dans une situation similaire.

0 votes

Le problème est que votre télécommande ne s'appelle pas origin . Vous devez nommer votre télécommande comme vous l'obtenez en exécutant la commande git remote . Git fonctionne avec ssh ce qui implique que vous utilisez des clés publiques+privées. Je suppose que le Autoload Putty keys de TortoiseGit est juste en train de charger automatiquement les clés nécessaires pour que vous puissiez faire quoi que ce soit avec votre référence distante. La dernière chose est que git push -u n'est pas un alias pour pousser dans une branche distante, c'est un alias pour pousser dans une branche distante qui a été créé localement et sa référence distante n'a pas encore cette branche .

1 votes

@juancab -u est un alias de --set-upstream et "si la configuration est manquante, elle La valeur par défaut est origin ". Sylvain y Shashank utiliser ceci pour en poussant dans un nouvellement créé filiale éloignée . Le site clé Le problème peut être dû à Concours de beauté Je ne l'ai pas chargé quand j'ai essayé git push origin :in sur la coquille. Donc je ne comprends pas ton downvote, j'ai juste pointé les miens et des détails non abordés dans d'autres réponses, je les ai expliqués et résolus.

0 votes

Vous affirmez des choses erronées et une grande partie de cette réponse est sans rapport avec la question elle-même. Si vous indiquez ce qui a fonctionné pour vous, je vous encourage à limiter la réponse à ce qui a fonctionné et si vous voulez vraiment donner une explication, informez-vous mieux. À propos : -u est un alias pour --set-upstream mais ce n'est pas un alias pour pousser dans une branche distante comme vous l'avez dit. Pour pousser dans une branche distante, vous avez uniquement besoin de git push <remote> et si ce n'est pas encore dans la télécommande, vous ajoutez git push -u <remote> . Par conséquent, -u est utilisé pour créer une référence de la branche dans le distant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X