Comment puis-je ignorer les modifications à distance et marquer un fichier comme «résolu»?

J’ai des fichiers locaux, je tire de la twig distante et il y a des conflits. Je sais que je voudrais conserver mes modifications locales et ignorer les modifications à distance provoquant des conflits. Y a-t-il une commande que je peux utiliser pour dire “marquer tous les conflits comme résolus, utilisez local”?

    git checkout a l’option --ours pour vérifier la version du fichier que vous aviez localement (par opposition à --theirs , qui est la version que vous avez extraite). Vous pouvez passer . à vérifier pour lui dire de vérifier tout dans l’arbre. Ensuite, vous devez marquer les conflits comme résolus, ce que vous pouvez faire avec git add , et valider votre travail une fois terminé:

     git checkout --ours . # checkout our local version of all files git add -u # mark all conflicted files as merged git commit # commit the merge 

    Notez le . dans la git checkout . C’est très important et facile à rater. git checkout a deux modes; l’un dans lequel il change de twig, et l’autre dans lequel il vérifie les fichiers en dehors de l’index dans la copie de travail (parfois en les insérant dans l’index d’une autre révision en premier). La façon dont il se distingue est de savoir si vous avez passé un nom de fichier dans; si vous n’avez pas passé de nom de fichier, il essaie de changer de twig (mais si vous ne transmettez pas de twig, il essaiera de nouveau de vérifier la twig actuelle), mais il refuse de le faire s’il y a des fichiers modifiés que cela affecterait. Donc, si vous voulez un comportement qui écrase les fichiers existants, vous devez passer . ou un nom de fichier pour obtenir le second comportement de git checkout .

    C’est également une bonne habitude d’avoir, lors du passage d’un nom de fichier, de le décaler avec -- , tel que git checkout --ours -- . Si vous ne le faites pas et que le nom de fichier correspond au nom d’une twig ou d’une balise, Git pensera que vous voulez vérifier cette révision au lieu de vérifier ce nom de fichier et d’utiliser la première forme de la checkout commander.

    Je vais développer un peu comment les conflits et la fusion fonctionnent dans Git. Lorsque vous fusionnez le code de quelqu’un d’autre (ce qui se produit également lors d’une extraction, une extraction est essentiellement une extraction suivie d’une fusion), il existe peu de situations possibles.

    Le plus simple est que vous êtes sur la même révision. Dans ce cas, vous êtes “déjà à jour”, et rien ne se passe.

    Une autre possibilité est que leur révision ne soit qu’un descendant de vous, auquel cas vous aurez par défaut une “fusion rapide”, dans laquelle votre HEAD est simplement mis à jour avec son commit, sans fusion (ceci peut être désactivé si vous voulez vraiment enregistrer une fusion, en utilisant --no-ff ).

    Ensuite, vous entrez dans les situations dans lesquelles vous devez fusionner deux révisions. Dans ce cas, il y a deux résultats possibles. L’un est que la fusion se passe proprement; Toutes les modifications se trouvent dans des fichiers différents ou se trouvent dans les mêmes fichiers, mais suffisamment éloignées pour que les deux ensembles de modifications puissent être appliqués sans problème. Par défaut, lorsqu’une fusion propre se produit, elle est automatiquement validée, mais vous pouvez la désactiver avec --no-commit si vous devez l’éditer au préalable (par exemple, si vous renommez la fonction foo en bar et que quelqu’un ajoute un nouveau code). qui appelle foo , il fusionnera proprement, mais produira une arborescence cassée, vous pouvez donc le nettoyer dans le cadre de la validation de fusion afin d’éviter de commettre des commits).

    La dernière possibilité est qu’il y a une véritable fusion et qu’il y a des conflits. Dans ce cas, Git fera autant de la fusion que possible et produira des fichiers avec des marqueurs de conflit ( <<<<<<< , ======= et >>>>>>> ) dans votre copie de travail. Dans l'index (également appelé "zone de transfert", l'endroit où les fichiers sont stockés par git add avant de les valider), vous aurez 3 versions de chaque fichier avec des conflits; il y a la version originale du fichier de l'ancêtre des deux twigs que vous fusionnez, la version de HEAD (votre côté de la fusion) et la version de la twig distante.

    Pour résoudre le conflit, vous pouvez modifier le fichier qui se trouve dans votre copie de travail, supprimer les marqueurs de conflit et corriger le code pour qu'il fonctionne. Ou, vous pouvez vérifier la version de l'un ou l'autre des côtés de la fusion, en utilisant git checkout --ours ou git checkout --theirs . Une fois que vous avez placé le fichier dans l'état que vous voulez, vous indiquez que vous avez fini de fusionner le fichier et qu'il est prêt à être utilisé en utilisant git add , puis vous pouvez valider la fusion avec git commit .

    Assurez-vous de l’origine du conflit: si c’est le résultat d’une git merge , voir la réponse de Brian Campbell .

    Mais si est le résultat d’un git rebase , afin de git rebase les modifications distantes et d’utiliser les modifications locales , vous devrez:

     git checkout --theirs -- . 

    Voir ” Pourquoi la signification de” ours “et” theirs “est-elle inversée” “pour voir comment les ours et les theirs sont échangés pendant une rebase (parce que la twig en amont est extraite).