2013-08-03 3 views
1

Si je travaille sur une branche d'un repo, par exemple devel, quelle est la différence entre les commandes suivantes? Dans ce cas, je l'ai déjà ajouté une upstream à distance:Spécification d'arguments de branche pour git fetch, fusion et push

$ git fetch upstream devel 
From github.com:meteor/meteor 
* branch   devel  -> FETCH_HEAD 

et

$ git fetch upstream 
remote: Counting objects: 500, done. 
remote: Compressing objects: 100% (230/230), done. 
remote: Total 326 (delta 227), reused 187 (delta 90) 
Receiving objects: 100% (326/326), 46.61 KiB, done. 
Resolving deltas: 100% (227/227), completed with 87 local objects. 
From github.com:meteor/meteor 
* [new branch]  appconfig -> upstream/appconfig 
* [new branch]  check-path -> upstream/check-path 
    248ff08..4d44a4d ctl-migrate -> upstream/ctl-migrate 
    2c356d2..bfb8fd3 devel  -> upstream/devel 
* [new branch]  release-0.6.5 -> upstream/release-0.6.5 
    64b95a4..c0014df shark  -> upstream/shark 
From github.com:meteor/meteor 
* [new tag]   release/0.6.5-rc11 -> release/0.6.5-rc11 
* [new tag]   release/0.6.5-rc12 -> release/0.6.5-rc12 

Comment savoir ce qu'il faut d'extraction obtenir si aucune branche est spécifiée?

De plus, pourquoi est-ce que la commande de fusion est

$ git merge upstream/devel 

mais si je veux pousser les changements à ma fourchette, je dois dire

$ git push origin devel 

pourquoi est-il une barre oblique un cas mais pas l'autre?

Répondre

2

git fetch upstream devel est le même que:

git fetch upstream refs/heads/devel 

Vous ne fournissez pas une destination dans votre refspec, de sorte que la mise à jour FETCH_HEAD chercher, comme expliqué dans "In git, how do I check out a remote repository's remote branches?".
Ceci est un ref de courte durée, utilisé si vous faites un pull (fetch + fusion).

git fetch upstream récupère tout, donc il n'y a pas de ref unique à mettre à jour.


git merge doit spécifier la sourcede la fusion, dans votre cas la branche à distance devel (upstream/devel depuis est le nom de votre télécommande mise à jour, mis à jour après la récupération en amont)
git merge devel fusionneriez la branche locale devel sur la branche actuelle ... et si vous êtes déjà sur devel, cela se traduirait par un no-op.

Mais git push spécifient aussi la source, ici une branche locale devel, une destination distante origin (le "upstream repo") et la destination dépend de la push policy.
Si devel est le suivi d'une branche distante, et vous êtes actuellement sur devel, un simple git push est suffisant. Voir "Why do I need to explicitly push a new branch?" pour plus d'informations.

+0

'git fetch upstream devel' ne ressemble-t-il pas plus à 'get fetch upstream refs/heads/devel' (notez les * têtes *)? Les références distantes devraient aussi être sous le nom distant, donc ce serait 'refs/remote/upstream/devel', si c'était le bon ref. – jszakmeister

+0

@jszakmeister vrai. J'ai mis à jour la réponse. – VonC

+0

+1 Merci pour l'explication complète et les pointeurs. Je suis sûr que cela vaudra la peine pour les autres parce que jusqu'ici, je tape des arguments de branche au hasard et je prie pour qu'elle fasse la bonne chose :) –

Questions connexes