166 votes

Comment faire un 'git pull' dans une branche qui n'est pas la branche actuelle ?

Lorsque vous exécutez git pull sur le master il s'appuie généralement sur la branche origin/master . Je suis dans une autre branche appelée newbranch mais j'ai besoin d'exécuter une commande qui fait un git pull de origin/master en master mais je ne peux pas courir git checkout de changer la branche sélectionnée jusqu'à ce que le tirage soit terminé. Existe-t-il un moyen de faire cela ?

Pour faire un peu d'histoire, le dépôt stocke un site web. J'ai fait quelques changements dans newbranch et les a déployés en basculant le site web vers newbranch . Ces changements ont été fusionnés en amont dans le fichier master j'essaie de faire repasser le site web à la branche master également. À ce stade, newbranch et origin/master sont identiques, mais master est à la traîne origin/master et doit être mis à jour. Le problème, c'est que si je le fais de manière traditionnelle :

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

J'ai besoin de réaliser la même chose que ci-dessus ( git checkout master && git pull ), mais sans changer le répertoire de travail pour une révision antérieure au cours du processus.

201voto

Martin Peter Points 2234

Simple comme bonjour : Mise à jour d'une branche distante vers une branche qui n'a pas encore été vérifiée maître :

git fetch origin master:master

origine est votre adresse distante et vous êtes actuellement en check-out dans une branche, par ex. dev .

Si vous souhaitez mettre à jour votre branche actuelle en plus de la branche spécifiée en une seule fois :

git pull origin master:master

104voto

Thomas Points 1971

La réponse à cette question se trouve ici : Fusionner, mettre à jour et extraire des branches Git sans utiliser de checkouts

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

24voto

Malvineous Points 2416

Il s'avère que la réponse est d'une simplicité déconcertante :

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

Cela vous permet de mettre à jour le master sans passer à la branche jusqu'à ce que après il a été mis à jour.

12voto

meagar Points 85475

Vous vous inquiétez de quelque chose qui ne peut pas être corrigé, car les opérations Git ne sont pas atomiques. Vous aurez toujours un trou à l'endroit où se trouve votre répertoire de travail à mi-chemin entre les branches, même si vous mettez à jour master sans passer d'abord à cette branche. C'est pourquoi Git n'est pas un outil de déploiement .

Puisque vous n'êtes pas en train de commettre du code dans votre environnement de production (je l'espère), vous n'avez pas à vous préoccuper de ce qui suit besoin pour faire vérifier une branche. Vous pouvez simplement effectuer une git fetch pour mettre à jour vos références à distance, puis git checkout origin/master pour déplacer le répertoire de travail directement vers le commit actuellement pointé par origin/master . Cela vous mettra dans un état de détachement, mais là encore, comme vous n'êtes pas en train d'écrire du code, cela n'a pas d'importance.

C'est le plus petit trou que vous aurez, mais comme je l'ai dit, un trou existe toujours ; checkout n'est pas atomique.

4voto

Philip Beber Points 1

Vous pouvez utiliser update-ref pour cela :

git fetch
git update-ref refs/heads/master origin/master
git checkout master

Notez que cela supprimerait tous les commits locaux dans la branche master. Dans votre cas, il n'y en aura pas, donc cela ne pose pas de problème. Pour les autres personnes qui essaient de faire cela lorsqu'il y a des commits locaux, je ne pense pas que ce soit possible, puisque merge ne peut être exécuté que sur la branche courante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X