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.
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
simple: mise à jour depuis une branche distante vers une branche actuellement non cochée master :
git fetch origin master:master
où 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
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
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.
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.
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.
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