Git pull sans paiement?


133

J'ai l'habitude d'exécuter git pull et d'autres commandes à partir d'une branche sur laquelle je travaille. Mais j'ai mis en place un serveur de développement sur lequel plusieurs personnes travaillent, donc je ne veux pas avoir à changer de branche quand je le fais. Si je veux mettre à jour une branche existante sur le serveur de développement à partir du référentiel github que nous utilisons tous, quelle serait la bonne façon de le faire? Si j'exécute la commande 'git pull github branchname' est-ce que cela va simplement tirer la branche dans la branche actuelle?

Tous les exemples git que je peux trouver semblent indiquer que vous exécutez d'abord 'checkout branchname', puis que vous effectuez l'extraction. J'essaye d'éviter ça. Comme je l'ai dit, il s'agit d'une branche existante et je veux juste mettre à jour vers la dernière version.


6
git fetchdevrait faire ce que vous voulez.
Brad

11
git fetchmettrait à jour la copie locale de la branche distante, mais pas n'importe quelle branche locale, même si l'une d'entre elles est configurée pour suivre cette branche distante spécifique. C'est peut-être ce que l'on veut ou non. (Edit: par défaut, de toute façon. Il est possible de l'appeler avec des arguments pour le faire se comporter différemment, mais dans ce cas, les arguments devraient vraiment être indiqués.)

2
Je ne comprends pas très bien ... est-ce que tout le monde utilise le même référentiel local sur le serveur de développement? Est-ce pour cela que vous ne voulez pas changer de branche? Pourquoi ne pas simplement demander à chacun de créer son propre clone privé dans lequel il pourra travailler? Voir aussi git: mettre à jour une branche locale sans la vérifier? .

Réponses:


221

Je cherchais la même chose et j'ai finalement trouvé la réponse qui a fonctionné pour moi dans un autre article de stackoverflow: fusionner, mettre à jour et extraire des branches Git sans utiliser les extractions

Fondamentalement:

git fetch <remote> <srcBranch>:<destBranch>


Existe-t-il un moyen d'utiliser la branche amont au lieu de spécifier la branche source?
cambunctious

Malheureusement, mais pulla des paramètres que le fetchne possède pas: -s <strategy>, ce -Xsubtree=...qui était un élément vital pour moi, ce n'est pas un remplacement équivalent. J'ai eu le problème décrit ici: congruityservice.com/blog/ ... mais dans mon cas, je ne voulais pas du tout de paiement.
Andry

2
Étant donné que la question porte sur l'attraction, il semble que la réponse devrait plutôt être git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck

Si les commits sont déjà dans votre référentiel local:git fetch . origin/master:master
Evan le

74

J'ai eu le même problème avec la nécessité de commettre ou cacher les modifications des fonctionnalités actuelles, la caisse principale branche, faire la pullcommande ne seront tout de distance au niveau localmaster espace de travail, puis passer à nouveau à une branche de fonction et effectuer une rebasepour le faire une mise à jour avec Maître.

Pour que tout cela soit fait, gardez l'espace de travail sur la branche de fonctionnalité et évitez toute commutation, je fais ceci:

git fetch origin master:master

git rebase master

Et ça fait très bien l'affaire.


19
C'est un bon conseil mais enfouit la lede: selon les réponses ci-dessous, si vous êtes sur featureet TOUT ce que vous voulez faire est de mettre à jour votre local masterpour qu'il soit en ligne avec l'origine, SANS toucher feature, faites simplement git fetch origin master:master... et c'est comme si vous l'aviez fait stash-checkoutMaster-pull-checkoutFeature-stashPop!
btown

7
Pour fusionner le maître d'origine dans votre branche locale, vous n'avez pas besoin d'extraire le maître local. Vous pouvez utiliser git merge origin/master
Dan

-1

Si vous souhaitez que les astuces de la branche locale soient redirigées après git fetch, vous avez besoin de quelques étapes supplémentaires.

Plus concrètement, supposons que les branches repo github a D, B, Cet master(la raison de cette étrange branche nom-set sera clair dans un instant). Vous êtes sur l'hôte devhostet vous êtes dans un repo où se origintrouve le repo github. Vous faites git fetch, ce qui porte sur tous les objets et les mises à jour origin/D, origin/B, origin/C, et origin/master. Jusqu'ici tout va bien. Mais maintenant , vous dites que vous voulez que quelque chose arrive, sur devhost, aux locaux branches D, B, Cet / ou master?

J'ai ces questions évidentes (pour moi en tout cas):

  1. Pourquoi voulez-vous que les conseils de toutes les succursales soient mis à jour?
  2. Que faire si une branche (par exemple B) a des commits que le repo distant (github) n'a pas? Devraient-ils être fusionnés, rebasés ou ...?
  3. Que faire si vous êtes sur une branche (par exemple C) et que le répertoire de travail et / ou l'index sont modifiés mais non validés?
  4. Que faire si le dépôt distant a de nouvelles branches ajoutées ( A) et / ou des branches supprimées ( D)?

Si la réponse à (1) est "parce que devhost n'est pas réellement pour le développement, mais plutôt un miroir local qui conserve simplement une copie disponible localement du dépôt github afin que tous nos développeurs réels puissent en lire rapidement au lieu de lire lentement depuis github ", alors vous voulez un" miroir "plutôt qu'un repo" normal ". Il ne devrait pas avoir de répertoire de travail, et peut-être qu'il ne devrait pas non plus accepter les poussées, auquel cas les questions restantes disparaissent.

S'il y a une autre réponse, (2-4) devient problématique.

Dans tous les cas, voici un moyen de s'attaquer à la mise à jour des références locales en fonction des références distantes (après exécution git fetch -ppar exemple):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

Le contenu de la ... code here ...section dépend des réponses aux questions (2-4).


-5

Utilisation

git fetch

au lieu. Il met à jour les références et les objets distants dans votre dépôt, mais laisse les branches locales, HEAD et l'arbre de travail seuls.


17
Mais cela ne met pas à jour les branches locales de son serveur de développement ... cela ne fait que rafraîchir les branches "origin" de ce dossier git, qui correspondent au dépôt github du demandeur.
ANeves

1
Ou, si vous voulez ma version du problème: je veux fusionner ma branche de travail avec "master", et non avec "origin / master of ssh: // bla bla bla". Faire la récupération mettra à jour l'origine / maître, mais pas le maître.
ANeves

-6

EDIT: Utilisez 'git pull'. Il récupérera toutes les branches du dépôt et mettra également à jour à la dernière si la branche se ferme sur le système local pour la branche actuelle uniquement. Remarque: git pull est équivalent à fetch + merge qui récupère toutes les branches mais ne fusionne que la branche courante.


6
Mieux vaut dire: pullfait un fetch (qui, oui, récupère tout de la télécommande) mais fusionne ensuite uniquement la branche courante .
torek le

Aucune offense intentionnelle avec mon vote défavorable, je sais que ce que vous dites est correct et factuel, et le PO a effectivement demandé une confirmation sur ce que fait l'attraction (et vous lui avez donné cette explication), mais cela ne répond pas au problème. noeud de ce qu'il cherchait: Existe-t-il un moyen de mettre à jour l'une de vos branches locales avec les derniers commits dans sa branche distante associée sans avoir à vérifier la branche au préalable.
Gurce
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.