Comment résoudre git en disant «Validez vos modifications ou cachez-les avant de pouvoir fusionner»?


763

J'ai fait quelques mises à jour sur ma machine locale, les ai poussées vers un référentiel distant, et maintenant j'essaie de récupérer les modifications sur le serveur et je reçois le message;

erreur: vos modifications locales dans les fichiers suivants seraient écrasées par la fusion:

wp-content / w3tc-config / master.php

Veuillez valider vos modifications ou les ranger avant de pouvoir fusionner.

Alors j'ai couru,

git checkout -- wp-content/w3tc-config/master.php

et j'ai réessayé et je reçois le même message. Je suppose que cela a w3tcchangé quelque chose dans le fichier de configuration sur le serveur. Je me fiche que la copie locale ou la copie distante passe sur le serveur (je suppose que la copie distante est la meilleure), je veux juste pouvoir fusionner le reste de mes modifications (mises à jour du plugin).

Des idées?



11
Il s'agit d'une question plus explicite avec plus de détails et une meilleure réponse. Je pense qu'il est utile de garder celui-ci. Oui, l'autre a été techniquement demandé en premier, mais la suppression de celle-ci rendrait plus difficile pour les gens de trouver les réponses qu'ils recherchent.
Jo Sprague

Réponses:


1302

Vous ne pouvez pas fusionner avec des modifications locales. Git vous protège de la perte de modifications potentiellement importantes.

Vous avez trois options:

  • Validez le changement en utilisant

    git commit -m "My message"
    
  • Cache-le.

    Stashing agit comme une pile, où vous pouvez pousser les modifications et les faire apparaître dans l'ordre inverse.

    Pour ranger, tapez

    git stash
    

    Faites la fusion, puis tirez la cachette:

    git stash pop
    
  • Ignorer les modifications locales

    en utilisant git reset --hard
    ougit checkout -t -f remote/branch

    Ou: Ignorer les modifications locales pour un fichier spécifique

    en utilisant git checkout filename


104
Vous pouvez également ignorer les modifications locales pour un fichier spécifique en faisant: git checkout filename
ckb

6
Merci. J'ajouterais à cela, si vous le faites, git reset --hardvous pouvez également supprimer les fichiers non suivis avecgit clean -dfx
Jo Sprague

13
Par défaut git stash, ne stockera pas les fichiers pour lesquels il n'y a pas d'historique. Donc, si vous avez des fichiers que vous n'avez pas encore ajoutés mais qui seraient écrasés ou "créés" par la fusion, la fusion sera toujours bloquée. Dans cette situation, vous pouvez également utiliser git stash -upour stocker des fichiers non validés. Ou vous pouvez simplement les supprimer!
joeytwiddle

25
courir git clean -dfxétait une idée terrible. Suppression de certains fichiers .gitignored dont j'avais réellement besoin.
ezuk

5
J'ai rencontré une situation où un utilisateur, après l'avoir fait git reset --hard, avait encore des modifications non fusionnées!
Amédée Van Gasse

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

La première commande stocke temporairement vos modifications dans la cachette et les supprime du répertoire de travail.

La deuxième commande change de branche.

La troisième commande restaure les modifications que vous avez stockées dans la cachette (l' --indexoption est utile pour vous assurer que les fichiers intermédiaires sont toujours intermédiaires).


1
stackoverflow.com/questions/15286075/… , peut également être utile
vikramvi

2
pour expliquer le point de @ vikramvi: nous pouvons également utiliser à la git stash popplace de git stash apply. Le premier le retire de la cachette tandis que le dernier le garde toujours là
Anupam

27

Vous pouvez essayer l'une des méthodes suivantes:

rebaser

Pour des modifications simples, essayez de rebaser dessus tout en tirant les modifications, par exemple

git pull origin master -r

Il appliquera donc votre branche actuelle au-dessus de la branche en amont après la récupération.

Cela équivaut à: checkout master, fetchet les rebase origin/mastercommandes git.

Il s'agit d'un mode de fonctionnement potentiellement dangereux. Il réécrit l'histoire, ce qui n'est pas de bon augure lorsque vous avez déjà publié cette histoire. N'utilisez cette option que si vous avez lu git-rebase(1)attentivement.


check-out

Si vous ne vous souciez pas de vos modifications locales, vous pouvez basculer vers une autre branche temporaire (avec force), et la réactiver, par exemple

git checkout origin/master -f
git checkout master -f

réinitialiser

Si vous ne vous souciez pas de vos modifications locales, essayez de le réinitialiser à HEAD (état d'origine), par exemple

git reset HEAD --hard

Si ci-dessus n'aide pas, il peut s'agir de règles dans votre fichier de normalisation git ( .gitattributes), il est donc préférable de valider ce qu'il dit. Ou votre système de fichiers ne prend pas en charge les autorisations, vous devez donc désactiver filemodedans votre configuration git.

En relation: Comment forcer "git pull" pour écraser les fichiers locaux?


1
Ça ne marche pas: je reçois toujours le même message comme "cache tes modifications en premier". Lorsque je tape "git stash" puis "git pull" -> "erreur: vous avez des modifications non enregistrées .. faites d'abord une cachette".
Peu

@ trinity420 Pourrait-il s'agir de vos autorisations de fichiers, vérifiez git statusles modifications que vous avez apportées après le stockage. Si aucune réponse ne vous aide, envisagez d'ajouter une nouvelle question.
kenorb

merci mais mon problème a été résolu, j'ai tout essayé ici, rien n'a fonctionné, puis j'ai cliqué sur "valider les modifications" "fusionner" dans PHPStorm puis j'ai décompressé les modifications et cela a fonctionné ..
trinity420


13

La situation que j'ai rencontrée était donc la suivante:

erreur: vos modifications locales aux fichiers suivants seraient écrasées par la fusion: wp-content / w3tc-config / master.php Veuillez valider vos modifications ou les cacher avant de pouvoir fusionner.

sauf, juste avant cela, était distant: donc en fait ceci:

remote: erreur: vos modifications locales aux fichiers suivants seraient écrasées par la fusion: certains / fichier.ext Veuillez valider vos modifications ou les cacher avant de pouvoir fusionner.

Ce qui se passait était (je pense, pas 100% positif) que le crochet de réception de git post commençait à fonctionner et à se visser en raison de changements de mouvement dans le référentiel du serveur distant, qui en théorie, n'aurait pas dû être touché.

Donc, ce que j'ai fini par faire en traçant le hook post-réception et en trouvant cela, c'était d'aller dans le référentiel distant sur le serveur, et il y a eu le changement (qui n'était pas sur mon référentiel local, qui, en fait, dit qu'il correspondait, aucun changement, rien à valider, à jour, etc.) Donc, pendant le local, il n'y avait aucun changement, sur le serveur, j'ai ensuite fait un git checkout -- some/file.extpuis les référentiels local et distant correspondaient réellement et je pouvais continuer à travailler et à déployer. Je ne sais pas exactement comment cette situation s'est produite, bien qu'une douzaine de développeurs et des changements informatiques puissent y être pour quelque chose.


2
Est-ce une question ou une réponse?
stdcall

2
@stdcall - Un peu des deux. Lorsque je suis tombé sur cette situation comme décrit dans la question, voici ce que je devais faire pour y remédier. Ce n'était définitivement pas un git normal à résoudre, et d'après la question, il semble que ce pourrait être la même situation anormale (c'est-à-dire, des modifications de configuration sur le serveur, mais le local n'a aucun changement). Si quelqu'un a plus d'une idée de pourquoi (ou comment) cela s'est produit, je serais heureux de recevoir des informations.
Mike

7

AVERTISSEMENT: cela supprimera les fichiers non suivis, donc ce n'est pas une excellente réponse à cette question.

Dans mon cas, je ne voulais pas conserver les fichiers, donc cela a fonctionné pour moi:

Git 2.11 et plus récent:

git clean  -d  -fx .

Git plus âgé:

git clean  -d  -fx ""

Référence: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x signifie que les fichiers ignorés sont également supprimés ainsi que les fichiers inconnus de git.

  • -d signifie supprimer les répertoires non suivis en plus des fichiers non suivis.

  • -f est requis pour le forcer à s'exécuter.


4

Pour garder une trace de vos fichiers nouvellement créés tout en résolvant ce problème:

Si vous avez des fichiers nouvellement créés , vous pouvez créer un correctif de modifications locales, extraire les fusions distantes et appliquer votre correctif local une fois la fusion distante terminée, comme défini étape par étape ci-dessous:

  1. Mettez en scène vos changements locaux. (ne vous engagez pas). La mise en scène est nécessaire pour créer un correctif des nouveaux fichiers créés (car ils ne sont toujours pas suivis)

git add .

  1. Créer un patch pour garder une trace

git diff --cached > mypatch.patch

  1. Ignorer les modifications locales et supprimer les nouveaux fichiers locaux

git reset --hard

  1. Tirez les changements

git pull

  1. Appliquez votre patch

git apply mypatch.patch

Git fusionnera les modifications et créera des fichiers .rej pour les modifications qui ne sont pas fusionnées.

Comme suggéré par Anu, si vous rencontrez des problèmes pour appliquer le patch, essayez:

git apply --reject --whitespace=fix mypatch.patch Cette réponse git: patch n'applique pas les discussions en détail sur ce problème

Profitez de votre travail continu sur votre fonctionnalité et validez vos modifications locales une fois terminé.


Je voulais pousser une partie du code avec de nouvelles modifications, alors j'ai fait: 1. créé un correctif à partir de ma branche de développement local 2. fait la réinitialisation matérielle 3. tiré les nouvelles modifications du maître au développeur (pour éviter tout conflit de fusion) 4 a fait un petit changement dans mon dev local 5. poussé vers le dev distant 6. patch appliqué en arrière -> Got error error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply:, j'ai toujours le mypatch.patch, mais je ne sais pas pourquoi il n'est pas appliqué et j'ai perdu mes changements !
Anu

Je l'ai eu, la commande correcte était git apply --reject --whitespace=fix mypatch.patch, j'ai récupéré mes changements ouf !!! [Merci à] ( stackoverflow.com/a/15375869/6484358 )
Anu

1
Anu, la commande git apply mypatch.patch est correcte pour appliquer le patch, c'est ce que j'utilise tout le temps, il peut y avoir un problème avec le patch créé lui-même, et vous ne perdez jamais vos modifications si vous avez votre patch en main, il contient toutes les modifications consolidées.
Manpreet

2

Demander un commit avant de tirer

  • git stash
  • git pull origin << branchname >>

Si besoin :

  • git stash appliquer

1
Utilisez git stash lorsque vous souhaitez enregistrer l'état actuel du répertoire de travail et de l'index, mais que vous souhaitez revenir à un répertoire de travail propre. La commande enregistre vos modifications locales et rétablit le répertoire de travail pour qu'il corresponde à la validation HEAD.
Pushpak Sharma

2

Pour moi seulement git reset --hard fonctionnait que.

S'engager n'était pas une option, car il n'y avait rien à engager.

Le stockage n'était pas une option car il n'y avait rien à cacher.

On dirait qu'il aurait pu provenir de fichiers exclus .git/info/excludeet avoir git update-index --assume-unchanged <file>édité certains fichiers.


0

Dans mon cas, j'ai sauvegardé puis supprimé le fichier dont Git se plaignait, commis, puis j'ai finalement pu consulter une autre branche.

J'ai ensuite remplacé le fichier, recopié dans le contenu et continué comme si de rien n'était.



0

J'ai essayé la première réponse: git stashavec le score le plus élevé, mais le message d'erreur est toujours apparu, puis j'ai trouvé cet article pour valider les modifications au lieu de cacher 'Reluctant Commit'

et le message d'erreur a finalement disparu:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

alors ça a marché. j'espère que cette réponse vous aidera. :)


0

Si vous utilisez Git Extensions, vous devriez pouvoir trouver vos modifications locales dans le Working directorycomme indiqué ci-dessous:

entrez la description de l'image ici

Si vous ne voyez aucun changement, c'est probablement parce que vous êtes sur un mauvais sous-module. Vérifiez donc tous les articles avec une icône de sous-marin comme indiqué ci-dessous:

entrez la description de l'image ici

Lorsque vous avez trouvé un changement non engagé:

Sélectionnez la ligne avec Working directory, accédez à l' onglet Diff , cliquez avec le bouton droit sur les lignes avec une icône de crayon (ou +ou -), choisissez Réinitialiser pour valider d'abord ou valider ou ranger ou tout ce que vous voulez faire avec.


0

Pour moi, cela a fonctionné:

git reset --hard

et alors

git pull origin <*current branch>

après ça

git checkout <*branch>


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.