web-dev-qa-db-fra.com

Problème de fusion des modifications en amont dans ma branche

Je rencontre des conflits tout en essayant de fusionner les modifications en amont dans ma branche et je ne sais pas comment les résoudre.

J'ai créé ma propre fourchette. Je l'ai cloné. J'ai apporté des modifications à la branche sur ma fourche, engagé et poussé. Mais ensuite, le fork principal a été mis à jour, et j'ai essayé de mettre à jour mon propre fork en fusionnant en amont comme ceci:

$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master

La fusion indique qu'il y a un problème avec un fichier et que la fusion automatique ne fonctionne pas. Il me dit de le réparer moi-même et de re-fusionner. Je suis donc allé dans le référentiel (en amont) sur GitHub de la fourche principale et copié tout le code du nouveau fichier dans le fichier sur ma fourche, et j'ai essayé de fusionner à nouveau. Ensuite, git me donne cette erreur:

fatal: la "fusion" n'est pas possible car vous avez des fichiers non fusionnés. Veuillez les corriger dans l'arborescence de travail, puis utilisez 'git add/rm' comme approprié pour marquer la résolution et effectuer un commit, ou utilisez 'git commit -a'.

Y a-t-il un argument que je laisse de côté? Suis-je en train de faire quelque chose de stupide? Que signifie "fichiers non fusionnés"? N'est-ce pas l'intérêt de fusionner pour fusionner des fichiers? Dois-je valider mes modifications avant de fusionner?

38
anonymous

Ce que vous voyez signifie que la fusion automatique n'a pas pu résoudre les conflits dans les fichiers. Vous devez résoudre ces conflits manuellement. Courir git mergetool ou git gui.

33
Let_Me_Be

La commande "git merge" essaie d'incorporer les modifications d'une autre branche dans la branche actuelle. Si la fusion est propre, ce qui signifie qu'il n'y a aucun conflit, elle sera validée. Puisque votre fusion a eu des conflits, elle n'a pas été validée. Vous devez résoudre le conflit.

Extraire la copie du référentiel en amont est une façon de le faire - en acceptant la version du référentiel en amont. Vous pouvez le faire dans git en utilisant "git checkout --theirs conflicting_file.txt"

Modifier le fichier pour lui donner la forme souhaitée est une autre façon.

Une fois qu'il est corrigé, vous devez ajouter en utilisant "git add conflicting_file.txt" puis valider. Ensuite, votre copie de travail est propre et prête pour plus de piratage. Bonne chance.

12
cbare

Dans Git, il y a des cas de fusion refuse pour même commencer afin de protéger vos modifications locales. Cela peut se produire dans deux cas:

  • Vous avez modifications non validées dans votre référentiel en conflit avec la fusion . Le git refusera de faire une fusion avec le message suivant:

    Erreur 
    : Vos modifications locales dans les fichiers suivants seraient écrasées par la fusion: 
     foo 
     Veuillez valider vos modifications ou les cacher avant de pouvoir fusionner. 
     Abandon 
    

    Ensuite, vous devez d'abord valider les modifications (git commit -a ou git add + git commit), ou rangez-les avec git stash save.

  • Vous êtes au milieu d'une opération inachevée fusion-y . Il y a eu un conflit, par exemple

     Fusion automatique de foo 
     CONFLIT (contenu): Conflit de fusion dans foo 
     La fusion automatique a échoué; résoudre les conflits, puis valider le résultat. 
    

    et vous n'avez pas fini de résoudre les conflits (en modifiant les fichiers et en les marquant comme résolus avec git add, ou en utilisant un outil de fusion graphique via git mergetool) et n'a pas créé de validation de fusion finale avec git commit -a, ou a abandonné la fusion avec git reset --hard ( REMARQUE: cela annulera toutes vos modifications et vous perdrez le travail effectué sur la résolution des conflits !!!).

    Ou vous venez d'exécuter le deuxième git merge trop rapide ou utilisé git merge au lieu de git commit pour créer un commit de fusion.

    Erreur 
    : 'fusionner' n'est pas possible car vous avez des fichiers non fusionnés. 
     indice: Corrigez-les dans l'arborescence de travail, 
     indice: puis utilisez 'git add/rm' comme 
     indice: approprié pour marquer la résolution et effectuer un commit, 
     indice: ou utiliser 'git commit -a'. 
     fatal: Quitter en raison d'un conflit non résolu. 
    

    Résolvez les conflits comme décrit par ex. dans l'ancien amusant de terminer une fusion article de Junio ​​C Hamano et finaliser une fusion avec git commit, ou annuler une fusion, ou la cacher. Ensuite, si vous vouliez créer cette deuxième fusion, vous pouvez le faire.

Sidenote: par défaut, l'invite du shell compatible avec git indique si vous êtes en train de fusionner, rebaser ou appliquer des correctifs (git am opération). Vous pouvez également le configurer pour afficher si le répertoire de travail est sale (différent de la dernière version, c'est-à-dire HEAD).

7
Jakub Narębski

Courir git commit (après avoir ajouté les fichiers) la deuxième fois, pas git merge.

La résolution des conflits créera également des fichiers pour vous aider à fusionner. Voir également git mergetool.

3
alternative

Après avoir résolu une fusion, vous devez utiliser git add pour ajouter les fichiers que vous avez modifiés à l'index, puis valider (comme le dit le message). Cela dit de git "Oui, je veux vraiment faire ces changements".

N'oubliez pas, utilisez toujours git add avant de valider (normalement ou de valider une fusion), si vous utilisez l'interface de ligne de commande. Des frontends comme magit peuvent simplifier cela pour vous afin que vous n'ayez pas à vous soucier de taper "git add" à chaque fois.

2
Robin Green