Quand vous courez git pull
sur la branche master
, elle est généralement extraite de Origin/master
. Je suis dans une autre branche appelée newbranch
, mais je dois exécuter une commande qui effectue un git pull
de Origin/master
dans master
mais je ne peux pas exécuter git checkout
pour changer la branche sélectionnée jusqu'à la fin de l'extraction. Y a-t-il un moyen de faire cela?
Pour vous donner un aperçu, le référentiel stocke un site Web. J'ai apporté des modifications à newbranch
et les ai déployées en basculant le site Web sur newbranch
. Maintenant que ces modifications ont été fusionnées en amont dans la branche master
, j'essaie également de rétablir le site Web dans la branche master
. À 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 de 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 obtenir le même résultat que ci-dessus (git checkout master && git pull
), mais sans changer le répertoire de travail en une révision antérieure au cours du processus.
Vous avez un arbre de travail que vous ne voulez pas toucher, utilisez-en un autre. Clone est bon marché, c'est construit 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
Le problème avec toutes les autres réponses ici est, ils ne font pas le pull. Si vous avez besoin de la fusion ou de la rebase pour laquelle vous avez configuré la traction, vous avez besoin d'une autre arborescence de travail et de la procédure ci-dessus. Sinon, juste git fetch; git checkout -B master Origin/master
ça ira.
Simple: mise à jour depuis une branche distante vers une branche actuellement non extraite master:
git fetch Origin master:master
où Origin est votre télécommande et vous êtes actuellement extrait dans une branche, par exemple. dev.
Si vous souhaitez mettre à jour votre branche actuelle en plus de la branche spécifiée en une fois:
git pull Origin master:master
Ceci est résolu ici: Fusionner, mettre à jour et extraire les branches Git sans utiliser de checkout
# 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
En fin de compte, la réponse est d'une simplicité trompeuse:
$ 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 y basculer jusqu’à après elle a été mise à jour.
Vous vous inquiétez de quelque chose qui ne peut pas être corrigé, car les opérations de 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 d'abord basculé. C'est pourquoi Git n'est pas un outil de déploiement .
Puisque vous ne commettez pas réellement de code dans votre environnement de production (j'espère), vous n'avez pas réellement besoin de faire extraire une branche. Vous pouvez simplement faire un git fetch
pour mettre à jour vos références distantes, puis git checkout Origin/master
pour déplacer le répertoire de travail directement vers la validation actuellement indiquée par Origin/master
. Cela vous mettra dans un état de tête détachée, 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 tous les commits locaux dans la branche master. Dans votre cas, il n'y en aura pas, donc ça va. Pour les autres personnes qui tentent de faire cela avec des commits locaux, je ne pense pas que ce soit possible, car la fusion ne peut être exécutée que sur la branche actuelle.
La solution de Malvineous fonctionne 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 l'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 l'option -D
merci
git fetch Origin master:master
master
.master
qui ne sont pas encore poussées, Origin/master
est fusionné dans votre maître.