2010-05-31 13 views
495

Parfois il m'arrive de faire quelques changements dans mon répertoire de travail et je me rends compte que ces changements devraient être commis dans une branche différente de celle en cours. Cela arrive généralement quand je veux essayer de nouvelles choses ou faire des tests et que j'oublie de créer une nouvelle branche au préalable, mais je ne veux pas commettre de code corrompu dans la branche master.Comment valider mes changements courants dans une branche différente dans git

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

Répondre

727

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. Sinon, vous êtes dans le plus commun pour les cas d'utilisation git stash:

git stash 
git checkout other-branch 
git stash pop 

Le premier stash se cache vos modifications (essentiellement faire commettras temporaire), et la stash pop ultérieure les re-CANDIDATURE. Cela permet à git d'utiliser ses capacités de fusion.

Si vous essayez de faire apparaître la mémoire, vous êtes confronté à des conflits de fusion ... les étapes suivantes dépendent 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 fait vos changements sur la mauvaise branche. D'autre part, si vous avez vraiment raté, et que votre arbre de travail a un mélange de changements pour les deux branches, et que les conflits sont juste ceux que vous voulez commettre sur la branche d'origine, vous peut sauver du travail. Comme d'habitude, il y a beaucoup de façons de le faire. Voici une, à partir après avoir pop et de voir 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 

Sinon, si vous vous rendez compte à l'avance le temps que cela va se produire, commettre simplement 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 pris un peu de travail, et d'éviter la prochaine fois, peut-être en mettant votre nom de la branche en cours dans votre message en ajoutant $(__git_ps1) à votre PS1 dans votre bashrc. (Voir par exemple les docs Git in Bash.)

+0

Lorsque vous avez dit: 'Extraire la branche et la valider ne fonctionnerait que si la vérification est possible compte tenu des modifications locales '. Que voulez-vous dire? Cela vous dérangerait-il de donner/discuter d'un exemple simple quand cela échouerait? –

+5

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

+0

Merci! Quand vous avez dit 'A' est le même dans les deux branches, vous voulez dire' A' avant mes changements (c'est-à-dire 'A' dans la tête de chaque branche). Correct? –

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

et fournir votre message de commit.

+1

vous pouvez écrire ce que * co * et * ci * sont ... bien qu'on puisse le deviner (checkout, commit) ^^ – tanascius

+2

@tanascius Bonne suggestion, et fait. J'ai utilisé les alias tellement longtemps que j'oublie qu'ils ne sont pas les paramètres par défaut. –

45

Vous pouvez simplement créer une nouvelle branche et passer dessus. Vos changements alors:

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

Vous pouvez également la caisse 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 recevrez un message.

+9

Notez qu'en cas de passage à la branche ** ** ** divergente *** ***, vous pouvez utiliser l'option '-m' pour dire à git d'essayer de fusionner les modifications, c'est-à-dire' git checkout -m ' –

+2

@ Jefromi's la réponse est meilleure dans presque tous les cas je pense. –

+3

Version plus courte: 'git checkout -b dirty' – user1338062