Que fait exactement le «u»? «Git push -u origin master» vs «git push origin master»

335

Je suis apparemment horrible à utiliser git, malgré mes meilleures tentatives pour le comprendre.

De kernel.org pour git push:

-u

- en amont

Pour chaque branche qui est à jour ou poussée avec succès, ajoutez une référence en amont (suivi), utilisée par git-pull (1) sans argument et d'autres commandes. Pour plus d'informations, voir branch.<name>.mergedans git-config (1).

Voici branch.<name>.mergede git config:

branch.<name>.merge

Définit, conjointement avec branch.<name>.remote, la branche amont pour la branche donnée. Il indique à git fetch / git pull quelle branche fusionner et peut également affecter git push (voir push.default). Lorsqu'il est en branche <name>, il indique à git fetch la spécification par défaut à marquer pour la fusion dans FETCH_HEAD. La valeur est gérée comme la partie distante d'une spécification de référence et doit correspondre à une référence extraite de la distance donnée par "branch.<name>.remote". Les informations de fusion sont utilisées par git pull (qui appelle d'abord git fetch) pour rechercher la branche par défaut pour la fusion. Sans cette option, git pull utilise par défaut la fusion de la première refspec récupérée. Spécifiez plusieurs valeurs pour obtenir une fusion de poulpe. Si vous souhaitez configurer git pull pour qu'il fusionne <name>avec une autre branche du référentiel local, vous pouvez pointerbranch.<name>.mergejusqu'à la branche souhaitée et utilisez le réglage spécial. (une période) pour branch.<name>.remote.

J'ai réussi à configurer un référentiel distant avec github, et j'ai réussi à pousser mon premier commit avec:

git push -u origin master

Ensuite, j'ai involontairement réussi à pousser mon deuxième commit vers mon référentiel distant en utilisant:

git commit -m '[...]'

Cependant, pensant à tort que je devrais repousser vers originde master, j'ai couru:

# note: no -u
git push origin master

Qu'est-ce que cela a fait? Cela ne semblait avoir aucun effet. Ai-je "défait" git push -u origin master?

FermetureCowboy
la source
45
I'm apparently terrible at using git, despite my best attempts to understand it.- Je n'ai jamais vu quelqu'un me recréer aussi bien.
dgo

Réponses:

336

La clé est "git-pull sans argument". Lorsque vous effectuez une opération git pulldepuis une branche, sans spécifier de source distante ou de branche, git examine le branch.<name>.mergeparamètre pour savoir d'où extraire. git push -udéfinit ces informations pour la branche que vous appuyez.

Pour voir la différence, utilisons une nouvelle branche vide:

$ git checkout -b test

Tout d'abord, nous poussons sans -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.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 "test"]
    remote = <nickname>
    merge = <remote-ref>

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

See git-config(1) for details.

Maintenant, si nous ajoutons -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Notez que les informations de suivi ont été configurées pour que cela git pullfonctionne comme prévu sans spécifier la télécommande ou la branche.

Mise à jour: conseils bonus:

  • Comme Mark le mentionne dans un commentaire, en plus de git pullce paramètre affecte également le comportement par défaut de git push. Si vous avez l'habitude d'utiliser -upour capturer la branche distante que vous souhaitez suivre, je recommande de définir votre push.defaultvaleur de configuration sur upstream.
  • git push -u <remote> HEADpoussera la branche actuelle vers une branche du même nom <remote>(et configurera également le suivi pour que vous puissiez le faire git pushensuite).
dahlbyk
la source
4
git push <remote> <branch>rend les choses sans ambiguïté . Si vous laissez le git distant ou de branche se replie sur les paramètres de configuration de branche, qui sont définis pour vous avec git push -u.
dahlbyk
2
@dahlbyk Je suis allé de l'avant et je vous ai marqué comme réponse, mais ce commentaire m'embrouille quelque peu. Dans votre réponse, vous avez démontré que git était confus après git push origin test(ce qui n'est pas le cas -u). Vous avez ensuite montré que cela git push -u origin test supprimait l'ambiguïté. Y a-t-il une faute de frappe, ou suis-je simplement redevenu dense?
ClosureCowboy
1
Je pense que nous parlons les uns aux autres. :) Quand je dis git push <remote> <branch>est sans ambiguïté, je veux dire celui par rapport git pushauquel s'appuie sur la config de branche. De même, git pull <remote> <branch>est sans ambiguïté et git pullrepose sur la configuration de branche. Une fois que vous avez poussé avec -u, à la fois git pushet git pullfonctionnera comme prévu.
dahlbyk
10
@dahlbyk: Votre réponse est correcte, mais dans vos commentaires ci-dessus, vous répétez une idée fausse commune à propos git push- à moins que vous ne vous définissiez push.defaultvous-même, git pushutilise uniquement la configuration de branche en amont pour décider vers quelle télécommande pousser, pas la branche distante à mettre à jour.
Mark Longair
1
La meilleure pratique pour git est git push origin masteret la même chose pour l'autre côté IE. git pull origin master.. Donc, si vous supposez un changement de branche, vous pouvez git push origin branch_namele faire de même pour l'autre côté IE. git pull origin branch_name
Arpit Vaishnav
87
git push -u origin master

… est le même que:

git push origin master ; git branch --set-upstream master origin/master

Faites la dernière déclaration, si vous oubliez le -u!

Ou vous pouvez le forcer:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Si vous laissez la commande le faire pour vous, elle choisira vos erreurs comme si vous avez tapé une branche inexistante ou non git remote add; mais c'est peut-être ce que vous voulez. :)

sabgenton
la source
1
BTW mastern'est qu'un exemple :)
sabgenton
Ok, le deuxième bit est désormais amorti dans les versions plus récentes pour: git branch master -u origin/masterdetails @ stackoverflow.com/a/2286030/790359
sabgenton
2
Si vous oubliez d'utiliser l' -uoption, tapez git push -uimmédiatement sera OK.
zeekvfu
1
Les nouvelles versions de git indiquent que ce --setup-upstreamsera obsolète: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag
--set-upstream est déconseillé, maintenant cela fonctionne:git branch --set-upstream-to=origin/master master
Alberto Perez
43

En termes plus simples:

Techniquement, le -u indicateur ajoute une référence de suivi au serveur en amont vers lequel vous poussez.

Ce qui est important ici, c'est que cela vous permet de faire un git pullsans fournir plus d'arguments. Par exemple, une fois que vous avez fait un git push -u origin master, vous pouvez appeler plus tard git pullet git saura que vous vouliez diregit pull origin master .

Sinon, vous devrez taper toute la commande.

Adépòjù Olúwáségun
la source
1
Donc, si je mets le -udrapeau à orgin masterchaque pull suivant, j'y ferai référence. Et si je veux changer le git pullcomportement que je devrais exécuter git push -u origin some_other_branchet git pullmaintenant je vais me référer some_other_branch? Je vous remercie!
Toma Tomov
1
pouvons-nous également utiliser "git push" au lieu d'utiliser "git push origin master"?
cegprakash
Oui, vous pouvez @cegprakash. Cependant, vous auriez initialement fait ungit push -u origin master
Adépòjù Olúwáségun
-11

Toutes les commandes git bash nécessaires pour pousser et tirer dans Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Si vous souhaitez modifier un fichier, alors:

edit filename.* 

Pour voir toutes les branches et leurs validations:

git show-branch
Kamta Mishra
la source
4
Je pense que vous avez répondu hors de la portée de la question.
Adépòjù Olúwáségun