Comment renommer un nom de branche locale et distante Git?


457

J'ai quatre branches comme master -> origin / regacy, FeatureA -> origin / FeatureA. Comme vous pouvez le voir, j'ai tapé le mauvais nom.

Je veux donc renommer un nom de branche distante (origine / regacy → origine / legacy ou origine / master)

J'essaye la commande ci-dessous:

git remote rename regacy legacy

Mais la console Git m'a renvoyé un message d'erreur.

 error : Could not rename config section 'remote.regacy' to 'remote.legacy'

Comment puis-je résoudre ce problème?




Réponses:


809

Entrez la description de l'image ici


Il existe plusieurs façons d'y parvenir:

  1. Modifiez votre succursale locale, puis appuyez sur vos modifications
  2. Poussez la branche à distance avec le nouveau nom tout en conservant le nom d'origine localement

Renommer local et distant

# Rename the local branch to the new name
git branch -m <old_name> <new_name>

# Delete the old branch on remote - where <remote> is, for example, origin
git push <remote> --delete <old_name>

# Or shorter way to delete remote branch [:]
git push <remote> :<old_name>

# Push the new branch to remote
git push <remote> <new_name>

# Reset the upstream branch for the new_name local branch
git push <remote> -u <new_name>

Entrez la description de l'image ici


Renommer uniquement la branche distante

Crédits : ptim

# In this option, we will push the branch to the remote with the new name
# While keeping the local name as is
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

Note importante:

Lorsque vous utilisez le git branch -m(déplacer), Git met également à jour votre branche de suivi avec le nouveau nom.

git remote rename legacy legacy

git remote renametente de mettre à jour votre section distante dans votre fichier de configuration. Il renommera la télécommande avec le nom donné en nouveau nom, mais dans votre cas, il n'en a pas trouvé, donc le changement de nom a échoué.

Mais il ne fera pas ce que vous pensez; il renommera le nom distant de votre configuration locale et non la branche distante. 


Remarque Les serveurs Git peuvent vous permettre de renommer les branches Git en utilisant l'interface Web ou des programmes externes (comme Sourcetree, etc.), mais vous devez garder à l'esprit que dans Git tout le travail est effectué localement, il est donc recommandé d'utiliser les commandes ci-dessus au travail.


Vous devez encore faire quelque chose, après ce qui précède et lorsque j'essaie de tirer, je reçois un message:Your configuration specifies to merge with the ref ''refs/heads/old_name'
Krzysztof Krasoń

6
N'oubliez pas de désinstaller l'ancien en amont:git checkout <new_name> ; git branch --unset-upstream
Miguel Ping

2
@ Le commentaire de MiguelPing est important. En essayant de renommer une branche, j'ai déjà poussé vers github, en supprimant, en renommant local, et en repoussant les résultats, l'ancien nom est à nouveau utilisé. Si je --unset-upstreamavant de repousser, cela fonctionne comme prévu.
Adam Tuttle

1
Existe-t-il un moyen d'éviter la fermeture automatique des RP ouverts sur l'ancienne branche de la télécommande? Face à cela dans gitlab, où le PR sur l'ancien nom de la branche a été fermé après avoir poussé à l'origine.
Himanshu Tanwar

142

Si vous avez nommé une branche de manière incorrecte ET que vous avez poussé cela vers le référentiel distant, procédez comme suit pour renommer cette branche (en fonction de cet article ):

  1. Renommez votre succursale locale:

    • Si vous êtes sur la branche que vous souhaitez renommer:
      git branch -m new-name

    • Si vous êtes dans une autre branche:
      git branch -m old-name new-name

  2. Supprimez la old-namebranche distante et appuyez sur la new-namebranche locale :
    git push origin :old-name new-name

  3. Réinitialisez la branche en amont pour la nouvelle branche locale :
    passez à la branche, puis:
    git push origin -u new-name


1
Après les 2 premières étapes, si vous obtenez un message d'erreur sur la branche actuelle qui pointe vers une branche inexistante sur le référentiel distant, la 3ème étape corrige cela
Kevin Hooke

1
@ Dr1Ku Besoin de connaître la différence entre git push <remote> --delete old_name& git push origin :old-name new-namepour supprimer une branche.
Ashutosh Chamoli

Utilisateurs BitBucket: corrigez l'erreur à l'étape 2 si vous renommez master, dans les détails du référentiel, définissez la branche par défaut sur nouvelle branche. L'erreur est:By default, deleting the current branch is denied, because the next 'git clone' won't result in any file checked out, causing confusion. You can set 'receive.denyDeleteCurrent' configuration variable to 'warn' or 'ignore' in the remote repository to allow deleting the current branch, with or without a warning message. To squelch this message, you can set it to 'refuse'. error: refusing to delete the current branch: refs/heads/master
Colin

le plus facile parmi d'autres
Abdulla Nilam

37

Il semble qu'il existe un moyen direct:

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

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

Renommer des succursales à distance dans Git

Voir la réponse originale pour plus de détails.


1
N'a pas fonctionné dans git 2.20.1Supprimé l'ancienne branche mais la nouvelle n'a pas été créée.
Paul Razvan Berg

26

Cela peut également être fait de la manière suivante.

Renommez d'abord la branche locale, puis la branche distante.

Renommer la branche locale:

Si vous êtes connecté dans une autre branche,

git branch -m old_branch new_branch 

Si vous êtes connecté dans la même branche,

git branch -m new_branch

Renommer une branche distante:

git push origin :old_branch    // Delete the remote branch

git push --set-upstream origin new_branch   // Create a new remote branch

5

Si vous avez déjà envoyé le mauvais nom à distance, procédez comme suit:

  1. Basculez vers la branche locale que vous souhaitez renommer

    git checkout <old_name>

  2. Renommer la branche locale

    git branch -m <new_name>

  3. Appuyez sur la <new_name>branche locale et réinitialisez la branche en amont

    git push origin -u <new_name>

  4. Supprimer la <old_name>branche distante

    git push origin --delete <old_name>

Cela était basé sur cet article .


4

Joindre un extrait simple pour renommer votre branche actuelle (locale et d'origine):

git branch -m <oldBranchName> <newBranchName>
git push origin :<oldBranchName>
git push --set-upstream origin <newBranchName>

Explication de git docs:

L' option git branch -m ou -M sera renommée. S'il y avait un reflog correspondant, il est renommé pour correspondre et une entrée de reflog est créée pour se souvenir du changement de nom de la branche. S'il existe, -M doit être utilisé pour forcer le changement de nom.

La spécification spéciale: (ou +: pour autoriser les mises à jour non rapides) demande à Git de pousser les branches "correspondantes": pour chaque branche qui existe du côté local, le côté distant est mis à jour si une branche du même nom existe déjà sur le côté distant.

--set-upstream Les informations de suivi de Set Up sont donc considérées comme la branche amont. Si non est spécifié, il correspond par défaut à la branche actuelle.


3

Il n'y a pas de méthode directe,

  1. Renommer la succursale locale ,

    Ma branche actuelle est maître

    git branch -m master_renamed #master_renamed est le nouveau nom du maître

  2. Supprimer la branche distante,

    git push origin --delete master #origin est remote_name

  3. Poussez la branche renommée dans la télécommande,

    git push origin master_renamed

C'est ça...


Nice et simple et seulement 3 étapes. La seule amélioration que je peux suggérer est git push -u origin master_renamedde définir la branche comme une branche de suivi
ut9081

2

Cela peut être fait même sans renommer la branche locale en trois étapes simples:

  1. Accédez à votre référentiel dans GitHub
  2. Créez une nouvelle branche à partir de l'ancienne branche que vous souhaitez renommer
  3. Supprimer l'ancienne branche

0

J'utilise ces alias git et il fait à peu près le travail automatiquement:

git config --global alias.move '!git checkout master; git branch -m $1 $2; git status; git push --delete origin $1; git status; git push -u origin $2; git branch -a; exit;'

Utilisation: git move FROM_BRANCH TO_BRANCH

Cela fonctionne si vous avez les noms par défaut comme maître, origine, etc. Vous pouvez modifier comme vous le souhaitez mais cela vous donne l'idée.


0

J'ai dû faire la tâche suivante pour renommer la branche locale et distante:

# Rename the local branch to the new name
git branch -m <old_name> <new_name>

#  Delete the old remote branch
git push origin --delete <old_name>

# push to new remote branch - creates new remote branch
git push origin <new_name>

# set new remote branch as default remote branch for local branch
git branch --set-upstream-to=origin/<new_name> <new_name>

En quoi est-elle différente de la réponse existante?
Himanshu Tanwar

0
  1. Renommez votre succursale locale. Si vous êtes sur la branche que vous souhaitez renommer:

    git branch -m nouveau-nom

Si vous êtes dans une autre branche:

git branch -m old-name new-name
  1. Supprimez l'ancienne branche distante et appuyez sur la nouvelle branche locale.

    git push origin: ancien nom nouveau nom

  2. Réinitialisez la branche en amont pour la branche locale de nouveau nom. Passez à la succursale puis:

    git push origin -u nouveau-nom

Tout est prêt!


0
  • Renommez votre succursale locale .

Si vous êtes sur la branche que vous souhaitez renommer:

git branch -m new-name

si vous restez sur une branche différente à l'heure actuelle:

git branch -m old-name new-name
  • Supprimez l'ancienne branche distante et appuyez sur la nouvelle branche locale.

Restez sur la branche cible et:

git push origin :old-name new-name
  • Réinitialisez la branche en amont pour la branche locale de nouveau nom.

Basculez vers la branche cible puis:

git push origin -u new-name
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.