rilascio del sistema di controllo distribuito delle versioni . Git è uno dei sistemi di controllo delle versioni più popolari, affidabili e ad alte prestazioni, che offre strumenti flessibili per lo sviluppo non lineare basati su branching e merging. Per garantire l'integrità della cronologia e la resilienza alle modifiche retroattive, viene utilizzato un hashing implicito dell'intera storia precedente in ciascun commit, e è anche possibile la verifica delle firme digitali degli sviluppatori di singoli tag e commit.
Rispetto all'ultima versione, nella nuova versione sono stati introdotti 745 cambiamenti, preparati con la partecipazione di 74 sviluppatori, di cui 18 hanno partecipato per la prima volta allo sviluppo. :
- Disponibile dalla versione 1.18, la nuova modalità di trasferimento del set di commit «git rebase —rebase-merges» ha sostituito la vecchia opzione «—preserve-merges», ora contrassegnata come obsoleta. L'operazione «git rebase» viene utilizzata per sostituire una serie di commit con un nuovo commit di base, ad esempio, per spostare un ramo separato in cui viene sviluppata una nuova funzione allo stato attuale del ramo master, che include correzioni aggiunte dopo il distacco:
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 dei rami nel ramo portabile, in precedenza poteva essere utilizzata l'opzione «—preserve-merges», che, se eseguita in modalità interattiva (git rebase -i —preserve-merges), permetteva di modificare la storia dei commit, ma non garantiva il pieno mantenimento della struttura del repository. La nuova modalità «—rebase-merges» consente di mantenere la struttura delle modifiche nel ramo portabile, fornendo al contempo un set completo di operazioni interattive, inclusa la cancellazione, la riordinazione e la rinominazione dei commit.
Ad esempio, «—rebase-merges» ripristinare i commit da un ramo separato a un ramo master più nuovo, mantenendo la struttura dei rami nel ramo portabile, e apportare al contempo alcune modifiche alle note dei commit.
- È stata aggiunta la possibilità di creare un nuovo ramo basato sul risultato della determinazione della base di unione di altri due rami (merge base, agganciato a un antenato comune) utilizzando le costruzioni «git branch new A…B» e «git checkout -b new A…B», in cui «A…B» implica la determinazione della base di unione tra i due commit specificati, analogamente a come «git checkout A…B» sposta HEAD sul commit di base e «diff A…B» mostra le modifiche tra il commit «B» e l'antenato comune con il commit «A».
Ad esempio, durante il lavoro su un ramo separato my-feature, è possibile utilizzare la funzione proposta quando è necessario iniziare da un altro ramo, per esempio, dallo stesso punto del ramo master da cui è stato estratto il ramo my-feature. In precedenza, era necessario esaminare manualmente la cronologia delle modifiche, il che creava disagio in presenza di una lunga storia delle modifiche, quindi eseguire "git merge-base master my-feature" per calcolare l'hash della base di unione tra i rami master e my-feature e creare un nuovo ramo relativo all'antico comune "git branch my-other-feature hash". In Git 2.22, per creare un ramo relativo alla base di unione di altri due rami, è possibile utilizzare la sintassi "git branch my-other-feature A…B";
- Aggiunta l'opzione "git branch —show-current" per visualizzare il nome del ramo ottenuto durante l'operazione di checkout;
- Aggiunta l'opzione "git checkout —no-overlay — dir", che consente, durante l'operazione di checkout, di riportare il contenuto della directory dir in uno stato che corrisponda completamente a quello del ramo master. Ad esempio, se nella copia locale della directory dir c'è un file assente nel ramo master, per impostazione predefinita, durante l'esecuzione di "git checkout master — dir", esso verrà lasciato, mentre specificando l'opzione "—no-overlay", verrà rimosso;
- Nella command "git diff" è stato impiegato un API universale per l'analisi delle opzioni, il che ha permesso di uniformare la gestione delle opzioni con altre utility git. Ad esempio, in "git diff" per tutte le opzioni sono ora disponibili anche i loro antagonisti ("—function-context" e "—no-function-context");
- È stata aggiunta la possibilità di filtrare durante l'output di "git log" le etichette estese collegate ai commit ("trailer" - flag informativi aggiuntivi, 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)»; - Aggiunto un nuovo meccanismo di tracciamento Trace2, che offre un formato di output più flessibile e strutturato. Trace2 consente di raccogliere telemetria sulle operazioni effettuate e dati sulle prestazioni per un'analisi e un debug più dettagliati (un handler è designato dall'utente, nessun dato viene inviato all'esterno);
- Reso più leggibile il report "git bisect", nel quale ora sono evidenziati in modo più chiaro i commit problematici e fornite statistiche riepilogative sui cambiamenti per ogni file (a livello del numero di righe modificate);
- È stata rielaborata l'euristica per la definizione delle rinominazioni delle directory al fine di escludere l'impostazione errata delle etichette di rinominazione. In caso di dubbi, queste directory ora vengono contrassegnate come conflittuali;
- È stato garantito un avviso quando si tenta di impostare un'etichetta su un'altra etichetta, cosa che di solito avviene per errore e può portare a un'etichetta impostata sul commit sbagliato (ad esempio, la costruzione del tipo «git tag -f -m «messaggio aggiornato» my-tag1 my-tag2» porterà alla creazione di un'etichetta su un'etichetta vecchia, mentre lo sviluppatore si aspettava che la nuova etichetta fosse impostata sul commit a cui punta l'etichetta vecchia);
- È stata abilitata la generazione per i repository di bitmap (struttura disco «reachability bitmaps»), che conservano i dati sui set di oggetti disponibili per ogni commit e consentono di determinare rapidamente la presenza di un oggetto di base. La struttura indicata riduce notevolmente i tempi di esecuzione delle operazioni di estrazione dei dati (git fetch).
Fonte: opennet.ru
