web-dev-qa-db-fra.com

Comment valider mes modifications actuelles dans une autre branche de git

Il arrive parfois que je modifie mon répertoire de travail et que je réalise que ces modifications doivent être validées dans une branche différente de celle en cours. Cela se produit généralement lorsque je veux essayer de nouvelles choses ou faire des tests et j'oublie de créer une nouvelle branche à l'avance, mais je ne veux pas commettre de code corrompu dans la branche principale.

Donc, comment puis-je faire en sorte que les modifications non validées (ou stockées dans l'index) soient validées dans une branche différente de celle en cours?

605
Auron

Les autres réponses suggérant de vérifier l’autre branche, puis de s’y engager, ne fonctionnent que si la commande est possible compte tenu des modifications locales. Sinon, vous êtes dans le cas d'utilisation le plus courant pour git stash:

git stash
git checkout other-branch
git stash pop

La première stash masque vos modifications (en effectuant une validation temporaire), et la suivante stash pop les réapplique. Cela permet à git d’utiliser ses capacités de fusion.

Si, lorsque vous essayez de masquer la réserve, vous rencontrez des conflits de fusion ... les étapes suivantes dépendent de la nature de ces conflits. Si tous les changements cachés appartiennent effectivement à cette autre branche, vous devrez simplement les trier - c'est une conséquence d'avoir effectué vos modifications sur la mauvaise branche.

Par contre, si vous vous êtes vraiment trompé et que votre arbre de travail comporte une combinaison de modifications pour les deux branches et que les conflits ne concernent que ceux que vous souhaitez réengager dans la branche d'origine, vous pouvez économiser du travail. . Comme d'habitude, il y a beaucoup de façons de le faire. En voici un, commençant après avoir vu et vu les conflits:

# Unstage everything (warning: this leaves files with conflicts in your tree)
git reset
# Add the things you *do* want to commit here
git add -p     # or maybe git add -i
git commit
# The stash still exists; pop only throws it away if it applied cleanly
git checkout original-branch
git stash pop
# Add the changes meant for this branch
git add -p 
git commit
# And throw away the rest
git reset --hard

Alternativement, si vous réalisez que cela va se produire, commettez simplement les choses qui appartiennent à la branche actuelle. Vous pouvez toujours revenir et modifier cet engagement:

git add -p
git commit
git stash
git checkout other-branch
git stash pop

Et bien sûr, rappelez-vous que tout cela a pris un peu de travail, et évitez-le la prochaine fois, peut-être en mettant votre nom de branche actuel dans votre invite en ajoutant $(__git_ps1) à votre PS1 dans votre bashrc. (Voir par exemple le Git in Bash docs.)

913
Cascabel

Vous pouvez simplement créer une nouvelle branche et y basculer. Commettez vos modifications alors:

git branch dirty
git checkout dirty
// And your commit follows ...

Alternativement, vous pouvez également extraire une branche existante (juste git checkout <name>). Mais seulement s'il n'y a pas de collisions (la base de tous les fichiers modifiés est la même que celle de votre branche actuelle). Sinon, vous recevrez un message.

54
tanascius
  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

Et fournissez votre message de commit.

20
Hank Gay