869 votes

Comment valider mes modifications actuelles sur une autre branche dans Git ?

Il arrive parfois que je fasse des changements dans mon répertoire de travail, et que je me rende compte que ces changements devraient être validés dans une branche différente de la branche actuelle. Cela se produit généralement lorsque je veux essayer de nouvelles choses ou faire des tests et que j'oublie de créer une nouvelle branche à l'avance, mais je ne veux pas commettre du code sale dans la branche principale.

Donc, Comment puis-je faire en sorte que les changements non validés (ou les changements stockés dans l'index) soient validés dans une branche différente de la branche actuelle ?

1375voto

Jefromi Points 127932

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

git stash
git checkout other-branch
git stash pop

Le premier stash cache vos changements (en fait, il s'agit d'un commit temporaire), et la commande suivante stash pop les réapplique. Cela permet à Git d'utiliser ses capacités de fusion.

Si, lorsque vous essayez d'ouvrir la cachette, 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 du fait d'avoir fait vos changements sur la mauvaise branche.

D'un autre côté, si vous avez vraiment fait une erreur, et que votre arbre de travail contient un mélange de changements pour les deux branches, et que les conflits ne concernent que ceux que vous voulez renvoyer sur la branche d'origine, vous pouvez économiser du travail. Comme d'habitude, il y a beaucoup de façons de le faire. En voici une, à partir du moment où vous faites un pop et voyez 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 vous rendez compte à l'avance que cela va se produire, il suffit de livrer les choses qui appartiennent à la branche actuelle. Vous pouvez toujours revenir et modifier ce commit :

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

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

0 votes

Quand tu as dit : Checking out the branch and then committing would only work if the checkout is possible given the local modifications . Que voulez-vous dire ? Pourriez-vous donner/discuter d'un exemple simple où cela échouerait ?

8 votes

@user815423426 Si vous avez des modifications non validées, vous pouvez extraire une autre branche si et seulement si l'ensemble des fichiers que vous avez modifiés et l'ensemble des fichiers qui diffèrent entre les deux branches sont disjoints. C'est-à-dire que si vous avez modifié le fichier A, vous pouvez extraire une autre branche seulement si le fichier A est le même dans les deux branches.

0 votes

Merci. Quand tu as dit A est le même dans les deux branches, vous voulez dire A avant mes modifications (c'est-à-dire A dans le HEAD de chaque branche). C'est bien cela ?

92voto

tanascius Points 22712

Vous pouvez simplement créer une nouvelle branche et passer dessus. Validez ensuite vos changements :

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

Alternativement, vous pouvez aussi vérifier une branche existante (juste git checkout <name> ). Mais seulement, s'il n'y a pas de collisions (la base de tous les fichiers édités est la même que dans votre branche actuelle). Sinon, vous obtiendrez un message.

Notez que dans le cas d'un passage à une branche divergente existante, vous pouvez utiliser l'option -m pour indiquer à git d'essayer de fusionner les changements, c'est à dire git checkout -m <name>

14 votes

Notez que dans le cas du passage à existant divergent vous pouvez utiliser la branche -m pour dire à git d'essayer de fusionner les changements, c'est-à-dire git checkout -m <name>

2 votes

La réponse de @Jefromi est meilleure dans presque tous les cas, je pense.

9 votes

Version courte : git checkout -b dirty

35voto

Hank Gay Points 36173
  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

Et fournissez votre message d'engagement.

1 votes

Vous pouvez écrire ce que co y ci est ... bien que l'on puisse le deviner (checkout, commit) ^^

5 votes

@tanascius Bonne suggestion, et réalisée. J'utilise les alias depuis si longtemps que j'ai oublié qu'ils ne sont pas par défaut.

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