Le problème des sauvegardes
Imaginez que vous avez un projet
important. Vous le développez et à un certain
moment, vous atteignez un niveau d'achèvement
logique et vous publiez la version 1.0,
que les utilisateurs commencent à utiliser.
Cependant, le travail ne s'arrête pas là
et vous publiez la version 1.1 avec des corrections
de bugs et des ajouts, puis la version 1.2,
puis 1.3, et ensuite vous réécrivez tout
à nouveau et annoncez la sortie de la version 2.0.
Et ainsi de suite - le travail sur un projet
ne se termine généralement jamais.
Cependant, pendant le développement, il y a un risque de casser quelque chose dans le code, ou de supprimer accidentellement le projet ou une partie de celui-ci. Pour ne pas perdre tout le travail, vous sauvegardez périodiquement le code du projet dans un dossier séparé. Vous numérotez simplement vos sauvegardes dans l'ordre, en indiquant un commentaire pour chaque sauvegarde, précisant quels changements vous avez apportés ou quelle fonctionnalité vous aviez déjà réalisée au moment de cette sauvegarde.
Cependant, il s'avère soudain qu'on ne peut pas simplement
publier la version 2.0, parce que
les utilisateurs de la première version protestent - ils ne sont pas encore prêts
à passer à la seconde. D'accord, dites-vous,
et vous commencez à travailler sur la deuxième version,
tout en publiant des mises à jour pour la première en parallèle.
Votre projet se divise en deux dossiers - un pour
la première version et un pour la deuxième. Le dossier
de sauvegarde se divise également.
De plus, une partie du code de la première et de la deuxième
version est identique. En apportant des corrections à ce
code dans une version du projet, vous devez
vous souvenir d'apporter les corrections dans l'autre
version. Cependant, vous oubliez parfois
de le faire. Des bugs étranges apparaissent.
Le travail est ralenti.
Pendant le développement de la version 2.0, vous avez décidé
d'ajouter une nouvelle fonctionnalité. Cependant, cela prend du temps
et vous décidez de scinder la deuxième version
en deux dossiers, en dupliquant le code. Dans le premier dossier,
vous mènerez le développement ultérieur de votre
projet, et dans le second, vous réaliserez la fonctionnalité
imaginée. Enfin, la fonctionnalité est terminée. Pendant ce temps,
le projet principal est devenu la version 2.3.
Maintenant, vous devez fusionner le code avec la fonctionnalité dans le code principal
du projet. Vous commencez à copier les fichiers
de code dans le dossier principal, tout en résolvant
les conflits entre le nouveau code et l'ancien. Cela vous prend
trois jours de travail. Le travail est ralenti.
Le projet a grandi. Vous décidez d'appeler un ami à l'aide. Vous donnez une tâche à votre ami et lui envoyez une archive du projet. L'ami réalise la tâche et vous renvoie une archive avec de nouveaux fichiers, ainsi qu'avec les anciens, dans lesquels il a apporté des modifications. Vous passez une demi-journée à séparer les nouveaux fichiers des anciens. Ensuite, vous passez encore un jour à intégrer les modifications dans vos fichiers.
Vous appelez deux autres amis à l'aide. Maintenant, vous êtes quatre. Chaque jour, vous recevez des archives avec le travail effectué. Vous intégrez les nouvelles parties dans le projet et renvoyez à tous les archives du projet avec les modifications. Le travail avance lentement, car pendant que vous intégrez un changement, vos amis attendent que vous leur envoyiez la nouvelle version du projet et ne peuvent pas travailler davantage, pour ne pas se désynchroniser complètement.
Le dossier de sauvegardes contient déjà des gigaoctets de code. De plus, il contient principalement des doublons, car en modifiant une petite partie du code, vous sauvegardez quand même l'intégralité du projet. Vous décidez de nettoyer ce dossier, en supprimant les cent premières versions. Une semaine plus tard, il s'avère que les versions supprimées contenaient le code d'une fonctionnalité distincte, que vous aviez abandonnée à l'époque, mais que vous avez maintenant décidé de réintégrer. Mais le code de cette fonctionnalité est déjà supprimé, et il n'existe nulle part ailleurs. Vous réécrivez cette fonctionnalité. Le travail est ralenti.
Cela ne semble pas très agréable, n'est-ce pas ? Pourtant, les développeurs travaillaient vraiment comme je l'ai décrit ci-dessus auparavant. C'était, bien sûr, très peu pratique. C'est pourquoi un système spécial appelé Git est apparu, dont nous discuterons des possibilités dans la prochaine leçon.