Neu in Git 3: Schließungen

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



Es kommt vor, dass sich die Idee als Sackgasse herausstellt, der Entwickler den falschen Weg abschaltet und ein Rollback auf die ursprüngliche Version erforderlich ist. Dazu müssen Sie den neuen Zweig vergessen und zum Hauptentwickler oder Master wechseln und dann weiterarbeiten, als wäre nichts passiert. In diesem Fall bleibt der "Schuss" für immer hängen, wie der Wunsch, ihn zu entfernen. Aber wie löscht man, wenn es Teil der Geschichte ist? Dieser Prozess zeigt die Bemühungen des Workaholic-Programmierers, wenn auch vergebens. Es ist einfacher, sich bei den Behörden zu melden, da ein erfolgloses Ergebnis auch ein Ergebnis ist!


Ich beeile mich zu gefallen: Die Git-Entwickler in Version 3 werden einen neuen Befehl einführen, um solche streunenden Zweige zu schließen. Ich möchte Sie daran erinnern, dass die aktuelle Version 2.21.0 ist .


Wie man dieses Team einsetzt, was gibt es und was denken IT-Unternehmen? Der Artikel beantwortet diese und andere Fragen.


Beschreibung


Jetzt können Sie einen nicht erfolgreichen Zweig mit einem der vorherigen Commits schließen. Die Bögen des Fehlers sind in den folgenden Abbildungen gelb gefärbt.




Hier ist Commit 4 das letzte für eine nicht erfolgreiche Funktion. Er wurde von 1 geschlossen und kehrte dann zum Meister zurück und ging von Commit 5 in die andere Richtung.


Sie können das Commit auch in sich selbst sperren und so Schleifen erstellen:




Sie können sich an jedes Commit binden - smart Git berechnet den Unterschied und kombiniert alles richtig:




Wie benutzt man?


Der merge Befehl enthält keine Closure-Funktionalität, da der Zweig im ersten Fall schnell gefälscht wird und im zweiten Fall nichts git already up to date wird ( git already up to date ).


Um das alte Verhalten nicht zu ändern, haben die Entwickler beschlossen, einen Befehl zum Schließen einzugeben:


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

Das erste Argument -s $source_commit gibt den Hash des Commits an, aus dem eine Schleife ausgeführt werden soll, und das zweite, optional -d $dest_commit , gibt das Commit an, in dem die Schleife geschlossen werden muss. Wenn es nicht vorhanden ist, erfolgt die Schließung in der aktuellen Check-out-Filiale. Der Parameter -m $message legt fest, dass die Abschlussnachricht, z. B. die failed feature, revert to origin . Es ist jedoch auch die Option --allow-empty-message verfügbar, die Commits ohne Nachrichtentext ermöglicht. Standardmäßig erlaubt Git genau einen Abschluss für ein paar Commits. Um diese Einschränkung zu --allow-multiple-closures , ist die Option --allow-multiple-closures .



Nachdem der Befehl ausgeführt wurde, berechnet der Git selbst die Änderungen, und beim endgültigen Festschreiben wird Double Diff angezeigt: vom Basis- und vom nachfolgenden Zweig. Im Allgemeinen handelt es sich hierbei um ein n-dimensionales Diff, dh Sie können das Schließen so oft durchführen, wie Sie möchten. Closure-Commit ähnelt Merge-Commit mit dem Unterschied, dass mehrere Nachrichten gespeichert werden, nicht eine.


Leider unterstützen die vorhandenen GUIs für die Arbeit mit Git Schließungen noch nicht vollständig. Die Vorschau-Version von GitExtensions erstellt Kurven wie eine Zusammenführung anstelle eines schönen Bogens. Beachten Sie die neuen Felder Closure message und Closure diff :



Es ist erwähnenswert, dass das closure immer den Verlauf ändert (Git, jetzt ist Git eine vollwertige Zeitmaschine!). Jetzt können --force Zweige nur noch mit der Option --force oder mit der sicheren Option --force-with-lease .


Rebases für Zweige mit Schleifen sind ebenfalls verfügbar, die Logik zum Nachzählen von Commits in ihnen ist jedoch kompliziert.


Mit der Option auto können Sie außerdem alle alten Zweige automatisch schließen. In diesem Fall ist das Abschluss-Commit dasjenige, von dem aus die Verzweigung gestartet wurde. Mit Plugins für die Git-IDE können Schließungen regelmäßig ausgeführt werden. In GitExtensions entfernt ein ähnliches Plugin zum Löschen veralteter Zweige veraltete Zweige.


Meinung von IT-Unternehmen


Große IT-Unternehmen: Google, Facebook, Apple, DeepMind, Positive Technologies und insbesondere Microsoft freuen sich auf Schließungen, da jetzt der Lebenszyklus von Filialen, auch nicht zusammenhängender, formalisiert werden kann.


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


Die neue Funktion des Git wird sicherlich das Chaos in der Welt der Open Source-Entwicklung reduzieren und nicht nur. Unsere Repositories haben viele hängende Zweige. Zum Beispiel gibt es mehr als 200 davon in vscode und mehr als 300 davon in TypeScript ! Und das ist nicht nur das Problem von Microsoft. Abschlüsse verbessern nicht nur die Organisation, sondern ermöglichen es Ihnen 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 liebe diesen Film, ich habe ihn mehrmals rezensiert. Und ich denke, dass ich den Git deswegen noch mehr lieben werde :)

Hinweis


Wenn der Commit-Graph früher ein gerichteter azyklischer Graph (DAG) war, erweitern ihn Verschlüsse auf einen verallgemeinerten gerichteten Graphen . Mit Git ist es möglich, reguläre Ausdrücke zu beschreiben, in denen die Zustände festgeschrieben sind, und das Alphabet ist die Menge aller Nachrichten. Dies riecht jedoch nach "abnormaler Programmierung" des Hubs und geht daher über den Rahmen des Artikels hinaus. Wenn Sie jedoch daran interessiert sind, lesen Sie den Artikel , in dem beschrieben wird, wie Sie Stammbäume in Git speichern können.

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


All Articles