web-dev-qa-db-fra.com

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, disons que quelqu'un a fait des changements sur le serveur et que je veux extraire 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 le faire pour chaque branche que je crée? N'est-il pas évident que si je pousse my_branch dans Origin/my_branch, je voudrais alors extraire Origin/my_branch dans my_branch? Comment puis-je en faire le comportement par défaut?

1300
Ram Rachum

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

git Push -u Origin my_branch

... la première fois que vous poussez cette branche. Ou bien, appuyez sur la branche actuelle vers une branche du même nom (pratique pour un alias):

git Push -u Origin HEAD

Il vous suffit d'utiliser -u une seule fois, ce qui configure l'association entre votre branche et celle de Origin de la même manière que git branch --set-upstream.

Personnellement, je pense que c’est une bonne chose de devoir établir explicitement cette association entre votre branche et celle de la télécommande. Dommage que les règles soient différentes pour git Push et git pull .


1 Cela peut paraître idiot, mais j'oublie très souvent de spécifier la branche actuelle, en supposant que ce soit la valeur par défaut - ce n'est pas le cas, et les résultats sont très déroutants :)

Mise à jour 2012-10-11 : Apparemment, je ne suis pas la seule personne à avoir trouvé ça facile de se tromper! Merci à VonC pour avoir signalé 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

Cette modification et son raisonnement sont décrits dans la section notes de version de git 1.8.0, version candidate 1 :

Il était tentant de dire git branch --set-upstream Origin/master, mais cela dit à Git d'arranger la branche locale Origin/master pour qu'elle s'intègre à la branche actuellement extraite, ce qui est très peu probable de ce que l'utilisateur voulait dire. L'option est obsolète. utilisez plutôt la nouvelle option --set-upstream-to (avec un raccourci-doux -u).

1408
Mark Longair

Vous pouvez y arriver avec moins de frappe. Tout d’abord, changez le fonctionnement de votre Push:

git config --global Push.default current

Ceci déduira la partie Origin my_branch, ainsi vous pourrez faire:

git Push -u

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

1188
Zamith

Vous pouvez simplement

git checkout -b my-branch Origin/whatever

en premier lieu. Si vous définissez branch.autosetupmerge ou branch.autosetuprebase (mon favori) sur always (la valeur par défaut est true), my-branch suivra automatiquement Origin/whatever.

Voir git help config.

83
cdunn2001

Vous pouvez configurer en amont plus simple de deux manières. 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 créer des branches, extraire et configurer en amont en une seule commande:

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

Personnellement, je préfère faire ceci en une commande en deux étapes:

git checkout -b my-branch
git Push -u Origin my-branch
73
Tzen

Ceci est mon utilisation la plus courante pour The Fuck .

$ 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 gros mots sur votre terminal.

58
Tamlyn

Vous pouvez utiliser:

git config --global branch.autosetupmerge toujours

qui reliera la branche en amont chaque fois que vous créez ou extrayez 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 plus axé sur la rebase, mais ne l'utilisez pas à moins que vous ne sachiez ce que vous faites, car votre comportement d'extraction par défaut sera rebase, ce qui peut entraîner des résultats étranges.

41
Daniel

A propos, le raccourci pour pousser la branche actuelle vers une télécommande du même nom:

$ git Push -u Origin HEAD
36
djanowski

Personnellement, j'utilise ces alias suivants dans Bash

dans le fichier ~/.gitconfig

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

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

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
12
Amrit Shrestha
git branch --set-upstream-to=Origin/master<branch_name>
11
user3693546

Pour ce que cela vaut, si vous essayez de suivre une branche qui existe déjà sur la télécommande (par exemple, Origin/une branche) mais que vous n'avez pas encore extrait localement, vous pouvez le faire:

$ git checkout --track Origin/somebranch

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

Cela met en place la même association dès le départ.

10
mattacular

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"
9
manroe

Vous pouvez aussi explicitement indiquer à git pull quelle branche distante extraire (comme il est mentionné dans le message d'erreur):

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

Soyez prudent avec ceci, cependant: si vous êtes sur une autre branche et effectuez un tirage explicite, le refspec que vous tirez sera fusionné dans la branche sur laquelle vous vous trouvez!

9
mtbkrdave

Vous pouvez créer un très bon alias capable de gérer cela sans la syntaxe trop détaillée.

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

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

Après avoir validé une nouvelle branche, vous pouvez envoyer votre nouvelle branche en tapant simplement la commande suivante:

git po
7
123

Si le ci-dessous ne fonctionne pas:

git config --global Push.default current

Vous devez également mettre à jour la configuration locale de votre projet, car il est possible que votre projet dispose de configurations git locales:

git config --local Push.default current
5
youngrrrr

Pour ceux qui recherchent 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 de courir:

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

Et vous êtes prêt à partir

3
jchavannes

Parce que git a la capacité de pousser/tirer différentes branches vers différents référentiels "en amont". Vous pouvez même utiliser des référentiels distincts pour pousser et tirer - sur la même branche. Cela peut créer un flux distribué à plusieurs niveaux, ce qui peut être utile pour des projets tels que le noyau Linux. Git a été à l'origine construit pour être utilisé sur ce projet.

Par conséquent, il n’est pas possible de savoir quelle pension votre succursale devrait suivre.

D'un autre côté, la plupart des gens n'utilisent pas git de cette façon, ce qui pourrait bien justifier une option par défaut.

Git est généralement assez bas et cela peut être frustrant. Pourtant, il existe des interfaces graphiques et il devrait être facile d'écrire des scripts d'assistance si vous souhaitez toujours l'utiliser à partir du shell.

2
Rolf

Vous pouvez aussi faire git Push -u Origin $(current_branch)

2
ourmaninamsterdam

Nous utilisons un phabricateur et n’appuyons pas sur git. Je devais créer bash alias qui fonctionne sous Linux/mac

vim ~/.bash_aliases

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

enregistrer

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
0
om471987

J'ai en quelque sorte redécouvert legit à cause de ce problème (OS X uniquement). Maintenant, tout ce que j'utilise lors de la création de branches sont ces deux commandes:

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

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

SublimeGit est livré avec le support legit par défaut, ce qui rend la routine de branchement aussi simple que d'appuyer sur Ctrl-b.

0
Benny K

Voici un alias bash pour git Push qui peut être exécuté en toute sécurité et qui bascule automatiquement entre les réglages en amont de la première poussée et les poussées normales par la suite.

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git Push -u Origin $(git symbolic-ref --short HEAD) || git Push'

Poste originale

0
Loren