Lorsque vous êtes un peu nouveau avec Git (et DVCS en général), et que vous commencez à explorer les modifications de réécriture de l'historique, vous êtes en sécurité si le référentiel n'est que local, mais vous pouvez rencontrer des problèmes si vous travaillez avec des télécommandes et essayez de pousser de tels changements.
Une fonctionnalité que j'attendrais est la possibilité d'activer un "mode sans échec" qui m'empêcherait essentiellement de faire tout ce que je ne devrais pas faire ... Et qu'est-ce que je veux dire par là? Je veux dire des changements de réécriture de l'histoire pour des choses déjà poussées à une origine. Je ne peux pas le définir précisément, mais cela inclurait des cas tels que:
commit --amend
quand HEAD a déjà été poussérebase
d'une succursale non localereset
d'une branche qui a été poussée
Ce sont des exemples de situations qui feront probablement push
échouer le prochain (car ce ne serait pas une avance rapide, IIRC). J'ai fait une partie de cela par accident et j'ai dû recréer la branche sur la télécommande. Et j'ai quand même eu la chance de le faire assez rapidement pour que personne ne tire l'histoire que j'ai réécrite.
Je pense qu'il est possible d'identifier ce type de modifications et, à la demande, d'empêcher l'utilisateur de les effectuer. Y a-t-il peut-être une option pour cela?
S'il n'y en a pas, pensez-vous qu'il vaut la peine d'essayer de le créer? Souhaitez-vous essayer de définir précisément comment identifier un tel «changement dangereux»?
--force
.Réponses:
Cela semble très proche, sinon la même question que la stratégie de prévention ou d'interception de la réécriture de l'historique Git
Pour résumer, vous pouvez activer
git config --system receive.denyNonFastforwards true
et
git config --system receive.denyDeletes true
Ou écrivez un crochet de réception de message pour rejeter tout ce que vous jugez être une réécriture.
la source
denyNonFastforwards
c'est la valeur par défaut (?), Alors que cedenyDeletes
n'est pas le cas. Ces deux sont utiles, mais j'imagine une solution côté client qui m'empêcherait de faire uncommit --amend
si je ne pouvais pas le pousser (parce que HEAD était déjà poussé).denyNonFastfowards
àtrue
seulement sur la branche master? J'aimerais que mes branches de sujet soient autorisées à être rebasées et forcées.Non, car cela fait partie de la philosophie de git de vous donner la pleine puissance et de vous permettre de gérer cette puissance comme vous le souhaitez.
Si vous n'adhérez pas à cette philosophie, alors peut-être que passer à Mercurial en vaudrait la peine car ils permettent de réécrire l'histoire, mais de manière limitée ou, pour être clair et réticent, cela vous donne l'impression que ce n'est pas une bonne idée.
la source
AFAIK, la façon dont git résout ces problèmes est que chaque fois que vous demandez une telle action, il l'exécute localement, mais vous informe que ce que vous faites peut avoir des conséquences indésirables. À ce stade, vous n'avez encore rien poussé, vous êtes donc en mesure de revoir votre référentiel local et peut-être d'annuler la modification dangereuse avant de pousser. Vous devez cependant faire attention à ce que git vous dit, et vous feriez mieux de faire attention lorsque vous réparez de telles erreurs.
la source