J'ai écrasé les commits d'un collègue
Ce qui vient de se passer
Ton force push a remplacé la branche distante par ta version locale. Les commits de ton collègue ne sont plus sur le remote, mais ils existent encore sur sa machine et souvent sur le serveur pendant un moment.
Risques potentiels
- Si ton collègue fait un pull ou un reset maintenant, sa copie locale peut être perdue aussi.
- La CI peut déployer la version incomplète.
Avant d'exécuter quoi que ce soit
- Préviens ton collègue immédiatement : il ne doit PAS pull.
- Désormais, utilise --force-with-lease au lieu de --force.
- Règle d'or : avant toute commande destructrice, crée une branche de secours avec git branch backup/before-fix — ça ne coûte rien.
Étapes de récupération
- 1
Retrouver l'ancien état du remote
La sortie du force push affichait « + ancien...nouveau (forced update) ». Sinon, regarde le reflog de la branche de suivi sur n'importe quelle machine qui avait fetch avant.
Sans risque$ git reflog show origin/main -n 10 - 2
Sur GitHub : utiliser le journal d'activité
GitHub conserve le hash avant/après de chaque push. Récupère ensuite ce hash s'il est encore sur le serveur.
Sans risque$ gh api repos/OWNER/REPO/activity --jq '.[] | select(.activity_type=="force_push") | .before'$ git fetch origin <old-hash> - 3
Reconstruire une branche combinée
Crée une branche depuis l'ancien état et rapporte tes propres commits par-dessus.
Sans risque$ git switch -c restore/main <old-hash>$ git cherry-pick <your-commit-1> <your-commit-2> - 4
Publier la branche restaurée
Réécrit encore le remote, donc coordonne-toi avec l'équipe d'abord. --force-with-lease protège contre un nouvel écrasement.
Destructrice$ git push --force-with-lease origin restore/main:main
Ces procédures sont fournies à titre informatif. Lis chaque commande et adapte-la à ta situation avant de l'exécuter. Disclaimer