8
votes

Git: Rebasing d'une fusion conflictuelle commit

Après avoir fini de travailler sur une succursale, j'ai fusionné la succursale dans le maître comme suit: xxx pré>

Les commits marqués de '*' ont modifié le même code, de sorte que la fusion de conduite à la fusion des conflits qui ont été résolus dans la fusion commis (marquée de '+'). P>

Alors que je fus en fusionné et résolu les conflits, mon collègue a poussé de nouveaux engagements à maîtriser (marqué comme «N»), ce qui a permis de suivre l'histoire suivante: P>

          o---*---o---o-------- topic
         /                     \
o---o---o---*---o---o---n---n---+ master & origin/master


6 commentaires

Vous pouvez également simplement backmer Origin / Master avant de vous faire part de votre nouveau maître.


@Scaytrase qui serait possible, mais conduirait à une sorte d'histoire laide; Je préférerais la solution propre avec une fusion que


Malheureusement, il n'y a pas de sens réel sur ceci: quelle que soit la question de vos deux options que vous avez fini par choisir, vous devrez probablement résoudre les conflits de nouveau. Si vous prévoyez que vous vous retrouverez dans la même situation à l'avenir, vous devriez peut-être envisager d'activer rere .


@Jubobs a oublié de mentionner que config.rere est activé, n'a pas aidé non plus. Ajoutera ceci à la question.


@Rhabarbrabersaft pouvez-vous spécifier pourquoi rere n'a pas fonctionné? Avez-vous essayé de rebaser (option 2) et de toucher les mêmes conflits de fusion, malgré Rere étant activé?


@Jubobs lors de la fusion (et de la résolution des conflits), je vois la «résolution enregistrée pour ...» Message de Rere , de sorte que cela semble fonctionner. Mais lors de la refaissement, les mêmes conflits apparaissent et rere ne font rien (affichant tous les fichiers conflictuels lors de l'appelant git rere restant )


4 Réponses :


0
votes

Et si vous rebasez le sujet sur le dessus du maître, puis réinitialisez le maître à la commission précédente et tirez de la télécommande, de sorte que vous auriez ceci: xxx pré>

et ensuite vous fusionnez la rubrique Dans Master, ce qui a entraîné cette (nouvelle fusion commettage marquée de «#»): P>

          o---*---o----o 
         /              \
o---o---o---*---o---o----+ topic
                    \     \
                     n--n--# master


1 commentaires

J'aimerais empêcher cette histoire «laid» et avoir une fusion que



1
votes

Le premier moyen serait le meilleur. Annuler votre fusion et le refaire pour obtenir les changements de votre collègue dans la fusion commis. Mais vous n'avez pas besoin de jeter les changements.

Puisque vous savez que les modifications de votre collègue n'affectent pas les fichiers que vous avez résolus les conflits. Vous pouvez créer une nouvelle succursale (nous l'appellerons Conflit-correction ) de votre état actuel de maître. Réinitialisez votre branche et refaire la fusion.

plutôt que d'utiliser git mergetool ou quel que soit l'éditeur que vous utilisez. Vous pouvez apporter le fichier en Master à partir de votre autre succursale à l'aide de Git Checkout Conflict-Fix - . git Ajouter Les fichiers et s'engagent à compléter la fusion. Ensuite, vous pouvez supprimer la branche Conflict-Fix .

Ceci est assez facile à faire et entraînera la commission de fusion unique que vous recherchez plus vous permettant de pousser vos changements . Si les nouveaux commits ont affecté les fichiers que vous avez résolu les conflits que vous auriez à les refaire de toute façon.

EDIT

Je ne suis pas complètement familier avec git rere mais cela aurait dû travailler. Cependant, basé sur votre commentaire, vous n'avez pas besoin de rebaser. Vous auriez toujours annulé la fusion commit, git fetch les mises à jour et réadaptée à la fusion. Vous devriez simplement appeler la commande git rere et il aurait résolu les conflits dans les fichiers pour vous. Avec votre arbre en ressemblant à ceci: xxx

Vous effectuez les suivantes: xxx

et vous devriez vous retrouver avec: xxx

Il ne devrait pas y avoir besoin de rebaisser quoi que ce soit.

http://git-scm.com/docs/git-rere


2 commentaires

Je viens de l'essayer, ça marche bien. Mais: Si Origin / Master a des changements dans le même dossier qui conduisent à des conflits (modifiés dans «*») mais sur d'autres lignes (ne conduisant pas à des conflits de fusion supplémentaires), ces changements seraient retournés si je viens de vérifier le conflit -fix -Versions des fichiers contradictoires. Par conséquent, je cherche toujours une solution avec GIT réappliquant automatiquement la solution de conflit que j'ai faite dans la première fusion (et je pensais rere ferait cela)


Malheureusement, rere ne fonctionne pas dans ce cas, il suffit de l'essayer à nouveau d'être sûr. Il dit même «résolution enregistrée pour ...» lors de la fusion pour la première fois mais ne fait rien du tout lors de la fusion comme proposée.



0
votes

Rere est le moyen d'éviter que cela soit un tel problème, mais si vous ne l'avez pas été activé avant de faire la première fusion que cela ne vous aide pas. Vous pouvez savoir s'il est activé car il donnera des messages sur «enregistrement prétimage»

Je l'ai rencontré récemment parce que j'avais une nouvelle machine de développement et j'ai oublié de activer Rere avant une fusion laidée. Il n'y a pas une grande solution git uniquement à ce scénario, mais ce qui suit est la récupération la plus facile de cette situation que je pourrais proposer.

  1. Assurez-vous que votre répertoire de travail est exactement le résultat de la fusion (Tête de réinitialisation GIT --HARD) et copiez l'arborescence source de votre fusion commis quelque part de sécurité
  2. Réinitialisez votre succursale locale avant tout engagement fusionné (réinitialisation GIT --Hard MASTER ~ ou GIT RESET Tête ~ n où n est à quelle distance vous devez aller)
  3. git tirer
  4. Git Fusion SUJET
  5. Copier les fichiers source de copie dans votre écrivie d'arbre de travail.
  6. Git Mergetool (pour gérer les conflits supprimés de VS modifiés)
  7. commit et pousser

    Étant donné que nous travaillions avec Gerrit, je m'assurais également que le changement-ID était la même chose que mon précédent fusion commettre afin que je puisse vérifier que rien n'avait mal tourné.


1 commentaires

Rerere aide mais malheureusement ne résout pas complètement le problème, car il ne fait que enregistrer des résolutions pour les conflits, mais il se peut que des modifications supplémentaires soient nécessaires pour obtenir une construction réussie qui n'étaient pas à l'origine des conflits (par exemple, un code purement ajouté pourrait passer le problème paramètres à une méthode qui a été modifiée "à l'extérieur").



0
votes

Aussi loin que j'ai lu / compris sur rere il devrait être capable d'aider à cette situation exacte si vous utilisez le RERERE-TRAIN.SH Script Pour enregistrer vos résolutions déjà engagées.

Vous devez donc faire le truc:

  1. Exécutez le script, en utilisant args ^ .. branche actuelle> → maintenant rere connaît vos résolutions de conflit de cette fusion
  2. Assurez-vous que vous avez rere.enabled = true dans votre config
  3. do Option 1 (refaire la fusion avec Master mis à jour, voir question) → Maintenant Rere devrait pouvoir réutiliser les résolutions précédemment enregistrées
  4. éventuellement non défini rere.enabled à nouveau (il pourrait y avoir des raisons de ne pas le laisser activé, voir y a-t-il Dowsidsed pour permettre à Git Rere? )

    Si vous ne voulez pas utiliser le script, vous pouvez également faire la formation manuellement, voir https://stackoverflow.com / A / 4155237/6309


    mise à jour :

    Gardez à l'esprit, que RERERE enregistre uniquement des conflits / résolution pour les mecs de conflit (avec le <<<<< / code> et >>>> en elle). Il n'enregistrera pas les résolutions des conflits qui se produisent en raison de la suppression d'une branche et de modification de l'autre branche pour le même dossier. En outre, cela n'enregistre aucun changement supplémentaire que vous avez effectué en dehors des mecs de conflit.

    Vous avez une autre option cependant, bien qu'il ne soit pas très populaire, surtout si Origine / Master a été publié sur un ensemble inconnu de personnes: Rebase Origine / maître sur votre maître local et faire une force de force.

    J'ai choisi cette option plusieurs fois dans le passé, ne provenant pas nécessairement de la même situation, mais avec d'autres cas où l'historique réécrit de origine / maître était souhaitable. Si vous avez une petite équipe, cela sera simplement une question de communication / de coordination.


0 commentaires