Pourquoi est-ce que j'ai besoin de faire "--set-upstream " tout le temps?

je crée une nouvelle branche dans Git:

git branch my_branch

Pousser:

git push origin my_branch

maintenant, dites que quelqu'un a fait quelques changements sur le serveur et 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 faire pour que ce soit le comportement par défaut?

1094
demandé sur Ram Rachum 2011-05-22 20:39:49

18 réponses

un raccourci, qui ne dépend pas de se rappeler la syntaxe pour git branch --set-upstream 1 est à faire:

git push -u origin my_branch

... la première fois que tu pousses cette branche. Ou, pour le pousser à la branche courante à une branche du même nom (très pratique pour un alias):

git push -u origin HEAD

vous n'avez besoin d'utiliser -u qu'une seule fois, et cela établit l'association entre votre branche et celle de origin de la même manière que git branch --set-upstream ne.

personnellement, je pense que c'est une bonne chose d'avoir à mettre en place cette association entre votre branche et une sur la télécommande explicitement. C'est dommage que les règles soient différentes pour git push et git pull .


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

mise à jour 2012-10-11 : apparemment, Je ne suis pas la seule personne qui a trouvé facile de se tromper! Merci à VonC pour avoir souligné que git 1.8.0 introduit le plus évident git branch --set-upstream-to , qui peut être utilisé comme suit, si vous êtes sur 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, est décrit dans les notes de version pour git 1.8.0, version candidat 1 :

il était tentant de dire git branch --set-upstream origin/master , mais cela dit à Git d'organiser la branche locale origin/master pour s'intégrer avec la branche actuellement cochée, ce qui est très peu probable ce que l'Utilisateur a voulu dire. L'option est dépréciée; utilisez plutôt la nouvelle option --set-upstream-to (avec un court-et-doux -u ).

1234
répondu Mark Longair 2018-09-02 04:32:14

vous pouvez faire cela avec moins de Dactylographie. Tout d'abord, changez la façon dont votre push fonctionne:

git config --global push.default current

cela va inférer la partie origin my_branch , donc vous pouvez faire:

git push -u

qui va à la fois créer la branche distante avec le même nom et la suivre.

996
répondu Zamith 2014-04-08 10:14:04

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 .

72
répondu cdunn2001 2013-06-06 22:33:24

vous pouvez configurer plus simple en amont de deux façons. D'abord quand vous créez la branche:

git branch -u origin/my-branch

ou après avoir créé une direction générale, vous pouvez utiliser cette commande.

git push -u origin/my-branch

vous pouvez également brancher, vérifier et régler en amont dans une seule commande:

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

ma préférence personnelle est de faire ceci dans une commande en deux étapes:

git checkout -b my-branch
git push -u origin/my-branch
48
répondu Tzen 2016-12-02 22:24:12

vous pouvez utiliser:

git config --global de la branche.autosetupmerge always

qui reliera la branche 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 aussi avec autosetuprebase, si vous suivez un plus concentré de rebase workflow, mais ne l'utilisez que si vous savez ce que vous faites, car il sera par défaut votre pull behavior à rebase, ce qui peut causer des résultats étranges.

36
répondu Daniel 2015-04-28 20:05:12

C'est mon usage le plus courant pour Le Baiser .

$ 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.
...

aussi, c'est amusant de taper des jurons dans votre terminal.

32
répondu Tamlyn 2017-11-15 17:22:02

soit dit en passant, le raccourci pour pousser la branche courante vers une télécommande du même nom:

$ git push -u origin HEAD
29
répondu djanowski 2016-09-15 14:20:30
git branch --set-upstream-to=origin/master<branch_name>
11
répondu 2015-06-30 04:39:16

vous pouvez aussi dire explicitement à git pull quelle branche distante tirer (comme il est mentionné dans le message d'erreur):

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

attention cependant: si vous êtes sur une autre branche et faites une traction explicite, le refspec que vous tirez sera fusionné dans la branche sur laquelle vous êtes!

8
répondu mtbkrdave 2012-03-20 14:41:17

Pour ce qu'il vaut, si vous êtes en train de suivre une direction générale qui existe déjà sur la télécommande (par exemple. origine / somebranch) mais n'ont pas encore vérifié localement, vous pouvez le faire:

$ git checkout --track origin/somebranch

Note: '- t' est la version abrégée de l'option '--track'.

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

8
répondu mattacular 2013-12-08 16:11:01

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 fichier ~/.gitconfig ):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"
7
répondu manroe 2016-02-28 05:07:32

vous pouvez configurer un très bon alias qui peut gérer cela sans la syntaxe excessivement verbeuse.

j'ai l'alias suivant dans ~/.gitconfig :

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

Après avoir fait un commit sur une nouvelle branche, vous pouvez pousser votre nouvelle branche simplement en tapant la commande:

git po
7
répondu 123 2017-04-26 18:41:52

j'utilise personnellement ces alias suivants dans bash

dans ~/.gitconfig fichier

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

et dans ~/.basehrc ou ~/.zshrc fichier

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
4
répondu Amrit Shrestha 2018-07-12 05:09:22

pour ceux qui cherchent un alias qui fonctionne avec git pull , voici ce que j'utilise:

alias up="git branch | awk '/^\* / { print $2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

maintenant chaque fois que vous obtenez:

$ git pull
There is no tracking information for the current branch.
...

il suffit d'exécuter:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

Et vous êtes bon pour aller

3
répondu jchavannes 2018-05-01 21:52:34

vous pouvez aussi faire git push -u origin $(current_branch)

2
répondu ourmaninamsterdam 2017-10-27 08:50:37

parce que git a la faculté de pousser/tirer différentes branches vers différents dépôts" en amont". Vous pouvez même utiliser des dépôts séparés pour pousser et tirer sur la même branche. Cela peut créer un flux distribué à plusieurs niveaux, je peux voir que c'est utile sur un projet tel que le noyau Linux. Git a été construit à l'origine pour être utilisé sur ce projet.

par conséquent, il ne fait pas de supposition au sujet de la pension que votre succursale devrait suivre.

d'un autre côté, la plupart des gens n'utilisent pas git de cette façon, il pourrait donc faire un bon cas pour une option par défaut.

Git est généralement assez faible et il peut être frustrant. Pourtant, il y a des interfaces graphiques et il devrait être facile d'écrire des scripts d'aide si vous voulez toujours l'utiliser à partir de l'interpréteur de commandes.

1
répondu Rolf 2017-10-16 11:49:26

j'ai en quelque sorte redécouvert legit à cause de ce problème (OS X seulement). Maintenant, tout ce que j'utilise pour brancher sont ces deux commandes:

legit publish [<branch>] Publie branche de la télécommande. (alias: pub )

legit unpublish <branch> Supprime la branche de la télécommande. (alias: unp )

SublimeGit fourni avec legit prise en charge par défaut, ce qui rend toute la routine de branchement aussi facile que de presser Ctrl-B.

0
répondu Benny K 2017-11-09 15:11:34

nous utilisons phabricator et ne poussons pas en utilisant git. J'ai du Créer bash alias qui fonctionne sur Linux / mac

vim ~/.bash_aliases

new_branch() {
    git checkout -b ""
    git branch --set-upstream-to=origin/master ""
}

enregistrer

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
0
répondu om471987 2018-04-26 15:40:05