2009-08-20 7 views
229

Je travaillais sur une branche git et j'étais prêt à valider mes modifications, j'ai donc fait un commit avec un message de commit utile. J'ai ensuite distraitement apporté des modifications mineures au code qui ne valent pas la peine d'être conservées. Je veux maintenant changer de branche, mais git me donne,git: Changer de branche et ignorer les modifications sans valider

error: You have local changes to "X"; cannot switch branches.

Je pensais pouvoir changer de branche sans m'engager. Si oui, comment puis-je configurer cela? Si non, comment puis-je sortir de ce problème? Je veux ignorer les changements mineurs sans commettre et juste changer de branche.

+1

Je crois que cela ne se produit quand des changements qu'ils sont mis en scène pour commettre mais pas commited? git checkout fonctionne très bien pour changer de branche si vous n'avez pas encore mis en scène les fichiers en utilisant git add ou similaire. –

+1

Salut Jeremy, Qu'entendez-vous par «mis en scène»? Obliger l'utilisateur à valider le fichier avant de modifier les branches ne semble pas être un bon workflow. Par exemple, si je suis dans le référentiel maître et que je veux rapidement vérifier quelque chose dans une branche. Je dois d'abord commettre le code au maître, même si le code est à moitié écrit! Dites-vous qu'en effet, il devrait être possible de vérifier une succursale dans cette situation? –

+0

@boyfarrell Vous pouvez utiliser 'Git stash' pour enregistrer temporairement les modifications sans les valider. – Howiecamp

Répondre

297

Vous avez besoin d'un état propre pour changer de branche. La vérification de succursale ne sera autorisée que si elle n'affecte pas les 'fichiers sales' (comme Charles Bailey remarques dans les commentaires).

Sinon, vous devez soit:

  • stash votre changement actuel ou
  • reset --hard HEAD (si cela ne vous dérange pas de perdre ces changements mineurs) ou
  • checkout -f (Lors du passage des branches, procéder même si la index ou l'arbre de travail diffère de HEAD, ce qui est utilisé pour rejeter les changements locaux.)
+28

"Vous avez besoin d'un état propre pour changer de branche." n'est vrai que si le changement de branche affecte les 'fichiers sales'. –

+0

Grande réponse par VonC et commentaire de Charles Bailey –

+6

Pour la méthode de dissimulation, j'ai tapé "git stash save", "git checkout otherbranch", puis finalement "git stash pop". –

7

Si vous avez apporté des modifications à des fichiers que Git doit également modifier lors du changement de branche, il ne vous le permettra pas. Pour annuler les modifications de fonctionnement, utilisez:

git reset --hard HEAD 

Ensuite, vous pourrez changer de branche.

12

Suivre,

$: git checkout -f 

$: git checkout next_branch 
90

Si vous souhaitez annuler les modifications,

git checkout -- <file> 
git checkout branch 

Si vous souhaitez conserver les changements,

git stash save 
git checkout branch 
git stash pop 
+8

En effet ce que dit Romerun (pour être complet): 'git stash save' (quand il travaille branchY) alors' git checkout branchX' fait quelque chose 'git add/commit -m' etc.' git checkout branchY' et 'git stash pop 'pour récupérer la cachette – Highmastdon

+2

Peut-être ainsi. Je suis dans une situation où je veux faire ce que la réponse dit, si je comprends bien: cacher les changements, passer de Y à X, puis les changements pop et les commettre sur X. –

51
bien

, il devrait être

git stash save 
git checkout branch 
// do something 
git checkout oldbranch 
git stash pop 
+3

Oui, le stockage est global, pas la branche spécifique, si je stash pop après le changement de branche je vais avoir la même cachette que sur l'autre branche –

+4

Doit être noté 'git stash' sera par défaut' git stash save' –

+0

Merci, c'est très utile pour moi –

7

Remarque que si vous avez fusionné des succursales distantes ou avez des commits locaux un d veulent revenir à la tête à distance que vous devez faire:

git reset --hard origin/HEAD 

HEAD seul fait référence uniquement à la section locale COMMIT/fusion - plusieurs fois, je l'ai oublié que lors de la réinitialisation et finissent par « votre dépôt est X s'engage à l'avance .. "quand j'ai entièrement l'intention de nuke TOUS les changements/commits et de retourner à la branche distante.

0

Le passage à une nouvelle branche perdre des changements:

git checkout -b YOUR_NEW_BRANCH_NAME --force 

commutation à une modification perdre branche existante:

git checkout YOUR_BRANCH --force 
Questions connexes