8
votes

Git Rebase échoue continuellement et nécessite une intervention manuelle de fusion

J'ai un problème avec Rebasing de Master sur une branche "Déployer" dans l'un de mes référentiels.

Mon repo est configuré comme suit: xxx

Généralement mon flux de travail est:

  1. Développement de la branche principale ... Test, sourire, commit.
  2. Checkout the Déployer Branche
  3. Exécuter Git Rebase maître de la branche de déploiement - ceci utilisé pour fonctionner sans problème
  4. appuyez sur à distance et exécutez ensuite capuchon déployé
  5. Détendez-vous

    Le problème que j'ai maintenant, c'est que lorsque j'exécute git rebast maître sur la branche de déploiement, il appartient à une erreur de fusion / manualisation 3 voies requise (i Don 't pense que le message d'erreur est suffisamment générique pour poster). Git me dit d'effectuer une fusion, puis utilisez git rebase --Continue pour terminer - ce qui ne fonctionne jamais.

    Ce que j'ai trouvé 'fonctionne "fonctionne" Code> Git Rebase maître --interactive , nettoyage de la liste de sélection (il y a 5 ou donc «commet-commits» mais avec des numéros de référence différents (même message) dans cette liste, je vais donc choisir l'un d'entre eux) et ensuite faire manuellement la fusion. Une fois que j'ai fait cela pour chaque commit, je peux continuer la Rebase et tout ce joyeux ...

    jusqu'à la prochaine fois que je dois effectuer une boîte debase.

    Est-ce que quelqu'un sache que pourrait être heureux? Le projet n'est pas vraiment "secret", donc si besoin d'être je peux poster des messages, des journaux, des graphiques de branchement, etc.

    merci


1 commentaires

Combien de commits avez-vous sur votre branche de déploiement et peuvent-ils être écrasés? Rebase doit préserver tous les engagements intermédiaires dans une liste de commits et cela ressemble à certaines d'entre elles provoquent maintenant des conflits artificiels, car ils tentent de préserver un état intermédiaire artificiel qui n'a plus de sens.


3 Réponses :


1
votes

Vous pouvez définir un attribut dans le répertoire parent de vos fichiers "spécifiques à un déploiement" , afin de toujours sélectionner le contenu de la branche de déploiement en cas de fusion.

Pour un exemple de gestionnaire de fusion, voir Cela répond donc .

Autre Stratégies ont été discutées , mais la clé reste: considérez toujours une fusion comme «une fusion à l'échelle du projet» et non une fusion basée sur un fichier. D'où les attributs pour affiner cette fusion à l'échelle du projet lorsqu'il s'agit de fichiers "spéciaux".


0 commentaires

2
votes

Pour obtenir git rebase --continue vous devez travailler fusionner réellement les fichiers en conflit (les modifier, choisir les pièces que vous voulez à partir entre les marqueurs de conflit « <<<<<<< » , « ======= », « >>>>>>> ») puis git add les à l'indice (l'indice est l'endroit où ils sont enregistrés comme conflictuel, l'ajout d'un fichier efface son état en conflit). Vérifiez la diff actuelle avec git diff --cached , puis git rebase --continue si elle ressemble à droite.

Avant de tenter votre rebasage (ou après l'abandon d'une problématique), consultez log git -p master..deploy pour afficher les commits que vous essayez de rebasage. Il est l'un de ceux-ci qui est en conflit avec tout ce que vous avez dans maître .

Les commits que vous laissez tomber en supprimant les « pick » dans les lignes git rebase -i peut-être pas exactement la même chose (même si elles ont le même « sujet » dans leur message de commit). Le fait que vous pensez qu'il ne devrait y avoir un d'entre eux indique que fishy quelque chose qui se passe avec votre deploy branche. Sont ces commits « double » à la pointe de deploy ou y at-il d'autres commits après eux? Peut-être voir le contenu de ces commits « » fishy ( log -p , ci-dessus) vous donnera un indice quant à leur source.


0 commentaires

2
votes

Ce que vous ressemblez peut-être, c'est que vous avez changé l'historique de validation de ces commets "répétés" comme ils ont une SHA1 différente. Chaque SHA1 est unique pour non seulement le commit, mais également l'histoire de la validation. Par conséquent, il est impossible (bien, de manière extrêmement imprable de se produire pendant la durée de vie de l'univers), d'avoir deux Sha1 identiques dans la même histoire ou d'avoir deux SHA1 dans deux histoires différentes, même. Si vous changez quoi que ce soit dans votre commit, par exemple avec une modification ou une boîte interactive, vous allez changer le SHA1. Donc, deux commits qui pourraient ressembler à la même chose, sont réellement traités différemment.

Si très probable, vous avez reculé de l'autre branche, a fait un type de rebas interactif ou modifié les commits, a continué de commettre un autre code qui a modifié la même partie du code, puis sur le prochain rebas que vous avez des conflits, car les engagements que vous avez dans votre succursale locale qui diffèrent de la succursale que vous redimensionnez de la succursale, l'amont est tiré dans ce commettre que vous avez déjà tiré. dans et changé le SHA1 de, puis lorsque les commits sont rejoués sur la succursale, vous vous retrouvez avec un conflit car l'état du code a changé de ce que la validation était attendue parce qu'elle était originale créée à partir d'une histoire différente de celle que vous avoir sur votre branche. Wow, c'était une longue phrase ... p>

Lorsque vous "nettoyer" la liste de sélection ... Ce que vous faites est probablement en supprimant ces engagements répétés avant de rebaisser, alors maintenant que vous n'êtes donc pas réappliquer des modifications déjà appliquées, donc plus de conflits de conflits. P>

Cependant, si vous vouliez simplement résoudre les conflits pendant la Rebase, ce serait probablement le meilleur pari afin que vous ne supprimiez pas de manière accidentelle. que tu veux. La résolution des conflits rendra le changement de modification de ce commettre une différence d'une application applicable à l'histoire que vous avez. Une fois que vous appuyez sur cette résolution de conflit de fusion, vous ne devriez plus voir les problèmes à moins que vous ne modifiez pas les engageurs qui ont déjà été poussés à nouveau. P>

Pour trouver quels fichiers ont les conflits de fusion: P>

git rebase --continue


0 commentaires