Neues Feature in Git 3: Schließungen

Git ist ein beliebtes Versionskontrollsystem. In Git wird eine atomare Änderung einer oder mehrerer Dateien als Commit bezeichnet, und mehrere aufeinanderfolgende Commits werden zu einem Zweig zusammengefasst. Zweige werden verwendet, um neue Ideen (Features) umzusetzen.



Es kommt vor, dass die Idee eine Sackgasse ist und der Entwickler den falschen Weg eingeschlagen hat, sodass er auf die ursprüngliche Version zurücksetzen muss. Er sollte den neuen Zweig vergessen, zum Hauptentwickler oder Hauptzweig wechseln und weiterarbeiten. In diesem Fall bleibt der "Spross" für immer hängen, ebenso wie der Wunsch, ihn zu entfernen. Aber wie kann man den Teil der Geschichte entfernen? Dieser Zweig zeigt die Bemühungen des fleißigen Programmierers, wenn auch vergebens. So ist es einfacher, sich beim Chef zu melden, denn ein erfolgloses Ergebnis ist auch ein Ergebnis!


Ich freue mich sehr, dass Git-Entwickler in der dritten Version einen neuen Befehl zum Schließen solcher "obdachloser" Zweige einführen werden. Die aktuelle Version ist 2.21.0 .


Wie wird dieser Befehl verwendet, welche Vorteile bietet er und was denken IT-Unternehmen? Der Artikel beantwortet diese und andere Fragen.


Beschreibung


Jetzt ist es möglich, einen nicht erfolgreichen Zweig über einen der vorherigen Commits zu schließen. Verschlussbögen sind in den folgenden Bildern gelb gefärbt.




Das Commit 4 ist das letzte für die nicht erfolgreiche Funktion. Es wurde über das Commit 1 , und dann kehren wir zum Master zurück und gehen in die andere Richtung (das Commit 5 ).


Sie können ein Commit auch über sich selbst schließen und so Schleifen erstellen:




Sie können den Zweig über jedes Commit schließen - Git ist intelligent, berechnet die Unterschiede und führt alles korrekt zusammen:




Wie benutzt man?


Der merge enthält nicht die Funktionalität von Schließungen, da im ersten Fall der Zweig schnell vorgespult wird und im zweiten Fall nichts unternommen wird ( git already up to date ).


Um das alte Verhalten nicht zu ändern, haben die Entwickler beschlossen, einen Schließbefehl einzuführen:


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

Das erste Argument -s $source_commit legt den Hash des Commits fest, von dem aus Sie die Schleife strecken möchten, und das zweite (optional) -d $dest_commit legt das Commit fest, in das die Schleife geschlossen wird. Wenn es nicht vorhanden ist, erfolgt die Schließung in der aktuellen Check-out-Filiale. Das Argument -m $message legt fest, dass eine Abschlussnachricht wie eine failed feature, revert to origin . Es ist jedoch auch die Option --allow-empty-message verfügbar, die Commits ohne Nachrichten ermöglicht. Standardmäßig erlaubt Git nur einen Abschluss für ein Commit-Paar. Um diese Einschränkung zu umgehen, ist die Option --allow-multiple-closures verfügbar.



Nachdem der Befehl ausgeführt wurde, berechnet Git die Änderungen und beim endgültigen Festschreiben wird ein doppelter Unterschied angezeigt: von der Basis und den schließenden Zweigen. Im allgemeinen Fall handelt es sich um ein n-dimensionales Diff, dh es können so viele Verschlüsse vorhanden sein, wie Sie möchten. Closure-Commit ähnelt Merge-Commit mit dem einzigen Unterschied, dass es mehrere Nachrichten enthält, nicht eine.


Leider haben vorhandene Git-GUIs keine gute Unterstützung für Schließungen. In der Vorschauversion von GitExtensions werden Zusammenführungskurven anstelle eleganter Bögen angezeigt . Schauen Sie sich die neuen Felder wie Closure message und Closure diff :



Es ist erwähnenswert, dass der closure immer den Verlauf ändert (da Git jetzt eine vollwertige Zeitmaschine ist!). Daher ist es jetzt möglich, Zweige nur mit der Option --force oder der sicheren Option --force-with-lease .


Rebase ist auch für Loop-Zweige verfügbar, obwohl die Logik für die Neuberechnung von Commits kompliziert ist.


Die auto Option ermöglicht auch das automatische Schließen aller alten Filialen. In diesem Fall ist das Closing Commit dasjenige, das den Zweig startet. Mit Git IDE-Plugins können Schließungen regelmäßig ausgeführt werden. In GitExtensions gibt es ein ähnliches Plugin. Veraltete Zweige löschen.


Was IT-Unternehmen denken


Große IT-Unternehmen: Google, Facebook, Apple, DeepMind, Positive Technologies und insbesondere Microsoft warten gespannt auf Schließungen, da es jetzt möglich sein wird, den Lebenszyklus von Filialen, einschließlich nicht zusammengeschlossener, zu formalisieren.


Einer der Top-Manager von Microsoft, Michael Richter, schrieb :


Die neue Funktion von Git wird natürlich das Chaos in der Welt der Open Source-Entwicklung (und nicht nur) verringern. In unseren Repositories befinden sich viele "hängende" Zweige. Zum Beispiel haben wir in vscode mehr als 200 davon und in TypeScript mehr als 300! Und dieses Problem liegt nicht nur bei uns. Abschlüsse verbessern nicht nur die Organisation, sondern ermöglichen es auch, die Argumentation des Programmierers zu verfolgen, die selbst für Kollegen manchmal völlig unverständlich ist :) Abschlüsse erinnerten mich an den Film "Zurück in die Zukunft", in dem die Charaktere in die Vergangenheit und in die Zukunft reisten. Ich mag diesen Film, ich habe ihn mehrmals gesehen. Und ich denke, ich werde Git noch mehr lieben, denn wenn diese Funktion :)

Hinweis


Wenn der Commit-Graph früher ein gerichteter azyklischer Graph (DAG) war, wird er durch Verschlüsse auf einen allgemein gerichteten Graphen erweitert . Mit Git können Sie reguläre Ausdrücke beschreiben, in denen die Zustände Festschreibungen sind, und das Alphabet ist die Menge aller Nachrichten. Dies ist jedoch das Thema für den Hub "Abnormale Programmierung" und geht daher über den Rahmen dieses Artikels hinaus. Wenn dies für Sie jedoch interessant klingt, lesen Sie den Artikel zum Speichern von Stammbäumen in Git.

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


All Articles