183 votes

Pull pour une autre branche de Git sans changer de branche

Nous sommes récemment passés de SVN à Git et, dans le même temps, nous avons mis nos systèmes en direct sous contrôle de version (au lieu d'un checkout local et d'une copie de fichier en direct).

Sur le projet auquel je suis affecté, nous accédons tous au même référentiel et pour mettre les changements en ligne, il suffit de git pull là. Cela pose des problèmes parce que nos concepteurs web introduisent dans le VCS des modifications qui ne devraient pas encore être en ligne mais qui devraient se trouver dans l'environnement de test web.

Lorsque l'un des développeurs entre dans le système en direct, il reçoit toutes les modifications (éventuellement non terminées).

Je pensais passer en direct à une branche supplémentaire et juste fusionner ce qui a été modifié, mais en raison de mon manque de connaissances de git, je n'ai aucune idée de comment faire.

Mon idée est la suivante :

  • Créer une nouvelle branche en direct ( git branch live ).
  • Chaque fois que quelque chose doit être mis en ligne
    • Tirez les changements dans master (comme : git checkout master; git pull; git checkout live )
    • git merge master

Le problème est que le fait de passer en mode maître ou de tout transférer directement dans le système en direct poserait des problèmes, et je préfère donc éviter cela.

Existe-t-il un moyen de faire cela ou une meilleure façon de gérer le système Live (à l'exception de la formation des webbies pour qu'ils ne poussent pas les choses inachevées).

286voto

Jeff B Points 3509

J'ai pu tirer des changements de origin/master en master tout en travaillant dans une autre branche en utilisant cette commande :

git fetch origin master:master

Pour une analyse plus approfondie de la situation, consultez l'excellente réponse à cette question sur Stack Overflow. question . Ce que j'ai retenu, c'est que cette commande ne fonctionne que pour une fusion en avance rapide .

23voto

Tobias Kienzler Points 4183

Vous pouvez utiliser git stash avant de vérifier master et pulling, et après avoir vérifié live à nouveau utiliser git stash pop (ou si votre git est plus ancien, git stash apply y git stash clear en supposant que vous n'avez pas caché autre chose)

13voto

Josh K Points 12249

Résolvez d'abord le problème. Ils ne devraient pas pousser vers une branche où ils n'ont pas à le faire.

Ce que vous semblez demander serait quelque chose comme

git checkout live
git pull origin master

Cela va tenter de fusionner le master distant et votre branche vivante.

1voto

edgester Points 172

Je vous recommande de créer un repo git de test pour que tout le monde commit. Tous les dépôts, y compris votre site web live, seront des clones du repo de test. De cette manière, n'importe qui peut pousser vers testing sans toucher le site web live. Lorsque quelqu'un a besoin de mettre à jour le site en direct, vous pouvez alors extraire le site en direct du dépôt git de test. Ce flux de travail est assez similaire à celui de SVN. Pour plus de flexibilité, je recommande d'utiliser la branche "live" que vous décrivez.

Pour résumer, le dépôt git de chacun est un clone du dépôt de test. Le site de production en direct est juste un clone du repo de testing également. Alternativement, le site de test pourrait être un clone du site de production afin qu'un "git push" aille toujours vers la production.

D'autres options incluent l'ajout de la branche "live" à cet arrangement ou l'inclusion d'un repo "staging" entre le test et la production. Pour une sécurité supplémentaire, je recommande de restreindre l'accès au repo git live et de forcer les gens à utiliser un script sécurisé qui fait le pull vers la production live.

1voto

TTT Points 623

Tout d'abord, notez que vous n'avez jamais réellement besoin d'une copie locale de master si vous ne vous y engagez pas directement. La solution la plus simple à votre problème est donc de modifier cette partie de votre flux de travail :

git merge master

à

git merge origin/master

Ainsi, vous n'avez pas à vous soucier de retirer la branche locale. Ceci étant dit, si vous préférez avoir la copie locale, il est conceptuellement plus facile de penser à "mettre à jour master" sans le vérifier d'abord, de cette façon :

# delete your local master (normally either -d or -D should work here)
git branch -D master
# create a new copy of master from the remote copy
git branch master origin/master

Et il y a aussi un moyen plus rapide, puisque vous pouvez le forcer et sauter la suppression :

# replace your local copy of master with it's remote version, even if it already exists
git branch -f master origin/master

Évidemment, toutes ces commandes supposent que vous avez déjà récupéré la dernière origine au préalable. Si ce n'est pas le cas, exécutez git fetch d'abord.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X