Erreur Git lors de la validation après la fusion - fatal: impossible de faire une validation partielle pendant une fusion

280

J'ai dirigé un git pullqui s'est terminé par un conflit. J'ai résolu le conflit et tout va bien maintenant (j'ai également utilisé mergetool).

Lorsque je valide le fichier résolu avec git commit file.php -m "message"j'obtiens l'erreur:

fatal: cannot do a partial commit during a merge.

J'ai eu le même problème avant et l'utilisation -ade commit a parfaitement fonctionné. Je pense que ce n'est pas le moyen idéal parce que je ne veux pas commettre tous les changements. Je veux valider les fichiers séparément avec des commentaires séparés. Comment puis je faire ça? Pourquoi git ne permet-il pas aux utilisateurs de valider des fichiers séparément après une fusion? Je n'ai pas pu trouver de réponse satisfaisante à ce problème.

pMan
la source
5
Et vous savez, la recherche de git perform "full commit" ne retourne presque rien d'utile. Pas un document pertinent des pages de manuel de Git. C'est un outil si misérable.
2016
6
@Torek - parler d'un autre gâchis créé par Git ... Pourquoi est-il si difficile de retirer un fichier en conflit d'une autre branche afin que le conflit soit évité, ajoutez-le à cette branche, puis validez-le ??? Et WTF est un commit partiel? Je ne trouve aucune documentation à ce sujet ... Les utilisateurs sont obligés d'essayer les suppositions ci-dessous ...
jww
Comment avez-vous fait? J'ai un conflit et je ne peux rien faire
Niklas R.

Réponses:

442

J'ai trouvé que l'ajout de "-i" à la commande commit résout ce problème pour moi. Le -i lui dit essentiellement de mettre en scène des fichiers supplémentaires avant de valider. C'est:

git commit -i myfile.php
MikaelHalen
la source
18
Que veut Stage additional filesdire?
jcalfee314
9
@ jcalfee314 staging dans git consiste à préparer le fichier pour la validation. Dans ce cas particulier, il met le fichier en ligne de commande avant de valider. L'indicateur -i est principalement utilisé lorsque vous concluez une fusion. Vous pouvez en savoir plus sur les indicateurs de validation ici .
MikaelHalen
4
@ jcalfee314 J'ai vérifié la documentation et il est dit: "Avant de valider le contenu intermédiaire jusqu'à présent, mettez également en scène le contenu des chemins d'accès indiqués sur la ligne de commande. Ce n'est généralement pas ce que vous voulez, sauf si vous concluez une fusion conflictuelle" . Je suppose que dans cette condition, il y a une sorte d'incohérence dans la zone de transit qui ne peut pas être résolue git add, ce qui fait git commitéchouer. L'ajout -idirait à git d'ajouter et de valider en même temps. Je ne sais toujours pas pourquoi, mais cela semble logique.
JonSlowCN
5
Pour les noobs comme moi, vous obtiendrez également cette même erreur si vous essayez un message qui comprend des espaces sans guillemets. Par exemple. [git commit -m un deux trois] Correct: [git commit -m "un deux trois"]
Skychan
2
Le commentaire de Skychan était le ticket pour moi.
tehbeardedone
106
git commit -am 'Conflicts resolved'

Cela a fonctionné pour moi. Vous pouvez également essayer ceci.

Pratip Ghosh
la source
1
Incroyable, je ne savais pas ça!
JeanValjean
11
Cela ajoute tous les fichiers modifiés au commit, même ceux qui ne sont pas organisés, ce qui peut ne pas être souhaitable. Les utilisateurs peuvent vouloir laisser le drapeau «a»
Chase Sandmann
4
C'est exactement ce que l'utilisateur demande de ne pas faire, c'est d'éviter de valider tous les fichiers.
Michael
33

Vous pouvez utiliser git commit -ipour la plupart des cas, mais au cas où cela ne fonctionnerait pas

Tu dois faire git commit -m "your_merge_message". Pendant un conflit de fusion, vous ne pouvez pas fusionner un seul fichier, vous devez donc

  1. Mettre en scène uniquement le fichier en conflit ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
la source
16

Vous avez probablement eu un conflit dans quelque chose que vous n'avez pas organisé pour la validation. git ne vous laissera pas valider les choses indépendamment (car tout cela fait partie de la fusion, je suppose), vous devez donc git addce fichier et ensuite git commit -m "Merge conflict resolution". Le -idrapeau pour git commitfait l'ajout pour vous.

Paul Price
la source
5
Pas en 1.9.0 - le commit -itravaillé, mais pasgit add; git commit
LeeGee
14

Je l'ai obtenu lorsque j'ai oublié le -mcommit dans mon git lors de la résolution d'un conflit de fusion git.

git commit "commit message"

devrait être

git commit -m "commit message"
wgeorge
la source
2
Ah ah! J'ai encore oublié!
user2705463
9

Comme le message d'erreur l'indique, vous ne pouvez pas effectuer de validation partielle après une fusion. Au lieu de file.phpvalider, vous devez valider toutes les modifications.

Cela devrait fonctionner.

git commit -m "Fixing merge" 
Asim Jalis
la source
Merci, cela a aidé
Narendra Pandey
A travaillé pour moi tel quel
Shashank Bodkhe
6

Votre fusion s'est arrêtée au milieu de l'action. Vous devez ajouter vos fichiers, puis 'git commit':

git add file_1.php file_2.php file_3.php git commit

À votre santé

Moyshe Zuchmir
la source
5

Si vous souhaitez simplement abandonner tous les fichiers de sélection et de validation dans les ensembles que vous souhaitez,

git reset --soft <ID-OF-THE-LAST-COMMIT>

vous y amène.

La réinitialisation logicielle déplace le pointeur pointant vers HEAD actuel vers le commit (ish) que vous avez donné, mais ne modifie pas les fichiers. Une réinitialisation matérielle déplacerait le pointeur et ramènerait également tous les fichiers à l'état dans ce commit (ish). Cela signifie qu'avec la réinitialisation logicielle, vous pouvez effacer le statut de fusion, mais conserver les modifications apportées aux fichiers réels, puis les valider ou les réinitialiser individuellement à votre convenance.

Zds
la source
Pourriez-vous expliquer cela davantage? C'est probablement ce dont j'ai besoin, mais je ne comprends pas comment cela fonctionnerait ... Toutes les réponses ici sont simplement «ajoutez les fichiers, puis validez!», Mais c'est si trivialement évident; la raison pour laquelle je suis ici est que je ne veux pas ajouter ces fichiers avant de m'engager. -_-;
Kyle Baker du
Qui aide. Merci. :)
Kyle Baker
5
  1. allez dans le répertoire de votre projet
    1. afficher les fichiers cachés (le dossier .git apparaîtra)
    2. ouvrir le dossier .git
    3. supprimer MERGE_HEAD
    4. engager à nouveau
    5. si git vous a dit que git est verrouillé, retournez dans le dossier .git et supprimez index.lock
    6. recommencer tout fonctionnera bien cette fois.
Ahmed Samir
la source
Génial! Ça marcherait pour moi. Soit dit en passant, si sur MacOS, à partir du terminal, vous pourriez avoir appelé «open .git», la sorcière affichera le contenu «.git» dans le Finder
tontonCD
Cela fonctionne aussi pour moi. Cela devrait être accepté comme réponse.
vandu
3

Pour moi, cela s'est produit dans SourceTree lorsque j'ai essayé de valider une fusion avant de résoudre tous les fichiers. J'ai ensuite marqué le dernier fichier résolu et pourtant il m'a toujours donné cette erreur lors de la tentative de validation. J'ai fermé SourceTree et l'ai rouvert, puis il s'est bien engagé.

Justin
la source
1
merci, mais malheureusement cela n'a pas fonctionné pour moi. De façon ennuyeuse, j'ai dû valider une vue privée ainsi que la fusion avant de me permettre de valider la fusion.
Coxy
3

J'ai résolu cela avec une approche complètement différente, en utilisant uniquement le contrôle de source de Xcode.

Contexte: Une autre équipe a poussé les modifications du référentiel Git distant (via Beanstalk). De mon côté, les fichiers .xcodeproj sont entrés dans un répertoire différent et les modifications n'ont pas été prises. Plus tard, lorsque j'ai essayé de valider, j'ai reçu une erreur de conflit d'arbre dans Xcode.

Capture d'écran de Conflit d'arbre

Étant presque impossible à corriger en utilisant Xcode, j'ai remplacé le .xcodeprojfichier par une version téléchargée depuis le serveur Git. Le résultat ... le projet Xcode a semblé s'éclaircir, mais toutes les mises à jour du pull corrompu se présentaient comme des modifications que j'avais apportées et étaient mises en scène pour une validation.

Regardez tous ces mods et fichiers ajoutés

Cependant, lorsque j'essaie de valider, j'ai reçu la même erreur «fatal: impossible de faire une validation partielle lors d'une fusion», décrite ici.

Voici comment j'ai résolu le problème ... (Maintenant, comprenez que je suis un programmeur débutant, donc je pourrais manquer de compréhension ... mais mon ignorance m'a amené à trouver une autre façon de le faire.) Tout d'abord, j'ai cloné mon maître Branche dans une branche secondaire et est passée à cette branche. J'ai ensuite créé une copie de travail et placé le répertoire dans cette copie de travail en dehors du répertoire de projet d'origine. (Je ne sais pas si cela était nécessaire, mais c'est ce que j'ai fait en lisant d'autres techniques de dépannage.) Ensuite, j'ai changé de branche vers le maître, où j'ai réalisé que tous mes fichiers intermédiaires (modifications apportées à Commit) avaient disparu. Pour m'assurer que tous les fichiers ont été mis à jour avec les dernières modifications apportées par l'autre partie, j'ai créé une nouvelle branche appelée ThirdBranch, qui a dupliqué tous les fichiers, Poussez-le sur le serveur Git et laissez Beanstalk comparer ma version de serveur de la branche principale à la branche ThirdBrach que je viens de pousser (ligne par ligne), et toutes les modifications apportées par l'autre partie étaient présentes sur mon Xcode. Cela signifiait que mon référentiel maître et le référentiel maître Git étaient les mêmes, ce qui vérifie que j'ai résolu le problème en utilisant Xcode, uniquement.

Ne me demandez pas comment, au-delà de ce que je viens de décrire ... et comblez certainement les lacunes que j'ai omises. Je suis nouveau dans ce domaine et je ne comprends pas tout. Peut-être qu'un programmeur expérimenté peut séparer les informations non pertinentes des informations pertinentes et recréer cette technique plus clairement, ce qui explique en partie pourquoi je poste cela.

Il s'agit d'une réponse en double à la question en double comme à: Échec de la fusion Xcode Git est bloqué

Plexandre
la source
2
Veuillez ne pas publier de réponses en double. Bien que le problème sous-jacent puisse être le même, votre réponse est pour un problème beaucoup plus spécifique et ne trouble que les réponses à cette question générale. Je pense que dans ce cas, un commentaire à la question dans laquelle vous liez à votre réponse d'origine est plus approprié.
Fookatchu
2

Lors d'une fusion, Git veut garder une trace des branches parentes pour toutes sortes de raisons. Ce que vous voulez faire n'est pas une fusion comme git le voit. Vous voudrez probablement faire un rebasage ou une sélection manuelle.

Talljoe
la source
1
Je n'ai jamais utilisé de rebase ou de sélection de cerise auparavant, je viens de parcourir le manuel maintenant, alors que suggéreriez-vous, "git rebase master" après la fusion des conflits fonctionnera?
pMan
1
C'est un workflow parallèle. Voir stackoverflow.com/questions/804115/git-rebase-vs-git-merge Fondamentalement, si vous voulez que la «fusion» soit distincte, vous validez à la place la branche source à la fin de la branche cible.
Talljoe
1
Ajoutez simplement chaque fichier individuel puis validez sans -a.
Peter DeWeese
4
vous n'avez pas réellement répondu à la question mais plutôt simplement donné plus à rechercher. Maintenant, nous devons savoir "qu'est-ce que la cueillette des cerises" et "qu'est-ce que le rebasage".
ftrotter
2
Je me demande pourquoi cette réponse a été rejetée. J'ai toujours eu la curiosité de l'enfant quand quelqu'un me raconte des choses que je ne connaissais pas auparavant. Comme je l'ai commenté ci-dessus, maintenant je connais la sélection et le rebase des cerises. N'est-ce pas progressif / utile?
pMan
2

git commit -i -m 'merge message'n'a pas fonctionné pour moi. Ça disait:

fatal: No paths with --include/--only does not make sense.

FWIW, je suis arrivé ici via cette question connexe parce que je recevais ce message:

fatal: You have not concluded your merge (MERGE_HEAD exists).

J'ai également essayé mergetool, qui a dit No files need merging. Très perturbant! Donc, MERGE_HEAD n'est pas dans un fichier qui doit être fusionné - ??

Enfin, j'ai utilisé cette astuce pour ajouter uniquement les fichiers modifiés (je ne voulais pas ajouter tous les fichiers dans mon arborescence, car j'en ai certains que je veux garder non suivis):

git ls-files -m | xargs git add

Puis j'ai finalement (!) Pu m'engager et pousser. Ce serait sûr que git vous donne de meilleurs conseils sur ce qu'il faut faire dans ces situations.

szeitlin
la source
1

S'il se trouve dans l' arborescence source , nous devons explicitement marquer un fichier comme résolu après la résolution des conflits. Sélectionnez le fichier qui vient d'être résolu sans conflits. Puis Actions -> Résoudre les conflits -> Marquer comme résolu . Si vous avez plusieurs fichiers, faites de même pour tous. Engagez-vous maintenant.

cgr
la source
1

Après avoir lu tous les commentaires. c'était ma résolution:
je devais "l'ajouter" encore que valider:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
la source
1

Si vous utilisez l'arborescence des sources ou une autre interface graphique, assurez-vous que tous les fichiers sont vérifiés (après la fusion).

luky
la source
0

Parfois pendant la fusion, si des conflits surviennent et que des deltas nécessitent une résolution manuelle. Dans ce cas, corrigez la résolution manuelle des fichiers mentionnés.

Maintenant, si vous émettez,

git status Lib/MyFile.php

Vous verrez une sortie comme

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Depuis, vous avez déjà organisé la validation, il vous suffit d'émettre

git commit

Et votre commit se fera sans aucun problème.

Ketan Patel
la source