Ce n'est pas vraiment possible (ni souhaitable d'ailleurs, de mon point de vue) de prévenir avant le push, puisque par définition les branches que tu as en local n'ont rien à voir avec les branches distantes. En particulier, rien ne m'empêche d'avoir une branche "master" locale qui ne reflète pas la branche "master" du dépôt cloné, et rien non plus ne m'empêche de vouloir publier une branche "foo" en tant que "bar". Donc git ne peut pas savoir au moment où tu réécris l'historique si c'est pour mettre à jour une branche publiée, ou pour en créer une nouvelle. On pourrait éventuellement détourner la notion de "tracking" pour les branches pour avoir une heuristique, mais franchement ça vaut probablement pas le coup.
Bref, la notion de branche de git est assez différente de celle de mercurial.
En tout état de cause, par défaut git t'empêche de mettre à jour une branche avec quelque chose d'autre qu'un "fast-forward", à savoir une branche qui dérive strictement de la version déjà publiée (l'historique déjà publiée est un préfixe de l'historique à publier). Cela implique de rejeter toute opération de réécriture de l'historique déjà publiée.
[^] # Re: M'étonnerait que ça arrive dans git.
Posté par Yann Hodique (site web personnel) . En réponse à la dépêche Mercurial 2.1 : Les phases. Évalué à 5.
Ce n'est pas vraiment possible (ni souhaitable d'ailleurs, de mon point de vue) de prévenir avant le push, puisque par définition les branches que tu as en local n'ont rien à voir avec les branches distantes. En particulier, rien ne m'empêche d'avoir une branche "master" locale qui ne reflète pas la branche "master" du dépôt cloné, et rien non plus ne m'empêche de vouloir publier une branche "foo" en tant que "bar". Donc git ne peut pas savoir au moment où tu réécris l'historique si c'est pour mettre à jour une branche publiée, ou pour en créer une nouvelle. On pourrait éventuellement détourner la notion de "tracking" pour les branches pour avoir une heuristique, mais franchement ça vaut probablement pas le coup.
Bref, la notion de branche de git est assez différente de celle de mercurial.
En tout état de cause, par défaut git t'empêche de mettre à jour une branche avec quelque chose d'autre qu'un "fast-forward", à savoir une branche qui dérive strictement de la version déjà publiée (l'historique déjà publiée est un préfixe de l'historique à publier). Cela implique de rejeter toute opération de réécriture de l'historique déjà publiée.