Erreur lors du passage à la branche principale: mes modifications locales seraient écrasées lors du paiement

128

Cette question est similaire à celle-ci , mais plus spécifique.

J'ai un projet avec deux branches ( staginget beta).

Je développe staginget utilise la masterbranche pour corriger les bugs. Donc, si je travaille sur la mise en scène et que je vois une erreur, je passe à la masterbranche:

git checkout master

et faites le truc:

git add fileToAdd
git commit -m "bug fixed"

puis je fusionne avec les deux branches:

git checkout staging
git merge master
git checkout beta
git merge beta

Et peu importe s'il y a d'autres fichiers dans l'arborescence de travail.

Mais maintenant, lorsque j'essaye de passer à la masterbranche, j'obtiens une erreur :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

J'ai pensé que je devais supprimer le fichier de la zone de préparation:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

mais j'obtiens la même erreur. Si git statusje reçoisNo changes to commit

Manolo
la source
4
Avez-vous essayé reset --hard? Si vous êtes vraiment sûr de vouloir annuler vos modifications. Ou utilisez la réserve si vous ne le faites pas.
keltar
@keltar - Non. Je ne veux pas annuler mes modifications. Gardez-les simplement sur l'arbre de travail pour un commit ultérieur
Manolo
1
Je ne pense pas que vous puissiez changer de branche tout en conservant les modifications non validées, mais je pourrais facilement me tromper - pas vraiment mon domaine. Essayez de vous git add your-fileengager.
keltar
@keltar - J'ai déjà travaillé de cette façon. Je ne veux pas valider de changements pour le stagingmoment.
Manolo
Peut-être que votre fichier en conflit n'a pas été modifié lorsque vous avez essayé cela auparavant. Vous avez des modifications, il faut les enregistrer quelque part pour les restaurer plus tard. Il est très peu probable que cela soit possible sans engagement. Mais si vous ne voulez vraiment pas utiliser le stash, c'est exactement pourquoi il existe.
keltar

Réponses:

128

Votre erreur apparaît lorsque vous avez modifié un fichier et que la branche vers laquelle vous basculez a également des modifications pour ce fichier (à partir du dernier point de fusion).

Vos options, comme je le vois, sont - commit, puis modifiez ce commit avec des changements supplémentaires (vous pouvez modifier les commits dans git, tant qu'ils ne sont pas pushédités); ou - utilisez le stash:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash savecréera un stash contenant vos modifications, mais il n'est associé à aucun commit ni même à une branche. git stash popappliquera la dernière entrée de cache à votre branche actuelle, en restaurant les modifications enregistrées et en la supprimant de la cache.

keltar
la source
3
Je vous remercie. Êtes-vous sûr que cela n'apportera aucun changement à mon arbre de travail (pas de fichiers ajoutés)? Je ne veux pas perdre mes modifications: - /
Manolo
Oups, faute de frappe addlorsqu’il est effectivement save.. Vous voulez dire, pour d'autres fichiers? git stash savesans paramètre de nom de fichier enregistre tous les fichiers modifiés, si vous le souhaitez (et les rétablit au dernier état de validation). Et avoir une copie supplémentaire de l'arborescence des répertoires ne fait jamais de mal, mais je suis toujours paranoïaque à ce sujet.
keltar
La chose serait de sauvegarder tous les fichiers modifiés à l'exception de celui que je veux ajouter à la masterbranche. En outre, une option serait poples changements sur une autre branche?
Manolo
Je ne sais pas ce que tu veux dire. Oui, vous pouvez appliquer le stash sur une autre branche, mais cela remplacera simplement le contenu des fichiers, pas les fusionnera.
keltar
1
@Honey ça n'a rien à voir avec les branches, le problème est les changements non validés. Checkout, par définition, doit réinitialiser vos fichiers à l'état de master, mais ce faisant, il perdra son contenu actuel, et comme ce contenu n'est pas validé, il serait impossible de revenir à cet état plus tard, d'où une erreur. ne serait pas contrarié par les modifications perdues plus tard.
keltar
151

J'ai rencontré le même problème et je l'ai résolu en

git checkout -f branch

et sa spécification est assez claire.

-f, --force

Lors du changement de branche, continuez même si l'index ou l'arbre de travail diffère de HEAD. Ceci est utilisé pour rejeter les changements locaux.

Lors de l'extraction des chemins de l'index, n'échouez pas sur les entrées non fusionnées; à la place, les entrées non fusionnées sont ignorées.

KikiYu
la source
7
Quand mon git s'est bloqué (pas de changements locaux mais toujours cette erreur), cette solution m'a aidé!
lukyer
6
Merci, vous avez empêché mon écran de passer un poing dessus.
Owl
3
J'ai perdu mes modifications de cette façon
Jacek Dziurdzikowski
1
Oui, vous perdrez les modifications en faisant cela, cela devrait s'accompagner d'une grande mise en garde.
Alexander Mills
Je veux que ce soit l'inverse. master est derrière ma branche et je suis à jour avec master mais il est toujours incapable de changer de branche. Doit être un bogue git.
jgmjgm
12

Vous pouvez forcer l'extraction de votre branche, si vous ne souhaitez pas valider vos modifications locales.

git checkout -f branch_name
Deepika Patel
la source
1
Ce sudon'est pas nécessaire, cela ne fera que briser les autorisations de fichier. C'est la même commande git que celle publiée par @kiki_yu un an auparavant, mais c'est encore pire.
kenorb
2
J'ai perdu mes modifications de cette façon
Jacek Dziurdzikowski
2
@JacekDziurdzikowski Vous avez donc perdu deux fois vos modifications (voir commentaire sur la réponse de kiki_yu), à la fois en appliquant des solutions qui mentionnaient très explicitement que rejeter les modifications locales était le but même . Mon détecteur de sarcasme est-il cassé ou ... tu es sérieux?
RomainValeri
@RomainValeri Hmm, je suppose que c'était ma façon d'avertir les autres qui sont des débutants avec git (ils doivent être débutants s'ils lisent cet article) d'être prêts à dire au revoir à tout changement qu'ils ont fait. Je pensais que le moment où les modifications effectuées dans une branche devraient rester sur cette branche jusqu'à ce que je la vérifie à nouveau. Astuce pour les nouveaux arrivants qui pensent de cette façon aussi: utilisez git stash :)
Jacek Dziurdzikowski
Réponse en double, sans raison. La première réponse contient encore plus d'informations.
MAChitgarha le
9

J'ai rencontré le même problème et je l'ai résolu en

git checkout -f branche

Eh bien, soyez prudent avec le -fcommutateur. Vous perdrez toutes les modifications non validées si vous utilisez le -fcommutateur. Bien qu'il puisse y avoir des cas d'utilisation où il est utile d'utiliser -f, dans la plupart des cas, vous voudrez peut-être stashvos modifications, puis les switchbranches. La stashingprocédure est expliquée ci-dessus.

BeNiza
la source
0

Vous pouvez valider dans la branche actuelle, extraire vers une autre branche et enfin sélectionner ce commit (au lieu de fusionner).

Vitaly Zdanevich
la source
Cela peut être plus utile si vous donnez plus d'explications à ce sujet.
MAChitgarha
-1

Si vous obtenez ceci en essayant de vérifier une autre branche:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Cela signifie que vous devez valider certaines modifications sur la branche que vous avez extraite - ou que vous devez les effacer ou les cacher comme la plupart des points ci-dessus. 19 fois sur 20, je suis beaucoup plus susceptible de simplement valider mes changements.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Maintenant que vous avez fait cela, vous pouvez consulter l'autre branche et basculer assez facilement.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Assurez-vous simplement que vous êtes tous les deux sur la bonne branche et que vous poussez vers la bonne branche lorsque vous exécutez votre commande git push origin $ {branch}. Remarque: si votre projet est directement connecté à Intellij, vous pouvez voir que vous avez changé de branche dans le coin inférieur droit de la fenêtre principale.

Tony Fraser
la source