Le Big Data, le DevOps et la plupart des domaines de l’informatique nécessitent un travail d’équipe. Et lorsqu’il s’agit de travail d’équipe, cela implique également d’utiliser un répertoire partagé. L’outil le plus commun permettant à tous les collaborateurs de réunir les tâches effectuées est Git. Pour rappel, Git est un logiciel de versionning permettant de garder une trace de toutes les modifications apportées à un projet. Toutefois, avant de pouvoir travailler sur Git, il faut créer ce que l’on appelle un dépôt à l’aide d’une commande nommée Git push. Il s’agit du répertoire dans lequel on va importer tous les fichiers nécessaires au projet.

Dans cet article, nous allons voir la manière de gérer les dépôts distants avec la commande Git push ainsi que quelques précautions à prendre lors de son exécution.

Git push : définition

La commande qui permet d’envoyer les enregistrements d’un dépôt local vers un dépôt distant est git push. Cette commande est configurée à l’aide de la commande git remote.

Cependant, lorsqu’on exécute la commande push, il se peut que les modifications ne soient pas prises en compte. De ce fait, il faut prendre des précautions quand on l’utilise.

Fonctionnement de la commande git push

La syntaxe de base de cette commande est la suivante :

git push  

Comme nous l’avons dit précédemment, cette commande permet de transférer tous les commits et objets nécessaires vers le dépôt distant spécifié. 

Pour comprendre le fonctionnement de cette commande, il faut prendre un peu de recul et chercher à savoir comment Git gère le stock des données.

Il faut savoir que Git se base sur les commits. Un commit est un objet qui possède un ID unique, un pointeur vers l’instantané du contenu mis en scène.

Mais alors, que fait la commande git push ? Premièrement, elle copie tous les commits existants dans la branche locale. Puis, elle intègre toute l’historique en dirigeant la branche distante vers le nouveau commit appelé Fast Forward.

push
Schéma illustratif de l’exécution de la commande git push

Le schéma ci-dessus nous montre la manière dont les deux dépôts (local et distant) se comportent quand on lance la commande git push. On peut remarquer la ressemblance entre la commande git push et la commande git merge main.

La commande git push n’est pas directement exécutée par Git si cela peut causer la suppression des commits. En effet, si les commits sont supprimés, Git ne pourra pas trouver un chemin linéaire entre les commits. Ainsi, la commande git push va échouer.

Mais que faire dans ce cas ? Ne vous inquiétez pas, nous allons vous donner toutes les solutions.

Quand faut-il faire un push forcé ?

Git refusera d’écraser l’historique du dépôt distant en empêchant l’exécution de la commande git push si cela engendre un merge sans fast-forward.

Donc, s’il n’y a pas de connexion directe entre l’historique du dépôt distant et l’historique du dépôt local, il faut d’abord effectuer un pull de la branche distante. Ensuite, il faut pousser cette dernière vers la branche locale avant de tenter l’exécution de git push.

Cette manière de faire est identique à celle de SVN. Avec ce logiciel, on exécute d’abord svn update afin de synchroniser les dépôts local et distant avant de charger l’ensemble des modifications.

Pour éviter de passer par tout ce processus avant de lancer la commande push, il faut utiliser l’option – -force.  Celle-ci va faire correspondre les deux branches en supprimant au passage les modifications effectuées au dernier pull.

Scénario simple

Pour mieux comprendre l’importance d’effectuer une commande pull avant d’importer des modifications sur le dépôt, prenons un petit exemple. Toutefois, avant d’attaquer cette partie, nous vous invitons à consulter notre article sur Git afin de comprendre le généralité de cet outil. Maintenant, nous pouvons développer le scénario.

Imaginez qu’on a deux développeurs Franck et Pascal travaillant sur la même branche. Le développeur Franck a terminé son travail et envoie son travail sur la branche distante.

Quelques instants plus tard, Pascal a aussi fini le sien, mais avant de l’envoyer sur la branche distante, il remarque qu’il doit encore effectuer quelques modifications supplémentaires.

Il décide alors de faire une rebase pour conserver l’arbre propre et ensuite obtenir ses modifications grâce à la commande git push – – force

Mais malheureusement, Pascal n’a pas sauvegardé les dernières modifications de Franck et il les a toutes supprimées accidentellement en utilisant la commande git push.

Pascal a commis une erreur courante lorsqu’il a voulu utiliser git push – – force. Il aurait d’abord dû mettre à jour sa branche avec git pull.

Quand Pascal a utilisé l’option – – force alors qu’une branche n’est pas à jour, Git a poussé ses modifications sans se soucier de l’état de la branche distante. C’est cela qui va entraîner la perte des commits.

Cette erreur peut être fatale pour le projet si l’équipe ne prend pas vite les mesures pour récupérer les modifications.

Alors que faut-il faire pour éviter cela ?

Alternative : push – – force -with -lease

Il existe une autre manière de faire un push –force sans avoir à effacer les modifications de quelqu’un d’autre.  Il s’agit de l’option – -force -with -lease.

En effet, celle-ci ne met pas la branche à jour tant que les deux branches (local et distant) ne pointent pas vers un même référentiel de validation. Elle est plutôt géniale cette option non ?

On peut dédier l’option – -force -with -lease à un commit précis ou bien une branche précise. Elle offre la possibilité de changer les nouveaux commits sur la branche distante tout en conservant l’ancien historique du commit.

Pourquoi est-il impossible de faire un push ?

Lorsque l’on développe un projet et que la commande git push rencontre un problème lors de son exécution, on peut y remédier de différentes façons.

Commençons par chercher la branche sur laquelle on se trouve actuellement en utilisant la commande git status.

Si l’on remarque que l’on se trouve sur la branche principale, alors il se peut l’on ne puisse pas effectuer un push directement de cette branche. Si c’est le cas, il n’y a pas de souci, le problème peut être résolu de différentes manières :

Le travail ne se trouve sur aucune branche

Si l’on se trouve dans cette situation, voici les marches à suivre :

  • Il faut créer une nouvelle branche et aller directement dessus à partir de votre commit actuel en tapant la commande suivante :
git checkout -b 
  • Ensuite, il faut pousser la nouvelle branche vers le dépôt distant grâce à cette commande :
git push -u -origin 

On se trouve sur la mauvaise branche

Pour ce nouveau cas de figure, la démarche est la suivante :

Il faut d’abord sortir de la branche dans laquelle on se trouve grâce à la commande

git checkout 

Une fois cette étape effectuée, on peut choisir entre deux procédés :

  • On fusionne les commits de la branche ou l’on trouve avec la branche principale grâce à la commande
git merge 

Ensuite, on envoie les modifications vers le dépôt distant.

  • Soit on corrige la branche en trouvant le commit sur lequel elle doit être pointée. Pour corriger les pointeurs, il faut taper la commande
git reset - -hard

Suppression d’une branche distante ou d’un tag

Parfois, pour des questions d’organisation et d’archivage, il est nécessaire de procéder au nettoyage des branches. Pour supprimer définitivement une branche, il faut la supprimer à la fois en local et à distance. Voici les commandes permettant d’effectuer cela :

git branch -D branch_name
git push origin :branch_name

Dans notre cas, on va supprimer la branche nommée dev1 en utilisant les lignes de commande ci-dessus.

Git push et synchronisation

La commande git push fait partie des composants utilisés dans le processus de synchronisation Git global. Les commandes de synchronisation sont lancées sur des branches distantes, la configuration de ces dernières se fait grâce à git remote.

La commande git push est considérée comme une commande qui permet de charger. Par contre, la commande git fetch est, quant à elle, considérée comme une commande qui sert à télécharger.

Effectuer un push vers des dépôts bruts

Il existe une nouvelle pratique souvent utilisée sur le Git moderne. Cela consiste à faire en sorte qu’un dépôt – -bare se trouvant sur un hébergeur distant se comporte comme un dépôt origin centralisé.

Généralement, ce dépôt se trouve sur un hébergeur hors site comme Bitbucket, puisqu’en faisant un push, la structure de la branche distante changera. Cependant, il est plus conforme d’effectuer un push vers des dépôts crées grâce à l’indicateur – -bare.

Les dépôts bruts, eux, ne possèdent pas de répertoires de travail. De ce fait, le push ne va pas altérer leur contenu en cours.

Récupération d’une branche

Si à un moment, vous voulez restaurer votre branche après avoir lancer une commande push – -force, ne vous inquiétez pas, cela est possible. Vous devez juste suivre les étapes de récupération ci-dessous : 

  • Cherchez à avoir le commit précédent grâce à votre terminal ;
  • Créez une nouvelle branche ou réinitialisez le commit précédent ;
  • Lancez la commande push – -force.

Cependant, notez bien que si vous avez créé une nouvelle branche, retenez que vous devez la réinstaller pour qu’elle soit synchronisée avec la branche distante. Voici la commande à exécuter pour cela :

$ git reset --hard origin/[nouvelle-branch]

Comment restaurer une branche supprimée lors de l’exécution de git push ?

Imaginez que vous aviez un projet sur lequel votre développeur travaille et un jour, il supprime toutes les branches avec push – -force accompagné de ce message : “Le projet était là”.  Ensuite, il s’absente sans aucun moyen de communication. Dans ce cas, vous ne disposez pas du code du projet et vous n’avez jamais cloné le référentiel.

Alors que faut-il faire pour se sortir de cette situation ?

Premièrement, vous devez chercher le commit précédemment supprimé dans lequel aucun commit, branche ou tag n’était lié. Heureusement, la base de données Git sauvegarde ce genre de commits et vous pouvez les retrouver grâce à la puissante commande git fsck.

git fsck - -lost -found

La commande va appeler ces commits “dangling commits”. Une fois les commits trouvés, il faut suivre les étapes de récupération d’une branche présentée ci-dessus.

Quelques options couramment utilisées avec la commande git push

Avant de terminer cet article, voici quelques options qui vous seront surement utiles lorsque vous allez utiliser la commande git push :

  • git push -f : cela va forcer un push bloqué à s’exécuter ;
  • git push -u origin <nom_branche> : elle est importante lorsque vous poussez une nouvelle branche, car elle va créer une autre branche de suivi qui sera en relation avec votre branche locale ;
  • git push – -all : celle-ci permet de pousser toutes les branches ;
  • git push – -tags : elle offre la possibilité de publier les balises qui ne sont pas encore dans le référentiel distant.

Voilà, nous arrivons à la fin de cet article. Pour conclure, il faut surtout retenir l’importance cruciale de l’option – – force lorsque l’on utilise la commande git push. En résumé, on l’utilise lorsque la commande git push rencontre un problème à s’exécuter. Toutefois, cette commande doit être utilisée avec précaution, car elle peut supprimer votre commit et causer un problème à tout l’ensemble du projet.

Maintenant que vous savez gérer un dépôt distant avec git push et que vous savez les risques encourus suite à une utilisation dangereuse, vous n’aurez plus rien à craindre lors de vos prochains commits.

Si vous souhaitez continuer votre lecture sur le DevOps et le DataOps ou sur le Big Data, nous vous invitons à consulter notre blog. Nous vous invitons également à télécharger gratuitement notre formation sur le data engineering. Elle vous initiera sur le développement d’applications Spark avec Scala.


Juvénal JVC

Juvénal est spécialisé depuis 2011 dans la valorisation à large échelle des données. Son but est d'aider les professionnels de la data à développer les compétences indispensables pour réussir dans le Big Data. Il travaille actuellement comme Lead Data Engineer auprès des grands comptes. Lorsqu'il n'est pas en voyage, Juvénal rédige des livres ou est en train de préparer la sortie d'un de  ses livres. Vous pouvez télécharger un extrait de son dernier livre en date ici : https://www.data-transitionnumerique.com/extrait-ecosystme-hadoop/

>