Comment «tirer» une twig qui n’est pas la twig actuelle?

Lorsque vous exécutez git pull sur la twig principale, il s’agit généralement d’ origin/master . Je suis dans une autre twig appelée newbranch , mais je dois exécuter une commande qui effectue une git pull de l’ origin/master vers le master mais je ne peux pas exécuter git checkout pour changer la twig sélectionnée jusqu’à la fin du pull. Y a-t-il un moyen de faire cela?

Pour donner quelques informations, le référentiel stocke un site Web. J’ai apporté quelques modifications à newbranch et les newbranch déployées en changeant le site Web en newbranch . Maintenant que ces modifications ont été fusionnées en amont dans la twig principale, j’essaie également de redirect le site Web vers la twig master . À ce stade, la nouvelle newbranch et l’ origin/master sont identiques, mais le master est à la traîne par rapport à l’ origin/master et doit être mis à jour. Le problème est que 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 réaliser la même chose 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 worktree que vous ne voulez pas toucher, alors utilisez-en un autre. Le clone est bon marché, il est construit pour cela.

 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 twig distante dans un master de twig actuellement non extrait:

 git fetch origin master:master 

origine est votre télécommande et que vous êtes actuellement extrait dans une twig, par exemple dev .

Si vous souhaitez mettre à jour votre succursale actuelle en plus de la twig spécifiée en même temps:

 git pull origin master:master 

Ceci est répondu ici: Fusionner, mettre à jour et extraire des twigs Git sans utiliser les extractions

 # 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 fait, la réponse est 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 twig principale sans passer à celle-ci tant qu’elle n’a pas été mise à jour.

Vous vous inquiétez de quelque chose qui ne peut pas être résolu, 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 twigs, même si vous mettez à jour le maître sans d’abord le changer. C’est pourquoi Git n’est pas un outil de déploiement .

Comme vous n’engagez pas de code dans votre environnement de production (j’espère), vous n’avez pas besoin de faire extraire une twig. 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 pointée 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 éliminerait tous les commits locaux dans la twig principale. Dans votre cas, il n’y en aura pas, alors ça va. Pour d’autres personnes essayant de le faire là où il y a des commits locaux, je ne pense pas que ce soit possible, car la fusion ne peut être exécutée que sur la twig 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