git: Changer de branche et ignorer toutes les modifications sans valider


318

Je travaillais sur une branche git et j'étais prêt à valider mes modifications, j'ai donc fait une validation avec un message de validation utile. J'ai ensuite, par distraction, 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,

erreur: vous avez des modifications locales sur "X"; ne peut pas changer de branche.

Puis-je changer de succursale sans m'engager? Si oui, comment puis-je configurer cela? Sinon, comment puis-je sortir de ce problème? Je veux ignorer les changements mineurs sans commettre et simplement changer de branche.


1
Je crois que cela ne se produit que lorsque les modifications sont mises en scène pour la validation mais non validées? 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.
Jeremy Wall

1
Salut Jeremy, Que veux-tu dire par «mise en scène»? Forcer l'utilisateur à valider le fichier avant de modifier les branches ne semble pas être un excellent flux de travail. Par exemple, si je suis dans le référentiel maître et que je souhaite rapidement vérifier quelque chose dans une branche. Je dois d'abord valider le code au maître, même si le code est à moitié écrit! Êtes-vous en train de dire qu'en effet, il devrait être possible de commander une succursale dans cette situation?
Daniel Farrell

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


1
lorsque vous passez à une branche sans valider les modifications de l'ancienne branche, git essaie de fusionner les modifications apportées aux fichiers de la nouvelle branche. Si la fusion est effectuée sans aucun conflit, les branches de swithing seront réussies et vous pourrez voir les changements dans la nouvelle branche. Mais si un conflit se produit, vous obtiendrez error: You have local changes to '<filename>'; cannot switch branches.et la branche ne changera pas. vous pouvez faire git checkout -m <branch-name>pour fusionner les conflits et passer à la succursale et résoudre les conflits vous-même, ou git checkout -f <branch-name>pour ignorer les modifications.
samad montazeri

Réponses:


400

Vous avez besoin d'un état propre pour changer de branche. Le paiement en succursale ne sera autorisé que s'il n'affecte pas les «fichiers sales» (comme le remarque Charles Bailey dans les commentaires).

Sinon, vous devez soit:

  • planquez votre changement actuel ou
  • reset --hard HEAD (si cela ne vous dérange pas de perdre ces modifications mineures) ou
  • checkout -f (Lorsque vous changez de branche, continuez même si l'index ou l'arborescence de travail diffère de HEAD. Ceci est utilisé pour supprimer les modifications locales.)

Ou, plus récemment:

Continuez même si l'index ou l'arborescence de travail diffère de HEAD.
L'index et l'arborescence de travail sont restaurés pour correspondre à la cible de commutation.

Cela diffère de git switch -m <branch-name>ce qui déclenche une fusion à trois voies entre la branche actuelle, le contenu de votre arborescence de travail et la nouvelle branche est terminée: vous ne perdrez pas votre travail en cours de cette façon.


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

10
Pour la méthode stash, j'ai tapé "git stash save", "git checkout otherbranch", puis enfin "git stash pop".
Venkat D.

1
Actuellement, je ne vois pas ce message d'erreur, et les modifications que j'ai apportées sur une branche apparaissent sur l'autre lorsque je fais "git status". quelque chose a changé?
Senthil A Kumar

2
Merci. la caisse -f était ce dont j'avais besoin. j'ai fait réinitialiser git --hard git clean -f git checkout mybranch -f
nologo

1
Voici la seule grande chose que Git a eu totalement tort en violant la définition de base d'une branche. Contrairement à git branch signifie deux espaces de travail totalement différents issus d'un référentiel.
nehem

125

Si vous souhaitez annuler les modifications,

git checkout -- <file>
git checkout branch

Si vous souhaitez conserver les modifications,

git stash save
git checkout branch
git stash pop

10
En effet, ce que Romerun dit (pour être complet): git stash save(quand dans la branche de travail Y) alors git checkout branchXfaites quelque chose git add/commit -metc. git checkout branchYet git stash poprécupérez la cachette
Highmastdon

2
Peut-être. J'ai cependant une situation où je veux faire ce que dit la réponse, si je comprends bien: cacher les changements, passer de Y à X, puis modifier les changements et les valider sur X.
Ben Klein

1
à noter qui git stash saveest désormais déprécié au profit degit stash push
Argento

Cet alias simplifie la conservation des modifications lors du changement de branche.
Tom Hale

62

eh bien, ça devrait être

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

5
Oui, le stash est global, pas spécifique à une branche, si je stash pop après avoir changé de branche, j'obtiendrai le même stash que sur les autres branches
Aditya Mittal

6
À noter git stashsera par défautgit stash save
Charlie-Greenman

Merci, c'est très utile pour moi
Govind Kumar


16

Notez que si vous avez fusionné des branches distantes ou avez des validations locales et que vous souhaitez revenir au HEAD distant, vous devez faire:

git reset --hard origin/HEAD

HEAD seul ne fera référence qu'à la validation / fusion locale - à plusieurs reprises, j'ai oublié que lors de la réinitialisation et que vous vous retrouvez avec "votre référentiel est X s'engage à venir .." lorsque j'avais l'intention de supprimer TOUTES les modifications / validations et de retourner à la branche distante .


9

Si vous avez apporté des modifications aux fichiers que Git doit également changer lors du changement de branche, il ne vous le permettra pas. Pour ignorer les modifications de travail, utilisez:

git reset --hard HEAD

Ensuite, vous pourrez changer de branche.


9

Aucune de ces réponses ne m'a aidé car j'avais toujours des fichiers non suivis même après la réinitialisation et la sauvegarde. Je devais faire:

git reset --hard HEAD
git clean -d -f

4

passer à une nouvelle succursale en perdant les modifications:

git checkout -b YOUR_NEW_BRANCH_NAME --force

passer à une branche existante en perdant les modifications:

git checkout YOUR_BRANCH --force

4

Réponse facile:

est de forcer le paiement d'une branche

git checkout -f <branch_name>

Forcer l'extraction d'une branche indique à git de supprimer toutes les modifications que vous avez apportées à la branche actuelle et de retirer celle souhaitée.

ou au cas où vous vérifieriez un commit

git checkout -f <commit-hash>


"pensais que je pouvais changer de branche sans m'engager. Si oui, comment puis-je configurer cela? Sinon, comment puis-je résoudre ce problème?"

La réponse à cette question est non , c'est littéralement la philosophie de Git que vous gardez une trace de toutes les modifications et que chaque nœud (c'est-à-dire commit) doit être à jour avec les dernières modifications que vous avez apportées, sauf si vous avez fait un nouveau commit bien sûr.


Vous avez décidé de garder les changements?

Ensuite, rangez-les en utilisant

git stash

puis pour libérer vos modifications dans la branche souhaitée, utilisez

git stash apply

qui vous appliquera les modifications mais les conservera également dans la file d'attente. Si vous ne souhaitez pas les conserver dans la pile de stockage, faites-les apparaître à l'aide de

git stash pop

C'est l'équivalent de applypuisdrop


2

Fermez le terminal, supprimez le dossier où se trouve votre projet, puis clonez à nouveau votre projet et voilá.


2
git n'est pas conçu pour vous pousser à supprimer le projet et à le cloner à nouveau! si vous voulez obtenir la dernière version d'origine, vous venez reset --hard!
Ahmed Nour Jamal El-Din

2

Si vous souhaitez conserver les modifications et modifier la branche dans une seule ligne de commande

git stash && git checkout <branch_name> && git stash pop

1

Déplacer les modifications non validées vers une nouvelle branche

J'ai créé un .gitconfigalias pour cela:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

Pour passer à new-branch-name, utilisez:

git spcosp new-branch-name

Et tous les changements de fichier et d'index non validés seront conservés.


1

git checkout -f your_branch_name

git checkout -f your_branch_name

si vous rencontrez des problèmes pour annuler les modifications:

git checkout .

si vous souhaitez supprimer les répertoires et fichiers non suivis:

git clean -fd

0

Pour passer à une autre branche sans valider les modifications lorsque git stash ne fonctionne pas. Vous pouvez utiliser la commande ci-dessous:

git checkout -f nom-de-branche

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.