web-dev-qa-db-fra.com

Comment "attraper" dans une branche qui n'est pas la branche actuelle?

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.

111
Malvineous

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.

5
jthill

Simple: mise à jour depuis une branche distante vers une branche actuellement non extraite master:

git fetch Origin master:master

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
134
Martin Peter

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
86
fane89

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.

20
Malvineous

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.

11
meagar

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.

3
Philip Beber

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

2

git fetch Origin master:master

  • "Pulls" (récupère réellement) master.
  • Si vous avez des modifications sur votre master qui ne sont pas encore poussées, Origin/master est fusionné dans votre maître.
  • S'il y a des conflits de fusion, vous devrez d'abord les résoudre.
0
Luzian