J'ai rebasé localement une branche qui était déjà poussée.
Git informe que ma branche et ma télécommande ont divergé et que:
"et ont respectivement 109 et 73 commits différents"
Le fait de pousser ma branche résoudra-t-il ce problème - c'est-à-dire est-ce à prévoir après un rebase?
Réponses:
Lorsque vous rebasez une branche, vous devez réécrire les commits pour tout commit qui est au-dessus des commits dans la branche sur laquelle vous rebasez. En effet, l'une des propriétés d'un commit est son parent (ou ses parents). Lorsque vous rebasez, vous changez le parent du commit local le plus ancien sur votre branche - et changez ainsi les hachages de commit de tous vos commits locaux, puisque ce changement bouillonne à travers les commits de manière transitoire.
Puisque vous aviez déjà poussé la branche, vous devriez avoir fusionné dans la branche source, plutôt que de rebaser contre elle. Il est possible de "forcer" votre nouvelle branche (en utilisant le
-f
drapeau), mais une poussée normale ne fonctionnera pas, car l'intégrité de l'historique des branches sera perturbée. Si vous collaborez avec d'autres personnes sur cette branche, la poussée de force est une mauvaise idée, car cela rendra les autres collaborateurs très confus lorsque leur histoire ne correspond pas soudainement.TL; DR - Si vous ne collaborez pas, poussez la branche en utilisant push -f. Si tel est le cas, réinitialisez la branche à l'état précédent et fusionnez-la dans la branche source à la place.
la source
Tous vos commits ont changé d'identifiants, donc le détournement n'est pas vraiment une divergence.
Pour résoudre votre problème, vous devez écraser votre branche distante:
http://git-scm.com/book/ch3-6.html
Explication:
Voyez comment dans cette image C3 n'est pas mis en tant que C3 après le rebase, mais en tant que C3 '. En effet, ce n'est pas exactement C3, mais il a tous ses changements de code.
Sur cette autre image, vous obtenez l'image de ce qu'un rebase est vu lorsqu'une télécommande est impliquée, et pourquoi il y a un détournement.
Dans tous les cas, après avoir fait la poussée forcée, il vous dira qu'il a fait une (mise à jour forcée), tout devrait être bien à ce stade.
Consultez le lien en haut et recherchez "git push --force". Vous verrez une explication plus détaillée.
la source
J'ai eu du succès avec le rebase diverge pour un push en faisant ce qui suit:
L'attraction a résolu la divergence.
AVANT la traction
Sortie PULL
APRÈS avoir tiré
APRÈS PUSH
Je suppose que c'est probablement ce que fait la poussée de force, et je n'ai pas vérifié.
Comme les autres l'ont dit, évitez un rebase si vous avez déjà une pull request ouverte. Je donne cet exemple comme quelque chose qui a fonctionné pour moi.
la source
Cela peut être résolu sans une poussée forcée en rebasant la branche cible dans votre branche locale actuelle, en basculant vers votre branche cible, puis en rebasant votre branche locale dans la cible. Cela ne diverge pas puisque le ou les commit (s) manquant (s) sont ajoutés et n'ont plus besoin d'être créés. Exemple pour une explication plus simple:
Si vous n'avez PAS mis à jour votre branche de développement, alors un "git checkout develop" && "git rebase feature / doing_stuff" fonctionnera correctement car aucun commit n'a été ajouté depuis votre checkout. Cependant, si vous avez extrait develop et supprimé le nouveau commit, vous verrez cette divergence si vous essayez de rebaser en raison d'un nouveau commit vu. Une solution facile sans forcer (généralement pas une bonne idée dans un environnement d'équipe) est de:
Le rebase de l'étape 2 amène le commit manquant dans la fonction / doing_stuff donc quand l'étape 4 arrive, il est à jour et n'a pas besoin de créer un nouveau commit pour le changement.
C'est une solution qui fonctionne, je sais, car je viens de rencontrer cela et j'ai suivi les étapes ci-dessus pour pousser avec succès le développement sans forcer. Je travaille dans une équipe de plus de 50 développeurs, il est donc interdit de forcer à pousser autre chose que mes propres branches de test, j'ai donc dû trouver une solution.
la source