Le 24/01/2020 à 09:31, Edgar Bonet a écrit :
> Bonjour !
>
> Marc Terrier a écrit :
>> Il ne m'a pas été difficile de revenir à un historique plus "clean",
>> dans mon repo local, en faisant
>> "git reset <sha1 du dernier commit correct>"
>
> Le problème avec ça c'est que tu perds le travail qui a été fait depuis.
> Normalement, la façon canonique de nettoyer l'historique est de réécrire
> l'histoire avec un rebase interactif :
>
> git rebase -i origin/master
>
> Tu réordonnes les commits pour placer chaque commit de régularisation
> juste après le commit à régulariser, et tu changes la commande en
> « squash » :
>
> pick commit foireux #1
> squash correctif au commit foireux #1
> pick commit foireux #2
> squash correctif au commit foireux #2
> ...
>
> Après le rebase, chaque correctif sera fusionné avec le commit qu'il est
> sensé corriger, et tu obtiens une suite de commits propre.
>
>> $ git push origin master
>> error: impossible de pousser des références [...]
>> Comment est-ce que je pourrais revenir en arrière ?
>
> Facile :
>
> git push --force origin master
>
> Mais c'est dangereux. Si ton collègue a continué à travailler sur la
> base de la branche sale, il va garder l'ancien historique dans son
> dépôt, et ça va atterrir dans le dépôt de référence à son prochain push.
> Donc vous vous retrouverez avec deux histoires alternatives
> parallèles...
>
> Pour que ça se passe bien, il faut te coordonner avec lui. Il devra
> s'assurer de n'avoir aucun travail en cours qui n'est pas dans le dépôt
> de référence et, après ton force-push, il devra à son tour faire
>
> git pull --force origin
>
> pour jeter son historique et le remplacer par l'histoire que tu as
> réécrite.
>
> Attention : si le dépôt est public, n'importe qui peut être en train de
> travailler sur la base de l'historique actuel, et il ne va pas être
> content si tu fais un force-push. Il est en général très mal vu de
> réécrire une histoire qui a déjà été rendue publique.
>
> À+,
>
> Edgar.
Bonsoir,
Grand merci à Edgar (et à Samuel) pour toutes ces explications, même si
ces remerciements viennent avec pas mal de retard. Tout cela nous a bien
aidés, et la situation a finalement été rattrapée avec un simple "git
push --force origin master" de mon côté, et un "git pull --force origin"
du côté du collègue.
« Que le --force soit avec toi ! », en quelque sorte... ;-)
Et nous n'avons rien perdu du travail qui a été fait depuis, parce qu'en
attendant de tester le conseil d'Edgar, nous avons travaillé sur autre
chose... sans commiter. Oui, je sais, c'est travailler sans filet, mais
sur un sous-projet annexe, maintenant fusionné dans master.
Mon collègue n'a pas continué de travailler dans la branche sale, donc
pas de problème (ça nous aura servi de leçon à tous les deux), et comme
le dépôt n'est (pas encore) public, il n'y a pas non plus de problème
avec quelqu'un d'extérieur. Bref, on s'en tire (très) bien pour cette
fois-ci.
Encore merci, et à+
--
Marc TERRIER