lancering van het gedistribueerde bronbeheersysteem . Git is een van de populairste, betrouwbare en krachtige versiesystemen die flexibele middelen voor niet-lineaire ontwikkeling biedt, gebaseerd op takken en samenvoegen. Voor de integriteit van de geschiedenis en de weerstand tegen terugwerkende kracht wordt impliciete hashing van de gehele eerdere geschiedenis in elke commit gebruikt; ook is het mogelijk om digitale handtekeningen van ontwikkelaars voor afzonderlijke tags en commits te verifiëren.
In vergelijking met de vorige release zijn er 745 wijzigingen in deze nieuwe versie doorgevoerd, voorbereid met medewerking van 74 ontwikkelaars, van wie 18 voor het eerst deelnamen aan de ontwikkeling. :
- De vanaf release 1.18 beschikbare nieuwe modus voor het verplaatsen van een reeks commits «git rebase —rebase-merges» vervangt de oude optie «—preserve-merges», die nu als verouderd is gemarkeerd. De bewerking «git rebase» wordt gebruikt om een reeks commits te vervangen door een nieuwe basiscommit, bijvoorbeeld om een afzonderlijke tak, waarin een nieuwe functie wordt ontwikkeld, naar de actuele status van de master-tak te verplaatsen, inclusief correcties die na het splitsen zijn toegevoegd:
o — o — o (my-feature)
/
o — o — o — o — o (master)
o — o — o (my-feature)
/
o — o — o — o — o (master)
Om de takstructuur in de overdraagbare tak te behouden, kon eerder de optie «—preserve-merges» worden toegepast, die bij uitvoering in interactieve modus (git rebase -i —preserve-merges) het bewerken van de geschiedenis van commits mogelijk maakte, maar geen volledige behoud van de structuur van de repository garandeerde. De vervangende modus «—rebase-merges» maakt het mogelijk om de wijzigingsstructuur in de overdraagbare tak te behouden, terwijl een volledige set interactieve bewerkingen wordt aangeboden, inclusief het verwijderen, herstructureren en hernoemen van commits.
Bijvoorbeeld, «—rebase-merges» commits uit een afzonderlijke tak naar een nieuwere master-tak over te plaatsen, terwijl de takstructuur in de overdraagbare tak behouden blijft, en terwijl onderweg enkele wijzigingen in de commitnotities worden aangebracht.
- Ondersteuning toegevoegd voor het maken van een nieuwe tak op basis van het resultaat van het bepalen van de samenvoegbasis van twee andere takken (merge base, verwijzing naar een gemeenschappelijke voorouder) met behulp van de constructies «git branch new A…B» en «git checkout -b new A…B», waarbij «A…B» verwijst naar het bepalen van de samenvoegbasis tussen de twee opgegeven commits, op een vergelijkbare manier als «git checkout A…B» de HEAD naar de basiscommit verschuift en «diff A…B» de wijzigingen tussen commit «B» en de gemeenschappelijke voorouder met commit «A» toont.
Bijvoorbeeld, bij het werken aan een aparte tak my-feature kan de voorgestelde functie worden gebruikt wanneer het nodig is om vanaf een andere tak te beginnen, bijvoorbeeld vanaf dezelfde plaats in de master-tak waar de tak my-feature is afgeleid. Voorheen was dit nodig om handmatig de wijzigingsgeschiedenis te doorlopen, wat ongemak veroorzaakte bij een grote geschiedenis van veranderingen, en daarna 'git merge-base master my-feature' uit te voeren om de hash van de merge basis tussen de takken master en my-feature te berekenen en een nieuwe tak te creëren vanuit de gemeenschappelijke voorouder 'git branch my-other-feature hash'. In Git 2.22 kan voor het creëren van een tak ten opzichte van de merge basis van twee andere takken de syntaxis 'git branch my-other-feature A…B' worden gebruikt;
- Een optie 'git branch —show-current' is toegevoegd voor het weergeven van de naam van de tak die is verkregen na het uitvoeren van de checkout-operatie;
- Een optie 'git checkout —no-overlay — dir' is toegevoegd, waarmee bij het uitvoeren van een checkout-de operatie de inhoud van de map dir volledig kan worden aangepast aan de staat van de master-tak. Bijvoorbeeld, als er in de lokale kopie van de map dir een bestand is dat ontbreekt in de master-tak, blijft het standaard behouden bij het uitvoeren van 'git checkout master — dir', maar wordt het verwijderd als de optie '—no-overlay' is opgegeven;
- In de 'git diff' command is een universele API voor het parseren van opties toegepast, wat het mogelijk maakte om de verwerking van opties te uniformeren met andere git-hulpmiddelen. Bijvoorbeeld, in 'git diff' zijn nu voor alle opties ook hun tegenhangers ('—function-context' en '—no-function-context') beschikbaar;
- De mogelijkheid om te filteren bij de uitvoer van 'git log' is toegevoegd met betrekking tot uitgebreide labels ('trailer') die aan commit's zijn gehecht (extra informatieve vlaggen zoals Signed-off-by en Co-authored-by). Filtering is mogelijk op zowel sleutel als waarde, bijvoorbeeld:
‘git log —pretty=’%(trailers:key=Reviewed-by,valueonly)’; - Een nieuw Trace2 tracing-mechanisme is toegevoegd, dat een flexibeler en gestructureerder uitvoerformaat biedt. Trace2 maakt het mogelijk om telemetrie over uitgevoerde operaties en prestatiegegevens te verzamelen voor een gedetailleerdere analyse en debugging (de handler wordt door de gebruiker toegewezen, er worden geen gegevens naar buiten gestuurd);
- Het rapport 'git bisect' is leesbaarder gemaakt, waarin nu problematische commits beter worden gemarkeerd en een samenvattende statistiek van de wijzigingen voor elk bestand (op basis van het aantal gewijzigde regels) wordt weergegeven;
- De heuristiek voor het identificeren van naamsveranderingen in mappen is herzien om valse naamswijzigingen te voorkomen. Bij twijfel worden dergelijke mappen nu gemarkeerd als conflicterend;
- Een waarschuwing is geïmplementeerd wanneer geprobeerd wordt een tag op een andere tag in te stellen, wat meestal een vergissing is en kan leiden tot het toekennen van een label aan de verkeerde commit (bijvoorbeeld, de constructie 'git tag -f -m "updated message" my-tag1 my-tag2' zal een tag creëren op een oude tag, terwijl de ontwikkelaar verwacht dat de nieuwe tag op de commit wordt ingesteld waar de oude tag naar verwijst);
- De generatie voor repositories met bereikbaarheid bitmaps is ingeschakeld, die gegevens opslaan over de sets objecten die voor elke commit beschikbaar zijn, en waarmee snel kan worden bepaald of een basisobject aanwezig is. Deze structuur verkort aanzienlijk de uitvoeringstijd van data-extractie-operaties (git fetch).
Bron: opennet.ru
