Comment puis-je pousser facilement une branche Git locale vers une télécommande avec un nom différent?

175

Je me suis demandé s'il existe un moyen facile de pousser et de tirer une branche locale avec une branche distante avec un nom différent sans toujours spécifier les deux noms.

Par exemple:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Maintenant, si quelqu'un met à jour remote_branch_name, je peux:

$ git pull

Et tout est fusionné / accéléré. Cependant, si j'apporte des modifications à mon "newb" local, je ne peux pas:

$ git push

Au lieu de cela, je dois:

% git push origin newb:remote_branch_name

Cela semble un peu idiot. Si git-pullutilisé git-config branch.newb.mergepour déterminer d'où extraire, pourquoi ne pourrait pas git-pushavoir une option de configuration similaire? Y a-t-il un bon raccourci pour cela ou devrais-je simplement continuer le long chemin?

jmacdonagh
la source

Réponses:

93

Sûr. Réglez simplement votre push.defaultsur upstreampour pousser les branches vers leur amont (qui est le même que celui qui pullsera extrait, défini par branch.newb.merge), plutôt que de pousser les branches vers celles qui correspondent à leur nom (qui est le paramètre par défaut pour push.default, matching).

git config push.default upstream

Notez que cela trackingn'était pas appelé upstreamavant Git 1.7.4.2, donc si vous utilisez une ancienne version de Git, utilisez à la trackingplace. L' push.defaultoption a été ajoutée dans Git 1.6.4, donc si vous utilisez une version plus ancienne que celle-ci, vous n'aurez pas du tout cette option et devrez spécifier explicitement la branche vers laquelle pousser.

Brian Campbell
la source
C'était ça! Cela s'applique à toutes les succursales qui effectuent un suivi, mais c'est très bien. Merci!
jmacdonagh
Je serais intéressé de savoir s'il existe un raccourci pour le nom de la succursale que j'ai vérifié. Je pourrais simplement vouloir git push buildserver .:test_thisoù le .sera le nom de la succursale locale que je ne connais pas nécessairement. Je pourrais le chercher, bien sûr, mais s'il y avait une main courte, comme le point, pour ça, ce serait cool.
Frederick Nord
2
@FrederickNord HEADest la sténographie que vous recherchez. HEADest ce qui pointe vers la branche actuellement extraite, ou directement vers un commit particulier si vous avez une tête détachée.
Brian Campbell
Merci! Cela a corrigé l' Updates were rejected because a pushed branch tip is behind its remoteerreur pour moi. Mon dépôt local était à jour, mais les noms étaient simplement différents.
canhazbits
171

Lorsque vous effectuez le push initial, ajoutez le paramètre -u :

git push -u origin my_branch:remote_branch

Les poussées suivantes iront où vous le souhaitez.

ÉDITER:

Selon le commentaire, cela ne met en place que pull.

git branch --set-upstream

devrait le faire.

Adam Dymitruk
la source
7
-udéfinit simplement l'amont, qui, selon la question, est déjà défini. Il doit mettre push.defaultà upstrempour pouvoir pushrespecter le paramètre en amont, car par défaut, c'est le pullcas.
Brian Campbell
2
Cela ne semble pas fonctionner - du moins pas sur les versions jamais de git
Thomas Watson
git branch --set-upstream ne nécessite que la configuration pull "pushRemote" après cela.
wheredidthatnamecomedu
Je ne pense pas que ce git branch --set-upstreamsoit nécessaire. Remarque: mon git --versionest 2.17.1.
Gabriel Staples
15

La commande d' Adam est désormais obsolète. Vous pouvez utiliser:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

pour définir la branche amont de my_local_branchà origin/my_remote_branch.

jobin
la source
6
Pouvez-vous fournir un lien soutenant les informations que vous partagez sur le fait que -u est obsolète? La documentation de la dernière version concernant push sur git-scm.com semble suggérer qu'elle est à jour. Merci d'avance - il pourrait être très utile aux lecteurs de suivre pour plus d'informations.
Kay V du
D'accord avec @KayV, en particulier que j'ai reçu ce message en essayant de créer une nouvelle branche distante avec un nom différent de ma branche locale: `` Si vous envisagez de déployer une nouvelle branche locale qui suivra son homologue distant, vous voudrez peut-être utiliser "git push -u" pour définir la configuration en amont lorsque vous poussez. '
FBB
0

Voici le processus qui a fonctionné pour moi.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Maintenant, votre nouveau dépôt sera «origine» et le dépôt d'origine est «en amont». Confirmez-le en exécutant git remote -v. (Note latérale: Upstream est utilisé pour récupérer à partir du dépôt d'origine - afin de garder votre copie locale synchronisée avec le projet auquel vous souhaitez contribuer - et origin est utilisé pour tirer et pousser puisque vous pouvez contribuer à votre propre dépôt).

git push origin master

Le maître de votre nouveau référentiel distant (sur Github) sera maintenant synchronisé avec le maître d'origine, mais il n'aura aucune des branches de fonctionnalités.

git rebase upstream/branch-name
git push origin master

Rebase est une fusion intelligente. Ensuite, poussez à nouveau pour maîtriser et vous verrez la branche de fonctionnalité sélectionnée comme maître sur le nouveau référentiel.

Optionnel:

git remote rm upstream
git remote add upstream new-repo-url
Urubuz
la source
0

Je rencontre le même problème depuis un certain temps déjà. J'ai enfin une série de déclarations, donc je n'ai pas à faire à git push origin local:remotechaque fois. J'ai suivi ces:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Après avoir configuré en amont une branche distante avec un nom différent (1ère ligne), puis l'avoir défini en amont par défaut (2ème ligne), la 3ème ligne obéira maintenant à ces règles et poussera vers l'amont.

messmanie
la source