Forcer le push
Par Maxime Bréhin • Publié le 28 octobre 2024 • 3 min

La commande git push est essentielle dans l’utilisation de Git. Elle permet le transfère des commits d’un dépôt local vers un dépôt distant. Dans certains cas de figures, tu souhaitera forcer ce push, mais attention à le faire correctement.

Cet article examine comment fonctionne git push, les dangers associés à l’utilisation de --force, et pourquoi --force-with-lease est une meilleure option. Il décrit également comment nous pouvons récupérer des commits perdus grâce à reflog et reset, même après un push --force.

1. La commande git push

La commande de base pour pousser tes changements est :

git push <remote> <branch>
  • <remote> : le nom du dépôt distant (souvent origin).
  • <branch> : la branche que tu souhaites mettre à jour sur le dépôt distant.

2. Que fait l’option --force ?

L’option --force permet de forcer la mise à jour d’une branche sur le dépôt distant, même si cela écrase des commits qui ne sont pas présents dans ta branche locale. Par exemple :

git push --force origin dev

Cette commande est souvent utilisée après un rebase ou une modification de l’historique des commits. À mon grand désarroi, c’est la première option proposée pour écraser ce qu’on avait déjà partagé, et son utilisation peut entraîner des conséquences pénibles, voire désastreuses.

3. Les dangers de --force

Utiliser --force présente plusieurs risques :

  • Perte de données : si quelqu’un d’autre a poussé des commits sur la même branche, l’utilisation de --force supprimera ces commits de l’historique (sur le serveur). Cela peut mener à des pertes de travail significatives.

  • Confusion pour les collaborateurs : écraser l’historique rend difficile la compréhension des changements effectués par d’autres membres de l’équipe, compliquant la collaboration.

  • Difficultés à revenir en arrière : une fois que des commits sont écrasés, il peut être difficile de les récupérer.

4. L’alternative : --force-with-lease

Pour éviter les dangers liés à --force, Git propose l’option --force-with-lease. Cette option assure que tu ne forceras le push que si aucune modification n’a été apportée à la branche distante depuis ton dernier pull. La syntaxe est la suivante :

git push --force-with-lease origin main
# En réalité, le

5. Pourquoi --force-with-lease est-il préférable ?

  • Sécurité : --force-with-lease vérifie d’abord si l’état de la branche distante a changé avant de procéder. Si des commits ont été ajoutés par un autre contributeur, le push échouera, t’évitant ainsi d’écraser le travail des autres.

  • Conservation de l’historique : en évitant d’écraser des commits, tu préserves l’historique des contributions, ce qui facilite le suivi des changements et la collaboration.

6. Une option supplémentaire : --force-if-includes

Pour renforcer davantage la sécurité de ton push, tu peux combiner --force-with-lease avec l’option --force-if-includes. Cette option permet de ne forcer le push que si ta branche locale inclut tous les commits de la branche distante. En d’autres termes, elle garantit que tu ne perdes pas accidentellement des commits qui pourraient être présents sur le dépôt distant.

Voici la commande avec les options :

git push --force-with-lease --force-if-includes origin main

Cette approche offre une double protection contre l’écrasement involontaire de l’historique des commits d’autres collaborateurs, rendant le processus de push encore plus sûr.

7. Que faire si on a perdu du travail après un push --force ?

Il est important de noter que même après avoir utilisé git push --force, tu as la possibilité de récupérer des commits perdus. Git enregistre les références de toutes les actions effectuées dans le dépôt local, ce qui signifie que tu peux retrouver ton travail grâce à la commande reflog (attention à regarder dans le dépôt local de la personne dont on a écrasé le travail sur le serveur).

Pour visualiser l’historique des actions, on utilise :

git reflog

Cela affiche une liste des actions récentes, y compris les commits perdus. Une fois que tu as identifié le ou les commits que tu souhaites récupérer, tu peux utiliser la commande reset pour revenir à cet état :

git reset --keep <commit_hash>

Assure-toi d’utiliser cette commande avec précaution, car elle remplace l’historique de ta branche actuelle (même si, là encore, tu peux retrouver des commits perdus).

Conclusion

La commande git push est un outil puissant pour la collaboration, mais elle doit être utilisée avec prudence. L’option --force peut sembler pratique, mais elle comporte des risques de perte de données et de confusion. En revanche, --force-with-lease, combinée avec --force-if-includes, offre une approche encore plus sécurisée, protégeant ton travail et celui de tes collègues. Et si tu te retrouves à avoir écrasé des commits, n’oublie pas que git reflog et reset peuvent t’aider à récupérer tes modifications.

Pour en savoir plus sur les commandes Git, n’hésites pas à consulter la documentation officielle de Git.

Tu veux aller plus loin et maîtriser pleinement les fondamentaux de Git ou être accompagné pour garantir la qualité de tes projets grâce à une bonne mise en place de Git ? On peut t’aider ou te former, il suffit de nous décrire ton besoin !