Question Pourquoi dois-je faire `--set-upstream` tout le temps?


Je crée une nouvelle branche dans Git:

git branch my_branch

Poussez-le:

git push origin my_branch

Maintenant, dites que quelqu'un a fait quelques changements sur le serveur et que je veux tirer de origin/my_branch. Je fais:

git pull

Mais je reçois:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

J'ai appris que je peux le faire fonctionner avec:

git branch --set-upstream my_branch origin/my_branch

Mais pourquoi dois-je faire cela pour chaque branche que je crée? N'est-il pas évident que si je pousse my_branch dans origin/my_branch, alors je voudrais tirer origin/my_branch dans my_branch? Comment puis-je en faire le comportement par défaut?


1057
2018-05-22 16:39


origine


Réponses:


Un raccourci qui ne dépend pas de la mémorisation de la syntaxe git branch --set-upstream  1 est de faire:

git push -u origin my_branch

... la première fois que vous appuyez sur cette branche. Vous avez seulement besoin de le faire une fois, et cela établit l'association entre votre branche et celle de origin de la même façon que git branch --set-upstream Est-ce que.

Personnellement, je pense que c'est une bonne chose d'avoir à configurer explicitement cette association entre votre branche et celle de la télécommande. C'est juste dommage que les règles soient différent pour git push et git pull.


1 Cela peut sembler stupide, mais j'oublie très souvent de spécifier la branche actuelle, en supposant que c'est la valeur par défaut - ce n'est pas le cas, et les résultats sont les plus confus :)

Mise à jour 2012-10-11: Apparemment, je ne suis pas la seule personne qui a trouvé facile de se tromper! Grâce à VonC pour souligner que git 1.8.0 introduit le plus évident git branch --set-upstream-to, qui peut être utilisé comme suit, si vous êtes dans la branche my_branch:

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

... ou avec l'option courte:

git branch -u origin/my_branch

Ce changement et son raisonnement sont décrits dans les notes de version pour git 1.8.0, release candidate 1:

C'était tentant de dire git branch --set-upstream origin/master, mais cela dit à Git d'organiser la branche locale origin/master s'intégrer à la branche actuellement vérifiée, ce qui est très improbable pour l'utilisateur. L'option est obsolète. utilise le nouveau --set-upstream-to (avec un court et doux -u) option à la place.


1199
2018-05-22 16:58



Vous pouvez y arriver avec moins de frappe. Premièrement, changez la façon dont votre poussée fonctionne:

git config --global push.default current

Cela permettra d'inférer le origin my_branch partie, donc vous pouvez faire:

git push -u

Ce qui créera la branche distante avec le même nom et le suivra.


962
2018-04-08 10:14



Vous pouvez simplement

git checkout -b my-branch origin/whatever

en premier lieu. Si vous définissez branch.autosetupmerge ou branch.autosetuprebase (mon préféré) à always (par défaut est true), my-branch suivra automatiquement origin/whatever.

Voir git help config.


70
2018-03-17 20:04



Vous pouvez configurer le flux amont de deux façons. D'abord lorsque vous créez la branche:

git branch -u origin/my-branch

ou après avoir créé une branche, vous pouvez utiliser cette commande.

git push -u origin/my-branch

Vous pouvez également effectuer des branchements, des extractions et des mises en place en amont dans une seule commande:

git checkout -b my-branch -t origin/my-branch

Ma préférence personnelle est de le faire dans une commande en deux étapes:

git checkout -b my-branch
git push -u origin/my-branch

44
2018-03-17 13:28



Vous pouvez utiliser:

git config --global branch.autosetupmerge toujours

qui liera la branche en amont chaque fois que vous créez ou achetez une nouvelle branche.

Voir https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Cela fonctionne également avec autosetuprebase, si vous suivez un flux de travail centré sur le rebasage, mais ne l'utilisez pas, à moins de savoir ce que vous faites, car cela entraînera un rebasement de votre comportement, ce qui peut provoquer des résultats bizarres.


36
2018-04-28 20:05



En passant, le raccourci pour pousser la branche actuelle vers une télécommande avec le même nom:

$ git push -u origin HEAD

29
2017-09-15 14:20



Ceci est mon utilisation la plus courante pour La baise.

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

En outre, il est amusant de taper des mots dans votre terminal.


27
2017-11-15 17:22



git branch --set-upstream-to=origin/master<branch_name>

11
2018-06-30 04:39



Vous pouvez également dire explicitement à git de tirer quelle branche distante tirer (comme cela est mentionné dans le message d'erreur):

git pull <remote-name> <remote-branch>

Soyez prudent avec ceci, cependant: Si vous êtes sur une branche différente et que vous faites un pull explicite, la refspec que vous tirez sera fusionnée dans la branche où vous vous trouvez!


8
2018-03-20 14:41



Pour ce que cela vaut, si vous essayez de suivre une branche qui existe déjà sur la télécommande (par exemple, origin / somebranch) mais que vous ne l'avez pas encore vérifiée localement, vous pouvez faire:

$ git checkout --track origin/somebranch

Note: '-t' est la version raccourcie de l'option '--track'.

Cela crée la même association dès le départ.


8
2017-12-08 16:11



J'utilise cet alias Git au lieu de copier / coller la suggestion de Git à chaque fois: https://gist.github.com/ekilah/88a880c84a50b73bd306

Source copiée ci-dessous (ajoutez ceci à votre ~/.gitconfig fichier):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

7
2017-08-27 23:10