Comment "git pull" dans une branche qui n'est pas au courant?

quand vous lancez git pull sur la branche master , elle tire typiquement de 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 dans master mais je ne peux pas exécuter git checkout pour changer la branche choisie jusqu'à ce que le tirage soit complet. Est-il un moyen de faire cela?

pour donner un peu d'arrière-plan, le dépôt stocke un site web. J'ai fait quelques changements dans newbranch et les a déployés en remplaçant le site Web par newbranch . Maintenant que ces modifications ont été fusionnées en amont dans la branche master , j'essaie de changer le site web pour la branche master aussi. À ce stade, newbranch et origin/master sont identiques, mais master est en retard sur origin/master et doit être mis à jour. Le problème est, si je le fais à la 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

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

93
demandé sur BartoszKP 2013-09-25 05:10:19

7 réponses

vous avez un worktree que vous ne voulez pas toucher, donc utilisez un autre. Le Clone est bon marché, il est fait pour ça.

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload
5
répondu jthill 2013-11-07 01:40:06

simple: mise à jour depuis une branche distante vers une branche actuellement non cochée master :

git fetch origin master:master

origine est votre télécommande et vous êtes actuellement vérifié dans une certaine branche par exemple dev .

si vous souhaitez mettre à jour votre branche actuelle en plus de la branche spécifiée d'un seul coup:

git pull origin master:master
97
répondu Martin Peter 2018-08-02 10:14:50

la réponse est ici: fusionner, mettre à jour, et tirer les branches Git sans utiliser les vérifications

# 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
80
répondu fane89 2017-05-23 11:47:28

comme il s'avère, la réponse est trompeusement simple:

$ 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 la branche master sans passer à elle jusqu'à après il a été mis à jour.

16
répondu Malvineous 2013-09-25 06:02:59

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 où votre répertoire de travail est à mi-chemin entre les branches, même si vous mettez à jour master sans y avoir recours au préalable. C'est pourquoi Git n'est pas un outil de déploiement .

puisque vous n'êtes pas réellement en train de propager du code dans votre environnement de production( j'espère), vous n'avez pas réellement besoin de 151980920" pour avoir une succursale vérifié. Vous pouvez simplement faire un 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 tête détaché, mais encore une fois, comme vous ne commettez pas de code, cela n'a pas d'importance.

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

11
répondu meagar 2013-09-25 01:32:25

vous pouvez utiliser update-ref pour cela:

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

notez que cela jetterait n'importe quelle propagation locale dans la branche principale. Dans votre cas, il ne sera pas donc c'est ok. Pour les autres personnes qui essaient de faire cela là où il y a des propagations locales, Je ne pense pas que ce soit possible, puisque la fusion ne peut être exécutée que sur la branche courante.

3
répondu Philip Beber 2016-10-09 22:25:21

Malvineous la solution de travail pour moi

$ 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

Juste à donner le message d'erreur


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

donc je cours avec-d option

merci

2
répondu Sebastian Oscar Lopez 2017-11-07 13:10:05