Après un conflit de fusion Git, beaucoup de fichiers que je n'ai pas touchés deviennent des modifications à être propagées.

donc je travaille dans une branche, faire quelques changements, et courir git merge master. J'obtiens un conflit de fusion sur un des fichiers que j'ai modifié (que je sais gérer), mais pour une raison quelconque, un tas de fichiers que j'ai fait touch (mais qui a été mis à jour dans master) entre soudainement ma liste de "changements à être commis".

Pourquoi est-ce? Et comment puis-je résoudre ce problème? Je ne veux pas que ces changements non-par-moi s'engagent.

23
demandé sur grautur 2012-02-08 12:29:47

5 réponses

lorsque vous tentez une fusion, tous les fichiers qui peuvent être automatiquement fusionnés (par exemple lorsque vous n'avez pas de modifications dans votre branche locale mais qui ont été modifiées sur la branche source), sont automatiquement fusionnés et mis en scène. Les fichiers qui ne peuvent pas être fusionnés automatiquement sont mis à jour dans votre zone de travail avec des marqueurs de conflit et vous devez les corriger.

Git assemble toujours les nouveaux commits dans la zone de transit avant de les commettre. La fusion fait la même chose. Un nouveau commit avec tous les changements de la branche source sont créés dans la zone de transit. En cas de conflit, ce processus de mise à jour de la zone de transit est interrompu et le contrôle vous est donné. C'est pourquoi ce qui se passe. Une fois que vous propagez, une "commit de fusion" sera créée dans le dépôt qui possède à la fois les branches source et cible en tant que parents.

quant à " Je ne veux pas qu'aucun de ces changements non-by-me soit engagé."pourquoi avez-vous fait une fusion à tous si vous ne voulez pas de changements?

0
répondu Noufal Ibrahim 2012-02-08 08:43:44

la raison pour laquelle cela s'est produit est que vous avez très probablement fait le contraire de ce que vous aviez l'intention de faire.

supposons que votre branche active s'appelle topic-branch.

au Lieu de faire:

$ git merge master

tu aurais pu faire:

$ git checkout master
$ git merge topic-branch

en anglais, au lieu de fusionner les master en topic-branch vous auriez pu fusionner topic-branch en master.

Pour comprendre pourquoi cela permet d'obtenir le désiré résultat, nous pouvons examiner la déclaration faite lors d'une précédente réponse:

lorsque vous tentez une fusion, tous les fichiers qui peuvent être automatiquement fusionnés (par exemple, si vous n'avez pas de changements dans votre branche locale mais qui ont été modifiés sur la branche source), sont automatiquement fusionnées et mises en scène.

Le problème que vous rencontrez est simplement merge essaie de faire son travail. Les fichiers ne sont pas modifiés dans votre branche de sujet, mais ils sont sur le branche vous fusionnez en elle. Si vous regardez cela dans la direction opposée de la fusion du topic-branch en master le problème disparaît car il ne tient compte que des fichiers que vous avez modifiés.

conceptuellement, voici ce que fait merge (plus ici):

que la tête courante soit appelée courant, et la tête à fusionner appelée fusion.

  1. identifier l'ancêtre commun de current et merge. Appeler ancêtre de validation.
  2. Traiter les cas faciles. Si l'ancêtre de validation est égal à fusionner, puis ne rien faire. Si ancêtre-commit égale courant, puis faire un avance rapide de fusion.
  3. sinon, déterminez les changements entre l'ancêtre-commit et la fusion.
  4. Tentative de fusionner ces changements dans les fichiers actuels.
  5. s'il n'y a pas de conflits, créer une nouvelle commit, avec deux parents, current et merge. Définir actuel (et tête) pour pointer vers ce nouveau commit, et mettre à jour le dossiers de travail pour le projet en conséquence.
  6. s'il y a un conflit, insérez les marqueurs de conflit appropriés et informez l'utilisateur. Pas de commettre est créé.
5
répondu Christopher Perry 2013-10-09 06:38:46

je pense que le problème avec cette façon de faire est qu'après la propagation, une "poussée" sera effectuée. La " poussée "inclura tous les fichiers engagés - y compris les fichiers que le" pousseur " n'a pas touchés. Cela rend le suivi modifié très compliqué.

4
répondu Yochay 2012-04-11 22:00:58

j'ai moi-même rencontré le même problème et j'ai trouvé une solution intermédiaire. Besoin de trouver un meilleur un en bas de la route.

tout d'abord pour répondre à la question posée par @NoufalIbrahim: quant à " Je ne veux pas qu'aucun de ces changements non-by-me soit engagé."pourquoi avez-vous fait une fusion à tous si vous ne voulez pas de changements?

vous avez mal compris l'intention de @grautur. Les changements sont nécessaires, mais pas dans le cadre d'un nouveau commit. Par exemple, 1 fichier a été ajouté localement, 100 fichiers viennent de fusionner. Le nouveau commit doit avoir 1 fichier modifié et non 101 fichier modifié. Ceci est particulièrement important si une fusion automatique n'est pas possible, mais qu'une requête pull est initiée et que quelqu'un doit revoir la propagation. Vous voulez que l'examinateur examine un dossier, pas 101 dossiers.

ce que je fais actuellement est ceci: disons que nous avons la branche 'master' et 'feature'. 'feature' est créé à partir de' master 'et je ne modifie que les fichiers de'feature'. Lorsque de nouveaux changements sont tirés en "maître", git merge master inside 'feature' va introduire de nouveaux fichiers (et ceux-ci sont mis en scène automatiquement dans VSCode, qui est L'IDE que j'utilise).

ce que je fais ensuite c'est dégrafer tous ces fichiers. Fondamentalement, les ignorer. Seulement ajouter et propager des fichiers que je change. Push 'fonction' d'origine/remote pensions de titres, créez pull request. Lorsque request est accepté et commit est fusionné avec la branche principale, supprimez 'feature' localement et à distance. Tirer les changements à' maîtriser ' local et créer une nouvelle branche pour travailler sur de nouveaux caractéristique. Cette nouvelle branche n'aura pas un tas de fichiers non archivés.

il pourrait y avoir une commande git pour dire au git d'ignorer un tas de fichiers sans les utiliser .gitignore. Faire davantage de recherche dans ce.

0
répondu Ivan Lim 2018-04-27 14:39:46

Où je peux trouver ce pop up est si j'ai:

1) créer et de travailler sur une branche (b1)

---m
    \
     b1

---m
    \
      ---b1

2) Créer une nouvelle branche (b2) à partir de b1, au cours de laquelle quelqu'un d'autre fait des changements au code complètement sans rapport dans master

----------------m
    \
      ---b1
          \
           b2

3) revenir en arrière et faire quelques changements à b1, puis tirer b1 dans le maître.

----------------m
    \          /
      -------b1
          \
            --b2

si j'essaie alors de passer du maître au b2, j'obtiendrai un conflit à cause des changements apportés au b1 après la création du b2. Si je fixe le conflit, le commit qui en résulte inclura tous les changements qui se sont produits sur master depuis la branche b1, comme si je les avais effectués. (git blame semble être en mesure de dire à l'auteur original)

dans ce scénario, si je passe d'abord de b1 à b2, et que je règle la fusion là-bas, alors je peux me retirer de master sans problème, et les propagations non-pertinentes ne se manifesteront pas en tant que changements que j'ai faits.

git merge --abort c'est votre ami, si vous êtes au milieu d'une une fusion pleine de propagations que vous n'avez pas faites.

0
répondu HammerN'Songs 2018-09-26 20:42:11