Nouveau dans Git 3: fermetures

Git est un système de contrôle de version populaire. Dans ce document, le changement atomique d'un ou plusieurs fichiers est appelé un commit, et plusieurs commits consécutifs sont combinés dans une branche. Les branches sont utilisées pour mettre en œuvre de nouvelles idées (fonctionnalités).



Il arrive que l'idée se révèle être une impasse, le développeur s'éteint dans le mauvais sens et il est nécessaire de revenir à la version d'origine, pour cela, vous devez oublier la nouvelle branche et passer au développeur principal ou au maître , puis continuer à travailler comme si de rien n'était. Dans ce cas, le "shoot" va se bloquer pour toujours, comme le désir de le retirer. Mais comment supprimer s'il fait partie de l'histoire? Ce processus montre les efforts du programmeur bourreau de travail, bien qu'en vain. Il est plus facile de signaler aux autorités, car un résultat infructueux est également un résultat!


Je m'empresse de plaire: les développeurs de Git dans la version 3 introduiront une nouvelle commande pour fermer ces branches parasites. Permettez-moi de vous rappeler que la version actuelle est 2.21.0 .


Comment utiliser cette équipe, que donne-t-elle et que pensent les entreprises informatiques? L'article répond à ces questions et à d'autres.


La description


Vous pouvez maintenant fermer une branche qui a échoué avec l'un des validations précédentes. Les arcs de la faille sont colorés en jaune dans les figures ci-dessous.




Ici, le commit 4 est le dernier d'une fonction qui a échoué. Il a été fermé à partir du 1 , puis est retourné vers le capitaine et est allé dans l'autre sens, à partir du commit 5 .


Vous pouvez également verrouiller le commit en lui-même, créant ainsi des boucles :




Vous pouvez vous enfermer dans n'importe quel commit - smart Git calculera la différence et combinera tout correctement:




Comment utiliser?


La commande merge ne contient pas de fonctionnalité de fermeture, car pour le premier cas la branche sera forgée rapidement , et pour le second elle ne fera rien ( git already up to date ).


Afin de ne pas modifier l'ancien comportement, les développeurs ont décidé d'entrer une commande pour fermer:


 git closure -s $source_commit -d $dest_commit -m $message 

Le premier argument de -s $source_commit définit le hachage de la validation à partir de laquelle effectuer la boucle, et le second, -d $dest_commit définit la validation de la boucle à fermer. S'il est absent, la fermeture a lieu dans la branche de paiement actuelle. Le paramètre -m $message définit le message de fermeture, tel qu'une failed feature, revert to origin . Cependant, l' --allow-empty-message est également disponible, ce qui permet des validations sans texte de message. Par défaut, Git autorise exactement une fermeture pour quelques validations. Pour contourner cette limitation, l'option --allow-multiple-closures .



Une fois la commande exécutée, le git lui-même calculera les changements, et dans le commit final, le double diff sera visible: depuis les branches de base et de fin. En général, il s'agit d'un diff à n dimensions, c'est-à-dire que vous pouvez effectuer la fermeture autant de fois que vous le souhaitez. close-commit est similaire à merge-commit, à la différence près qu'il stocke plusieurs messages, pas un.


Malheureusement, les interfaces graphiques existantes pour travailler avec Git ne prennent pas encore totalement en charge les fermetures. La version d'aperçu de GitExtensions crée des courbes comme une fusion au lieu d'un bel arc. Notez les nouveaux champs Closure message Closure diff et Closure diff :



Il convient de noter que l'équipe de closure change toujours l'historique (Git, maintenant Git est une machine à remonter le temps à part entière!), Alors maintenant, vous ne pouvez --force branches qu'avec l'option --force , ou avec l'option sûre --force-with-lease .


Des rebases pour les branches avec des boucles sont également disponibles, cependant, la logique de recomptage des commits est compliquée.


De plus, l'option auto vous permet de fermer automatiquement toutes les anciennes branches. Dans ce cas, la validation de fermeture est celle à partir de laquelle le branchement a commencé. En utilisant des plugins pour Git IDE, les fermetures peuvent être exécutées périodiquement. Dans GitExtensions, un plugin similaire Supprimer les branches obsolètes supprime les branches obsolètes.


Opinion des sociétés informatiques


Les grandes entreprises informatiques: Google, Facebook, Apple, DeepMind, Positive Technologies, et surtout Microsoft, attendent avec impatience les fermetures, car il sera désormais possible de formaliser le cycle de vie des succursales, y compris les succursales non contiguës.


L'un des principaux dirigeants de Microsoft, Michael Richter, écrit :


La nouvelle fonctionnalité de git réduira certainement le chaos dans le monde du développement Open Source et pas seulement. Nos référentiels ont beaucoup de branches suspendues. Par exemple, il y en a plus de 200 dans vscode , et il y en a plus de 300 dans TypeScript ! Et ce n'est pas seulement le problème de Microsoft. Les fermetures améliorent non seulement l'organisation, mais vous permettent également de suivre le raisonnement du programmeur, parfois complètement incompréhensible même pour ses collègues :) Les fermetures m'ont rappelé le film "Back to the Future" - où les personnages ont voyagé dans le passé et le futur. J'adore ce film, je l'ai revu plusieurs fois. Et je pense que j'aimerai le git à cause de ça encore plus :)

Remarque


Si auparavant le graphe de validation était un graphe acyclique dirigé (DAG), les fermetures l'étendent à un graphe dirigé généralisé. Avec Git, il sera possible de décrire des expressions régulières dans lesquelles les états sont validés, et l'alphabet est l'ensemble de tous les messages. Mais cela sent le hub "programmation anormale", et dépasse donc la portée de l'article. Cependant, si cela vous intéresse, consultez l' article qui décrit comment vous pouvez stocker des arbres généalogiques dans Git.

Source: https://habr.com/ru/post/fr445676/


All Articles