Y a-t-il des inconvénients à activer git rerere?

107

J'ai lu diverses choses sur la fonctionnalité de rerere de git, et j'envisage de l'activer. Mais je n'ai vu personne mentionner d'éventuels problèmes qui pourraient survenir lors de son utilisation. Je dois supposer qu'il y a un inconvénient, ou il serait probablement activé par défaut. Y a-t-il donc un inconvénient à permettre la réutilisation? Quels problèmes potentiels cela peut-il causer qui ne se produiraient pas autrement?

Ryan C. Thompson
la source
Lorsque la réutilisation automatique est activée et qu'il applique une résolution précédente, affiche-t-il un message? Si oui, à quoi ressemble-t-il? TIA!
joeytwiddle
1
@joeytwiddle, selon cet article , il serait de la forme,Resolved 'index.html' using previous resolution.
sampablokuper

Réponses:

69

Si vous effectuez une fusion incorrecte, puis supprimez-la, puis recommencez la fusion «identique», elle sera à nouveau incorrecte. Vous pouvez cependant oublier une résolution enregistrée. De la documentation :

git rerere forget <pathspec>

Cela réinitialise les résolutions de conflit qui ont été enregistrées de nouveau pour le conflit actuel dans <pathspec>.

Veillez à l'utiliser sur des chemins spécifiques; vous ne voulez pas épater toutes vos résolutions enregistrées partout. ( forgetsans argument est obsolète pour vous éviter de faire cela, sauf si vous tapez git rerere forget .pour le demander explicitement.)

Mais si vous ne pensez pas à le faire, vous pourriez facilement finir par mettre cette fusion incorrecte dans votre historique.

MatrixFrog
la source
13
C'est pourquoi rererelaisse toujours les fichiers avec des conflits marqués comme non fusionnés, de sorte que vous devez les ajouter manuellement (espérons-le après les avoir inspectés / testés) avant de les valider. Vous pouvez toujours utiliser git checkout -m <path>pour extraire la version d'origine en conflit et refaire la résolution si nécessaire.
Cascabel
1
Cela aurait du sens! On dirait que vous avez besoin d'un nouvel alias.
Cascabel
5
Je pense que c'est probablement le principal problème. L'activation de rerere ajoute un moyen supplémentaire pour les erreurs de se faufiler de manière inattendue. Une fusion que vous abandonnez (ou plutôt annulez en la supprimant de l'historique) pourrait encore revenir vous hanter plus tard. Fondamentalement, il introduit un deuxième mécanisme d'historique qui est orthogonal au graphique d'historique réel.
Ryan C. Thompson
3
@RyanThompson Les fusions annulées n'affectent pas la rerere. (Je souhaite souvent qu'ils le fassent - j'ai parfois interrompu une fusion parce que je l'ai mal configurée, puis j'ai dû faire exactement les mêmes résolutions lorsque je l'ai correctement configurée.) Quant à la suppression d'une fusion de l'historique, pourquoi le feriez-vous faire ça?
Marnen Laibow-Koser
40

Comme le mentionne JC Hamano dans son article " Fun with rerere "

  • Rerere se souvient comment vous avez choisi de résoudre les régions en conflit;
  • Rerere se souvient également de la façon dont vous avez retouché en dehors des régions en conflit pour vous adapter aux changements sémantiques;
  • Rerere peut réutiliser la résolution précédente même si vous fusionniez deux branches avec un contenu différent de celui que vous avez résolu précédemment .

Même les personnes qui utilisent rerere depuis longtemps ne remarquent souvent pas le dernier point.

Donc, si vous activez rereresur un contenu trop large, vous risquez de vous retrouver avec une résolution de fusion surprenante ou déroutante à cause du dernier point.

VonC
la source
15
Les mecs en conflit doivent encore correspondre; il lui est assez difficile de donner un faux positif.
Cascabel
3

J'ai le rerere globalement activé. Je n'ai vraiment pas remarqué de problèmes et cela semble généralement me faciliter la vie.

Marnen Laibow-Koser
la source
4
Pareil ici. Aucun problème en 2+ ans d'utilisation.
Andrey Tarantsov le
3

J'ai choisi un commit (dans gitk) qui ne contenait qu'un fichier binaire. Cherrypick a échoué en raison d'un conflit (ce qui est naturel) et j'ai résolu le conflit en gardant le choix. J'ai été surpris plus tard de trouver dans une autre branche rebasée que mes dll ne se comportaient pas - seulement pour découvrir qu'elles n'étaient pas portées dans le rebase comme (je suppose) la résolution automatique des conflits. C'est donc le seul cas que j'ai rencontré (après avoir activé la rerere) de se heurter à un comportement contre-intuitif (même si je suis sûr parfaitement cohérent).

Mr_and_Mrs_D
la source
1
Cure:git rerere forget path/to/compiled/bin.dll
Mr_and_Mrs_D
Dans le cas d'origine, j'ai eu le conflit non pas sur la sélection des cerises, mais sur le rebasage, mais je ne pense pas que cela fasse une différence
Mr_and_Mrs_D