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?
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 localeorigin/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
).
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.
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
.
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
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.
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.
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
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!
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.
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"
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
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"
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
vous pouvez aussi faire git push -u origin $(current_branch)
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.
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.
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