76 votes

Changer de branche sans toucher à l'arbre de travail ?

Je suis actuellement sur une branche de débogage, et j'aimerais passer à la branche principale, sans modifier l'arbre de travail (le laisser tel qu'il est dans la branche de débogage), afin de pouvoir livrer certaines des modifications dans la branche principale.

Existe-t-il un moyen de le faire ?

103voto

siegi Points 1027

Vous pouvez procéder comme suit :

git checkout --detach
git reset --soft master
git checkout master

Explication :

Si vous êtes sur le site debug et ferait git reset --soft master vous laisseriez votre arbre de travail et votre index intacts et passeriez au commit master pointe vers. Le problème est le suivant, debug sera également réinitialisé à ce commit. Ainsi, vos commits sur debug sont "perdus" (enfin, pas vraiment, mais ils ne sont plus directement accessibles) et vous êtes toujours sur le site de la debug branche.

Pour éviter git reset de se déplacer debug tout en continuant à définir votre HEAD à la master s'engager, vous devez d'abord faire git checkout --detach pour pointer HEAD directement à votre commit actuel (voir man git-checkout , section "TÊTE DÉTACHÉE"). Vous pouvez alors procéder à la réinitialisation sans toucher à la debug branche.

Maintenant HEAD pointe directement sur le commit master pointe vers, c'est-à-dire qu'il est encore détaché. Vous pouvez simplement git checkout master à attacher à master et sont maintenant prêts à s'engager sur le master branche.

Il convient de noter que git checkout (par défaut et lorsqu'aucun chemin n'est fourni) ne met à jour que les fichiers qui ont été modifiés entre la livraison "source" et la livraison "cible" et les modifications locales apportées aux fichiers de l'arborescence de travail sont conservées. Comme les deux livraisons sont identiques dans ce cas, aucun fichier du répertoire de travail n'est touché.

63voto

Charles Bailey Points 244082

Cette réponse utilise des commandes de "plomberie" de bas niveau. Soyez vigilants. Si vous préférez " porcelaine Les commandes ", aller avec cette réponse ce qui donne les mêmes résultats.

Vous pouvez réinitialiser votre tête pour qu'elle pointe vers le maître sans modifier l'index ou l'arbre de travail :

git symbolic-ref HEAD refs/heads/master

Vous devriez probablement réinitialiser l'index afin de pouvoir appliquer sélectivement les modifications apportées à l'arbre de travail, sinon vous risquez de commettre toutes les différences entre la branche master et la branche debug, ce qui est probablement une mauvaise chose.

git reset

Une fois que vous avez fait le commit que vous voulez faire, vous pouvez retourner à votre branche de débogage avec :

git symbolic-ref HEAD refs/heads/debug-branch
git reset

9voto

knittl Points 64110

Vous pouvez conserver ( git stash ) vos modifications, changer de branche, démanteler ( git stash pop ) vos modifications, ajoutez-les et validez-les.

Si vous voulez l'état exact de debug, il suffit de fusionner debug dans master (ou de réinitialiser master à debug).

3voto

sehe Points 123151

Voici un flux de travail brut

 git stash
 git checkout otherbranch
 git stash apply
 git reset
 git add # interactively? just add the hunks/changes you want to commit
 git commit

Et de revenir

 git reset --hard # watch it here! make sure you haven't added more changes that you wanted to keep
 git checkout debug
 git stash pop

Alternativement, vous pouvez simplement livrer les changements pertinents "ici" et pousser/chérir sur la branche master.

-1voto

VladFr Points 197

Pour autant que je sache, vous ne pouvez pas. Le changement de branche consiste à extraire de la copie de travail une version du code qui se trouve dans le HEAD de cette branche.

Vous voulez merge vos branches. Faire

git checkout master
git merge devel

Les branches sont maintenant synchronisées. Si vous souhaitez fusionner un sous-ensemble de modifications, vous pouvez spécifier un commit ou une plage de commits. Jetez également un coup d'œil à cueillette des cerises Par exemple :

git checkout master
git cherry-pick devel

Fusionnera le dernier commit de devel dans master.

Si vous avez besoin de fusionner deux branches qui se trouvent sur des hôtes différents, jetez un coup d'œil à git pull et git push.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X