Comment changer la télécommande d'une succursale?

675

Le centralréférentiel devait être configuré sur un nouveau serveur, j'ai donc créé une nouvelle télécommande sur mon référentiel local et j'ai poussé à cela.

Mais maintenant, quand je le fais git pull, il prétend que je suis à jour. C'est faux - cela me parle de l' ancienne branche distante, pas de la nouvelle, que je sais pour un fait a de nouveaux engagements à récupérer.

Comment puis-je changer ma succursale locale pour suivre une autre télécommande?

Je peux voir cela dans le fichier de configuration git mais je ne veux pas gâcher les choses.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master
joachim
la source
1
J'ai modifié votre titre - vous essayez en fait de changer la télécommande que vous suivez, mais vous suivez toujours le même nom de branche.
Cascabel
5
Il est difficile de considérer cela comme un doublon de Comment faire pour qu'une branche Git existante suive une branche distante? . Cette question ne spécifie pas que la branche suit déjà une branche distante. Celui-ci le fait.
1
me semble que la modification du fichier de configuration est la manière la plus simple et la plus sûre de procéder à ce sujet
Steven Lu

Réponses:

1082

Utilisation de git v1.8.0 ou version ultérieure:

git branch branch_name --set-upstream-to your_new_remote/branch_name

Ou vous pouvez utiliser le -ucommutateur:

git branch branch_name -u your_new_remote/branch_name

En utilisant git v1.7.12 ou antérieur:

git branch --set-upstream branch_name your_new_remote/branch_name

urschrei
la source
2
C'est ce que je cherchais - changé la branche de suivi à distance pour la branche donnée. Merci!
joachim
7
Ah, ma mauvaise. Je le ferais toujours via config, car vous pouvez être sûr de ne pas changer accidentellement le nom de la branche, mais tout va bien. +1.
Cascabel
D'après les notes de publication de la version 1.8.0 : "Il était tentant de dire" git branch --set-upstream origin / master ", mais cela indique à Git d'arranger la branche locale" origin / master "pour l'intégrer à la branche actuellement extraite, ce qui est très peu probable ce que l'utilisateur voulait dire. L'option est déconseillée; utilisez plutôt la nouvelle option "--set-upstream-to" (avec une option courte et douce "-u"). "
Jared Beck
Si propre ;_; Je pourrais réparer le petit désordre que j'ai créé si facilement! Merci =))
Aditya MP
56
Si la branche de suivi à distance n'existe pas encore mais qu'une branche de suivi à distance existante est actuellement suivie, elle ne peut pas être remplacée par la nouvelle branche de suivi à distance inexistante. Vous devez d'abord désactiver la branche de suivi à distance actuelle: git branch --unset-upstream- puis cela fonctionne comme indiqué dans cette réponse (ou avec la suivante git push -u / --set-upstream).
hakre
88

Pour moi, la solution était:

git remote set-url origin https://some_url/some_repo

Alors:

git push
critikaster
la source
3
C'est ainsi que Github dit de le faire. help.github.com/articles/changing-a-remote-s-url
fsharp
18
En fait, cela change où se trouve la télécommande, cela ne change pas la télécommande que vous suivez (techniquement) - vous suivez toujours "l'origine", cela met simplement à jour la définition de l'origine. Pour certains cas d'utilisation, cela pourrait être une mauvaise chose. Supposons que vous exécutez jQuery et créez une nouvelle télécommande. "origine" est votre fork, "en amont" est jQuery. Supposons ensuite que vous ayez besoin de suivre temporairement le dépôt d'origine au lieu de votre fork. Si vous l' set-urlgit push
utilisiez
42

Avec un git à jour (2.5.5), la commande est la suivante:

git branch --set-upstream-to=origin/branch

Cela mettra à jour la branche suivie à distance pour votre branche locale actuelle

Ko2r
la source
3
Hitting a git branch --set-upstream-to=origin/developsoulevé l'erreur: error: the requested upstream branch 'origin/develop' does not exist. Auparavant, j'ai renommé une branche distante à développer.
belgoros
1
@belgoros git fetch --allpeut-être?
Gabriel Devillers
25

Une autre option pour avoir beaucoup de contrôle sur ce qui se passe est d'éditer vos configurations à la main:

git config --edit

ou la sténographie

git config -e

Modifiez ensuite le fichier à volonté, enregistrez et vos modifications seront appliquées.

wranvaud
la source
1
Cela m'a sauvé la journée. Merci!
Martyn Chamberlin
Mon problème était qu'il y avait deux origines. (origine et origine-algo). Mais le maître local traquait "origin-algo". Mais je voulais qu'il suive "l'origine". La seule façon de changer cela était en modifiant la configuration git.
Aswin Prasad
19

Si vous êtes sain d'esprit, la modification du fichier de configuration est suffisamment sûre. Si vous voulez être un peu plus paranoïaque, vous pouvez utiliser la commande porcelaine pour le modifier:

git config branch.master.remote newserver

Bien sûr, si vous regardez la configuration avant et après, vous verrez qu'elle a fait exactement ce que vous alliez faire.

Mais dans votre cas individuel, ce que je ferais, c'est:

git remote rename origin old-origin
git remote rename new-origin origin

Autrement dit, si le nouveau serveur doit être la télécommande canonique, pourquoi ne pas l'appeler origine comme si vous l'aviez cloné à l'origine?

Cascabel
la source
3
J'avais fait cela avant de rencontrer ce problème - git était intelligent et a transféré le changement de nom à distance dans le fichier de configuration, donc dans votre exemple, mon fichier de configuration a dit 'ancienne origine'.
joachim
Personnellement, je pense que cette façon a plus de sens conceptuellement que la façon acceptée, mais je suppose qu'elles sont fonctionnellement équivalentes, n'est-ce pas?
Evan Donovan
1
@Jefromi: A remote renamene ferait pas ce qui est demandé car il change le nom de la télécommande à la fois dans les [remote]configurations et dans les [branch]configurations. Donc, ce que l'on doit faire dans ce cas est d'éditer le fichier de configuration et de faire ce que vous dites (renommer les télécommandes) juste au niveau des [remote]lignes de configuration.
Sumeet Pareek
7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

ou

git fetch
git checkout -b local_branch_name origin/branch_name
uma
la source
Pour mon cas, j'avais besoin git fetch. J'avais créé une nouvelle branche dans bitbucket et je voulais y passer. git ne connaît pas les changements à distance, donc je devais le faire git fetchavant git checkout feature/new-feature-branch. J'espère que ceci aide quelqu'un d'autre.
TelamonAegisthus
6

C'est la commande la plus simple:

git push --set-upstream <new-origin> <branch-to-track>

Par exemple, étant donné que la commande git remote -vproduit quelque chose comme:

origin  ssh://[email protected]/~myself/projectr.git (fetch)
origin  ssh://[email protected]/~myself/projectr.git (push)
team    ssh://[email protected]/vbs/projectr.git (fetch)
team    ssh://[email protected]/vbs/projectr.git (push)

Pour passer au suivi de l'équipe à la place:

git push --set-upstream team master
Andries
la source
La branche à suivre est facultative lorsqu'il n'y a rien d'ambigu. J'ai utilisé votre suggestion pour vous éloigner de Github;) Merci.
gouessej
4

Vous pouvez soit supprimer votre branche actuelle et faire:

git branch --track local_branch remote_branch

Ou changez le changement de serveur distant en serveur actuel dans la configuration

RDL
la source
n'a pas fonctionné pour moi, seule la commande de travail était celle de @uma: git checkout --track -b local_branch_name origin/branch_name
Saad Benbouzid
2

D'après ce que je comprends de la dernière documentation git , le synopsis est:

git branch -u upstream-branch local-branch
git branch --set-upstream-to=upstream-branch local-branch

Cet usage semble être un peu différent de la réponse d'Urschrei, car dans son synopsis:

git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

Je suppose qu'ils ont encore changé la documentation?

Arshan Khanifar
la source
1

Dans la dernière version de git comme 2.7.4 ,

git checkout branch_name # nom de la branche que vous souhaitez modifier la branche de suivi

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - nom distant

Mohideen bin Mohammed
la source
1

J'ai trouvé le post de @critikaster utile, sauf que j'ai dû exécuter ces commandes avec GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master
user8128167
la source
0

la façon la plus simple est de simplement pousser vers la nouvelle branche:

git push -u branche / nom d'origine

ArthNRick
la source