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 (souventorigin
).<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.