rilascio del sistema di controllo distribuito delle versioni . Git è uno dei sistemi di controllo versione più popolari, affidabili e ad alte prestazioni, che offre strumenti flessibili per lo sviluppo non lineare, basati su ramificazione e fusione dei rami. Per garantire l'integrità della cronologia e la resilienza alle modifiche retroattive, viene utilizzata l'hashing implicito dell'intera cronologia precedente in ogni commit, è anche possibile la verifica tramite firme digitali degli sviluppatori per singoli tag e commit.
Rispetto alla versione precedente, nella nuova versione sono stati integrati 745 cambiamenti, preparati con la partecipazione di 74 sviluppatori, di cui 18 hanno partecipato per la prima volta allo sviluppo. :
- Disponibile sin dalla versione 1.18, la nuova modalità di trasferimento della serie di commit «git rebase —rebase-merges» ha sostituito la vecchia opzione «—preserve-merges», ora contrassegnata come obsoleta. L'operazione «git rebase» viene applicata per sostituire una serie di commit con un nuovo commit base, ad esempio, per spostare un ramo separato, in cui si sta sviluppando una nuova funzionalità, allo stato attuale del ramo master, che include correzioni aggiunte dopo la ramificazione:
o — o — o (my-feature)
/
o — o — o — o — o (master)
o — o — o (my-feature)
/
o — o — o — o — o (master)
Per mantenere la struttura di ramificazione in un ramo trasferibile, in passato si poteva applicare l'opzione «—preserve-merges», che, se eseguita in modalità interattiva (git rebase -i —preserve-merges), permetteva di modificare la cronologia dei commit, ma non garantiva il completo salvataggio della struttura del repository. Il nuovo comando «—rebase-merges» permette di mantenere la struttura delle modifiche nel ramo trasferibile, fornendo al contempo un insieme completo di operazioni interattive, tra cui la cancellazione, la riordina e la rinomina dei commit.
Ad esempio, «—rebase-merges» ripristinare i commit da un ramo separato su un ramo master più recente, mantenendo così la struttura di ramificazione nel ramo trasferibile e apportando nel frattempo alcune modifiche alle note sui commit.
- È stata aggiunta la possibilità di creare un nuovo ramo basato sul risultato della determinazione della base di fusione di due altri rami (merge base, riferimento a un comune antenato) tramite le istruzioni «git branch new A…B» e «git checkout -b new A…B», dove «A…B» implica la determinazione della base di fusione tra i due commit specificati, analogamente a come «git checkout A…B» sposta HEAD sul commit base e «diff A…B» mostra le modifiche tra il commit «B» e il comune antenato con il commit «A».
Ad esempio, lavorando su un ramo separato my-feature, la funzionalità proposta può essere utilizzata quando è necessario partire da un altro ramo, ad esempio, dallo stesso punto nel ramo master da cui è stato estratto il ramo my-feature. In precedenza, per farlo, era necessario esaminare manualmente il log delle modifiche, il che creava difficoltà in presenza di una lunga storia di modifiche, poi eseguire «git merge-base master my-feature» per calcolare l'hash della base di fusione tra i rami master e my-feature e creare un nuovo ramo relativo all'antenato comune «git branch my-other-feature hash». In Git 2.22, per creare un ramo relativo alla base di fusione di due altri rami, si può utilizzare la sintassi «git branch my-other-feature A…B».
- Aggiunta l'opzione «git branch —show-current» per mostrare il nome del branch ottenuto durante l'operazione checkout;
- Aggiunta l'opzione «git checkout —no-overlay — dir», che consente, durante l'operazione checkout, di portare il contenuto della directory dir a uno stato completamente corrispondente a quello del branch master. Ad esempio, se nella copia locale della directory dir è presente un file che non esiste nel branch master, per default durante l'esecuzione di «git checkout master — dir» esso verrà mantenuto, mentre specificando l'opzione «—no-overlay» verrà rimosso;
- Nel comando «git diff» è stato implementato un API universale per il parsing delle opzioni, che ha consentito di uniformare la gestione delle opzioni con altre utility git. Ad esempio, in «git diff» per tutte le opzioni ora sono disponibili anche i loro antagonisti («—function-context» e «—no-function-context»);
- Aggiunta la possibilità di filtrare l'output di «git log» delle etichette estese collegate ai commit («trailer» — bandiere informative aggiuntive, come Signed-off-by e Co-authored-by). È possibile filtrare le etichette sia per chiave che per valore, ad esempio:
«git log —pretty=»%(trailers:key=Reviewed-by,valueonly)»; - È stato aggiunto un nuovo meccanismo di tracciamento Trace2, che offre un formato di output più flessibile e strutturato. Trace2 consente di raccogliere telemetria sulle operazioni eseguite e dati sulle prestazioni per un'analisi e un debug più dettagliati (il gestore è assegnato dall'utente, nessun dato viene inviato all'esterno);
- È stato reso più leggibile il report «git bisect», che ora evidenzia in modo più chiaro i commit problematici e fornisce una statistica riassuntiva delle modifiche per ogni file (a livello del numero di righe modificate);
- È stata rielaborata l'euristica per la determinazione delle rinominazioni delle directory al fine di escludere segnali falsi di rinominazione. In caso di dubbi, tali directory vengono ora contrassegnate come conflittuali;
- È stata garantita l'emissione di un avviso quando si tenta di impostare un tag su un altro tag, una pratica che di solito avviene per errore e può portare all'impostazione di un'etichetta sul commit sbagliato (ad esempio, una costruzione del tipo «git tag -f -m «updated message» my-tag1 my-tag2» porterà alla creazione di un tag sul vecchio tag, mentre lo sviluppatore si aspettava che il nuovo tag fosse impostato sul commit a cui punta il vecchio tag);
- È attivata la generazione per i repository delle mappe di raggiungibilità (struttura dati «reachability bitmaps»), che memorizza informazioni sui set di oggetti disponibili per ciascun commit, consentendo di determinare rapidamente la presenza di un oggetto di base. Questa struttura riduce significativamente il tempo di esecuzione delle operazioni di estrazione dati (git fetch).
Fonte: opennet.ru
