Git est un système de contrôle de version populaire. Dans Git, un 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 soit une impasse et que le développeur a fait fausse route, il doit donc revenir à la version originale. Il doit oublier la nouvelle branche, passer à la branche principale dev ou master et continuer à travailler. Dans ce cas, le "scion" va se bloquer pour toujours, ainsi que l'envie de le retirer. Mais comment supprimer la partie de l'histoire? Cette branche montre les efforts du programmeur assidu, même en vain. Il sera donc plus facile de signaler au patron, car un résultat infructueux est également un résultat!
Je me hâte de me réjouir que les développeurs Git vont introduire une nouvelle commande pour fermer ces branches "sans-abri" dans la troisième version. La version actuelle est 2.21.0 .
Comment utiliser cette commande, quels avantages offre-t-elle et qu'en pensent les sociétés informatiques? L'article répond à ces questions et à d'autres.
La description
Il est désormais possible de fermer une branche non réussie sur l'un des validations précédentes. Les arcs de fermeture sont de couleur jaune dans les images ci-dessous.
Le commit 4
est le dernier pour la fonction qui a échoué. Il a été fermé sur le commit 1
, puis nous revenons au maître et allons dans l'autre sens (le commit 5
).
Vous pouvez également fermer un commit sur lui-même, créant ainsi des boucles :
Vous pouvez fermer la branche sur n'importe quel commit - Git est intelligent, il calcule les différences et fusionne tout correctement:
Comment utiliser?
La commande merge
n'inclut pas la fonctionnalité des fermetures, car pour le premier cas la branche sera expédiée rapidement , et pour le second cas rien ne sera fait ( git already up to date
).
Afin de ne pas modifier l'ancien comportement, les développeurs ont décidé d'introduire une commande de fermeture:
git closure -s $source_commit -d $dest_commit -m $message
Le premier argument -s $source_commit
définit le hachage de la validation à partir de laquelle vous souhaitez étirer la boucle, et le second (facultatif) -d $dest_commit
définit la validation dans laquelle la boucle sera fermée. S'il est absent, la fermeture a lieu dans la succursale de caisse actuelle. L'argument -m $message
définit un message de fermeture, comme une failed feature, revert to origin
. Cependant, l' --allow-empty-message
est également disponible, ce qui permet des validations sans messages. Par défaut, Git n'autorise qu'une seule fermeture pour une paire de validations. Pour contourner cette limitation, l' --allow-multiple-closures
est disponible.

Une fois la commande exécutée, Git calcule les modifications et dans le commit final, un double diff sera affiché: à partir des branches de base et de fermeture. Dans le cas général, il s'agit d'un diff à n dimensions, c'est-à-dire qu'il peut y avoir autant de fermetures que vous le souhaitez. close-commit est similaire à merge-commit avec la seule différence qu'il contient plusieurs messages, pas un.
Malheureusement, les interfaces graphiques Git existantes ne prennent pas bien en charge les fermetures. La version d'aperçu de GitExtensions affiche des courbes de fusion au lieu d'arcs élégants. Jetez un œil aux nouveaux champs tels que Closure message
Closure diff
et Closure diff
:
Il convient de noter que la commande de closure
modifie toujours l'historique (comme maintenant Git est une machine à remonter le temps à part entière!), Il est donc désormais possible de pousser les branches uniquement avec l'option --force
ou la sécurité --force-with-lease
option de --force-with-lease
.
Rebase est également disponible pour les branches en boucle, bien que la logique de recalcul des validations soit compliquée.
L'option auto
permet également la fermeture automatique de toutes les anciennes branches. Dans ce cas, la validation de fermeture est celle qui démarre la branche. Avec les plugins Git IDE, les fermetures peuvent être exécutées périodiquement. Dans GitExtensions, il existe un plugin similaire Supprimer les branches obsolètes .
L'opinion des entreprises 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 celles non fusionnées.
L'un des principaux dirigeants de Microsoft, Michael Richter, a écrit :
La nouvelle fonctionnalité de Git, bien sûr, réduira le chaos dans le monde du développement open source (et pas seulement). Il existe de nombreuses branches "suspendues" dans nos référentiels. Par exemple, en vscode, nous en avons plus de 200 et en TypeScript plus de 300! Et ce problème n'est pas seulement le nôtre. Les fermetures améliorent non seulement l'organisation, mais permettent également de suivre le raisonnement du programmeur, parfois complètement incompréhensible même pour ses collègues :) Les fermetures me rappelaient le film "Back to the Future", où les personnages ont voyagé dans le passé et le futur. J'aime ce film, je l'ai regardé plusieurs fois. Et je pense que j'aimerai encore plus Git parce que si cette fonctionnalité :)
Remarque
Si, plus tôt, le graphique des validations était un graphique acyclique dirigé (DAG), les fermetures l'étendent à un graphique dirigé général. En utilisant Git, vous pouvez 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 c'est le sujet du hub "Programmation anormale", et dépasse donc le cadre de cet article. Cependant, si cela vous semble intéressant, consultez l' article sur la façon de stocker les arbres généalogiques dans Git.