Pourquoi mon SMS ne passe pas ?

90
Partager :

Comme nous l’avons vu dans le précédent article, dans les systèmes de version distribués, tout le travail est fait localement. L’une des conséquences agréables est que nous pouvons travailler complètement hors ligne. Mais tout aussi important, c’est que tout le travail soit « privé » — jusqu’à ce que nous le mettons à la disposition des autres.

Cela nous ouvre une possibilité intéressante : éditer ce que nous voulons publier. Avant de crier en état de choc « mais l’histoire doit rester immuable ! « , considérez ce que « l’histoire » il s’agit ici. C’est l’histoire locale, mon travail que je n’ai pas encore publié et partagé avec d’autres. Je pourrais faire ce genre de travail différemment, si j’avais juste une idée légèrement différente.

Lire également : Comment fonctionnent les cookies sur un site Web ?

Ce qui est important, c’est la question de savoir pourquoi changer l’histoire. La réponse est simple : parce qu’elle nous apporte des possibilités de travail complètement différentes , une utilisation différente de l’outil de gestion des versions.

L’ outil le plus simple pour l’édition est un commutateur —amender dans Git pour git commit : nous permet de modifier le dernier commit que nous avons fait. Nous pouvons vouloir le faire pour corriger une faute de frappe dans l’étiquette de validation, ou ajouter git ajouter un fichier oublié ; le commit défectueux ne reste pas éternellement dans le dépôt.

A lire aussi : Comment nettoyer un site piraté ?

Mais cela nous ouvre la voie à une façon intéressante de travailler : engager continuellement un travail sur un sujet dans un engagement « de travail » (WIP, travail en cours). Chaque fois que nous avons fait une certaine partie de fonctionnalités que nous sommes à l’aise avec, nous la stockons via git commit —amender dans le commit « de travail » que nous continuons à éditer. Lorsque vous travaillez sur un changement plus étendu sur plusieurs fichiers, nous avons toujours une partie précieuse du travail stocké en toute sécurité dans le dépôt, et nous pouvons à tout moment aider le code traité réinitialiser la récupération nebogit jeter loin. Seulement une fois que nous avons fait la tâche, encore une fois en utilisant —amender, nous écrivons une légende significative commit — nous n’avions pas à s’en occuper jusqu’à maintenant — et nous laissons le commit tranquille et nous travaillons à la prochaine tâche.

Ainsi, grâce à —amender, nous obtenons une « annulation hyperactive » qui fonctionne tout au long du projet. De plus, il nous permet de compléter continuellement le label commit s’il s’agit d’un changement plus étendu : un exemple classique de dépréciation de l’historique dans le dépôt leckdy est, par exemple, le type de commit « honem », qui contient le label fix formare et, en plus de corriger le formulaire, il inclut également la modification de la pour faire fonctionner le correctif (mais nous l’avons oublié depuis longtemps au moment de l’écriture de l’étiquette).

Pour apprendre à utiliser efficacement toutes les options Git, commandez une formation auprès de l’auteur de l’article ou réservez une place dans les cours sur www.git-fu.cz.

Il vous apparaît certainement immédiatement qu’il serait génial, en cas de changements à grande échelle de comités de « travail » similaires, d’en faire plus et de les fusionner en un seul. Et juste pour une telle opération dans Git, nous utilisons la commande rebase avec le commutateur —interactive. Considérons donc cette situation, quand nous mettons progressivement une séquence de « travail » commits dans le dépôt :

$ git log —oneline 66123b8 WIP > tests complétés pour XML, refactoriser, documentation, etc. 83dc11b WIP > FIX manque parsovani du nom Krestni de Prague 0bb359a WIP > pridany fce pour l’importation depuis XML 05b23f1 WIP >

Maintenant, nous voulons les fusionner en un seul commit, qui sera une combinaison de tous les comités « de travail » fce pour l’importation depuis CSV, tests b700909 Infrastructure d’importation … avec un label significatif. Nous le faisons en commandant :

$ git rebase -i b700909 Le nombre b700909 est un identifiant de validation que nous voulons laisser intact, à partir duquel nous voulons ajuster l’historique. L’éditeur de texte par défaut s’ouvre à nous avec le contenu suivant :

choisir 05b23f1 WIP > fce pour l’importation depuis CSV, tests choisir 0bb359a WIP > pridany fce pour l’importation à partir de XML choisir 83dc11b WIP > FIX manque parsovani du nom de Prague choisir 66123b8 WIP >

tests complétés pour XML, refacteur constructeur, documentation, etc. # Rebaser b700909.. 28bf867 sur b700909 # # Commandes : # p, pick = utiliser commit # e, edit = utiliser commit, mais arrêter pour modifier # s, squash = utiliser commit, mais fusionner dans le commit précédent Nous voyons que les révisions sont écrites dans l’ordre inverse que dans git log : celles du temps dernier sont en haut, plus récentes en bas. Comme Git le suggère, nous avons trois options à choisir : chacun des commits utilise vierge, modifiez-le ou fusionnez avec le précédent — et c’est ce qui nous intéresse. (Si nous supprimons une ligne, nous supprimons complètement le commit de l’historique.) Par conséquent, nous choisissons pour les trois derniers comités une variante de squash ou abrégé avec :

choisir 05b23f1 WIP > fce pour l’importation depuis CSV, tests avec 0bb359a WIP > pridans fce pour l’importation à partir de XML avec 83dc11b WIP > FIX manque parsovani du nom Krestni de Prague avec 66123b8 WIP >

tests complétés pour XML, refactoriser constructeur, documentation, etc. Après avoir enregistré le fichier, Git dans l’éditeur nous permettra d’éditer l’étiquette du commmit combiné et, après l’avoir enregistré, rapportera ce qu’il a fait :

Composant Pridana pour l’importation (CSV, XML) vers la base de données Tests 3 fichiers modifiés, 140 insertions ( ), 29 suppressions (-) réécrire importer.py (74%) mode de création 100644 fixtures/people.csv Rebase et mise à jour ré/heads/import réussie. En listant l’historique et le détail du commit, nous vérifierons que tout a été fait comme il se doit :

$ git log —oneline 766e7d0 Composant Pridana pour importation (CSV, XML) dans la base de données Tests b700909 Infrastructure d’importation … $ git show 766e7d0 commettre 766e7d05b9230f9c8ad73e42c5abb2c20fcd3751 Auteur : John Gitster … Et en effet, nos quatre commits de travail sont fusionnés en un seul. Mais nous étions intrigués que nous pouvions effectuer de nombreuses autres opérations avec des commits en utilisant rebase. En plus de la fusion que nous avons présentée, ceci est, par exemple :

  • Repliez les commits en autres séquences, en changeant l’ordre des lignes individuelles
  • Il suffit de modifier l’étiquette de validation si nous sélectionnons modifier et ensuite faire git commit —amender et git rebase —continue
  • Changer complètement commit en sélectionnant edit, en apportant des modifications, en donnant git add (ou git rm) et en procédant comme dans le cas précédent
  • Fractionner un commit incorrect qui connecte des modifications non liées en deux ou plusieurs logiques

« Réécrire l’histoire » pratiquement

Examinons l’exemple le plus commun, c’est-à-dire l’ ajustement d’un commit particulier plus profondément dans l’histoire. Considérons que nous avons continué à travailler et que notre histoire ressemble maintenant à ceci :

$ git log —oneline f5fc893 GUI pour le composant d’importation 766e7d0 Composant Pridana pour importation (CSV, XML) dans la base de données Tests b700909 Infrastructure d’importation Cependant, nous avons compris une petite erreur mais laide droit dans le composant d’importation, et nous ne voulons pas bien sûr, le correctif ajoutant au commit contenant une interface graphique, ni en ajoutant un autre, « fix » commit. Nous aidera à nouveau une rebase interactive :

$ git rebase -i b700909 choisir l’interface graphique f5fc893 pour le composant d’importation modifier le composant Pridana 766e7d0 pour l’importation (CSV, XML) dans la base de données tests Après l’avoir sauvegardé dans l’éditeur, Git nous donnera un indice :

Arrêté à 766e7d0… Composant Pridana pour l’importation (CSV, XML) vers la base de données Tests Vous pouvez modifier le commit maintenant, avec git commit —modifier Une fois que vous êtes satisfait de vos changements, exécutez git rebase —continue Maintenant, nous pouvons faire les corrections nécessaires dans le code, et après avoir préparé les fichiers pour commit (git add), nous l’enregistrons et donnons la commande pour continuer le rebase :

$ git commit —modifier Composant Pridana pour l’importation (CSV, XML) vers la base de données Tests 1 fichiers modifiés, 24 insertions ( ), 35 suppressions (-) $ git rebase —continue Rebase et mise à jour ré/heads/import réussie. Nous allons maintenant examiner comment nos opérations avéré :

$ git log —oneline 37db3b7 GUI pour le composant d’importation 71e78c8 Composant Pridana pour importation (CSV, XML) dans la base de données Tests b700909 Infrastructure d’importation Tout semble bien et nous engageons nous l’avons corrigé avec succès. Notez les petites bagatelles : l’identifiant des deux commits que nous avons rebasés a changé. Ainsi, l’histoire peut être radicalement changée et réécrite dans Git, mais elle ne passe jamais inaperçue.

Par conséquent, dans n’importe quel guide de modification de l’historique Git, vous trouverez un avertissement très fort que vous ne changez pas ou ne devez pas changer l’histoire publique .

Ce n’est pas autant d’anarchie qu’il n’y paraît

L’ histoire qui (dans la plupart des cas) a ou doit rester immuable est l’histoire publique, publiée, partagée avec d’autres : c’est-à-dire, commet que j’ai déjà « envoyé ». Ce genre d’histoire n’est plus « à moi », il ne m’appartient plus. D’autres ont fondé leur travail sur elle, d’autres branches, etc. est – comme nous venons de le voir – protégé contre les changements inobservés dans Git : le hachage SHA-1 de révision, élément de base de l’histoire, est calculé à partir de la date, de l’auteur, de l’étiquette de révision et de l’ « état » du dépôt auquel la révision apparaît. Par conséquent, si l’un de ces composants change, le hachage change également. Il est important de noter que « public » est à la fois pour Git et l’histoire d’une succursale locale qui a été incorporée à une autre. Si nous changions l’histoire d’une telle branche, l’incorporer dans une autre, exécuter d’autres commits, puis l’incorporer à nouveau, nous plongerons avec le mal. Les conséquences d’un tel changement ne seront ressenties que par vous, mais tout aussi douloureuses et cela peut vous confondre. Enfin, avec un développement fortement décentralisé, le « public » et l’histoire de la branche à partir de laquelle d’autres (typiquement maître) téléchargent des changements de moi.

Voyons que, bien sûr, nous pouvons changer l’histoire publique — nous savons à quel point Git est flexible. Mais tous avec qui l’histoire certains façon dont vous partagez, ils apprendront. Et ils apprennent, en règle générale, sous la forme de plus ou moins mauvaises nouvelles : fusionner commitem ou séquences de ceux-ci, la nécessité de rebasher l’histoire entière par rapport au vôtre, et le message souvent éloquent « La fusion automatique a échoué ; corriger les conflits et ensuite valider le résultat.

 » Git empêche quiconque de modifier l’historique public dans les paramètres de base : au cas où vous essayez de faire une poussée git de l’historique modifié, vous obtenez un message d’erreur… les mises à jour non-rapides ont été rejetées… Cependant, grâce à la flexibilité de Git, tout changement dans l’histoire publique n’est possible que si le dépôt est défini en conséquence. Vous devez donc bien considérer les conséquences d’un rebasage interactif. Si nous le faisons raisonnablement — dans la branche du sujet avant de fusionner puis de conclure ou de supprimer, ou si nous l’exécutons dans une partie de l’histoire que nous n’avons pas encore rendue publique — rien nous ne pouvons pas foirer, sauf pour une chance plus ou moins grande qu’il y ait des conflits. (Dans ce cas, nous pouvons laisser le rebase interactif entier avec la commande git rebase —abort.)

Ainsi, dans Git, tout au plus, « commuer tôt et se déplacer fréquemment » s’applique. Un exemple classique et fréquent de dépréciation de l’histoire est, par exemple, « commit à la fin de la journée », où le code est simplement enfoncé dans le dépôt alors qu’il a chuté « en cinq minutes cinq » de la main. Dans Git, nous pouvons enregistrer le travail partitionné, mais avant sa publication ajuster l’historique dans une forme plus logique et compréhensible. (N’oublions pas que « post » ne signifie pas seulement pousser git dans un dépôt partagé, mais aussi, par exemple, fusionner d’une branche privée à une branche partagée.)

Et si nous nous soucions de l’histoire compréhensible — nous utilisons un outil de gestion des versions — c’est une raison suffisante pour choisir Git. Dans la prochaine, déjà la dernière partie de notre série, nous allons demander quelques gitsters sur les avantages que Git leur a apporté et pourquoi ils l’ont choisi pour gérer le versioning.

( L’auteur remercie Jiří Kubíček de ses précieux commentaires et suggestions pour cet article. Il remercie également d’avoir signalé l’ordre de révision incorrectement indiqué dans la liste des rebases interactives au lecteur attentif Štefan Ľupták — l’ordre a été corrigé.)

Partager :