programmatūra · 4 min · 12.07.2026

Git ievieš history komandu — vēstures labošana bez interaktīvā rebase

Git 2.54 pievienoja komandu git history, ar kuru var pārrakstīt atsevišķus commitus, neizmantojot interaktīvo rebase. Jūnija beigās izlaistajā 2.55 versijā tai pievienojās trešā apakškomanda. Doma ir vienkārša: parastākos vēstures labojumus, ko izstrādātāji dara katru dienu — pārrakstīt commit ziņu, sadalīt vienu commit divos, ielikt aizmirstu labojumu iepriekšējā commit — vairs nav jādzen caur git rebase -i redaktora skriptu.

Motivācija ir tieša. Interaktīvais rebase ir jaudīgs, bet daudzus biedē: jāatver redaktors ar to-do sarakstu, jāzina pareizie atslēgvārdi (pick, squash, edit), un ja kaut kur pārraksti roku, viss commitu virknis var izšķīst. GitLab bloga apraksts to formulē tā: rebase ir spēcīgs, taču vidusmēra lietotājam iebiedējošs. Jaunā komanda paņem konkrētus, biežus uzdevumus un piedāvā tiem atsevišķu, šaurāku ceļu.

Trīs apakškomandas

git history reword <commit> atver redaktoru ar norādītā commit ziņu un pārraksta to uz vietas. Darba koks un indekss paliek neaiztikti — mainās tikai ziņa un visi commiti, kas atkarīgi no tā.

git history split <commit> sadala vienu commit divos. Tu interaktīvi izvēlies, kuri hunk aiziet uz jauno vecāka commit, tāpat kā tas notiek git add -p saskarnē. Noderīgi, kad viens commit ir sanācis par lielu vai jauc kopā divas nesaistītas izmaiņas.

Versijā 2.55 pienāca git history fixup <commit>. Sagatavo staged izmaiņu (piemēram, vienas rindas labojumu), palaid fixup ar mērķa commit, un Git ieloka to labojumu attiecīgajā commit un pārspēlē pārējos virsū. Bez manuālas autosquash žonglēšanas.

Kopīgā iezīme: komanda automātiski pārbāzē visus tavus lokālos zarus, kas iepriekš saturēja šo commit. Tas tieši atbalsta stacked diffs darba plūsmu, kur vairāki zari sēž cits virs cita.

Ir apzināti ierobežojumi. GitHub bloga pārskats norāda, ka komanda neatbalsta vēsturi ar merge commitiem un atsakās veikt operāciju, kas radītu merge konfliktu. Tā ir apzināta izvēle — git history nemēģina aizvietot rebase visos gadījumos, tikai nosegt biežos un drošos. Nākotnē plānots pievienot drop, reorder un squash.

Konfigurācijā definēti hooki

Otrs praktiskais jaunums 2.54 ir hooki, ko var aprakstīt tieši Git konfigurācijā, nevis tikai kā skriptus mapē .git/hooks/:

[hook "linter"]
    event = pre-commit
    command = ~/bin/linter --cpp20

Šādu hooku var likt sistēmas līmenī (/etc/gitconfig), lietotāja ~/.gitconfig vai konkrēta repozitorija lokālajā konfigurācijā. Vienam notikumam var reģistrēt vairākus hookus, un ar git hook list redzi, kuri ir aktīvi un no kurienes nāk. Vecie skripti .git/hooks/ turpina strādāt un izpildās pēdējie.

Šo daļu izstrādāja Adrians Ratiu no Collabora sadarbībā ar Džefu Kingu. Collabora aprakstā minēts arī nākamais solis 2.55: hooki var izpildīties paralēli, ja tos atzīmē ar hook.<name>.parallel = true, bet paralēlisma pakāpi kontrolē hook.jobs. Iepriekš to pašu nāktos risināt ar sarežģītu skriptošanu vai fork/spawn apstrādi katrai OS atsevišķi.

Kas vēl 2.55

Git 2.55, izlaista 29. jūnijā, atnāca ar diviem veiktspējas uzlabojumiem lieliem repozitorijiem. Bitmap ģenerēšana saruka no aptuveni 612 līdz 294 sekundēm, un pseudo-merge bitmapi padara pārlūkošanu ap 20 reižu ātrāku, vienlaikus samazinot ģenerēšanas slodzi. Iebūvētais fsmonitor dēmons tagad strādā arī uz Linux, izmantojot inotify, kas paātrina git status bez papildu tiesībām.

Uzturēšanas pusē 2.54 par noklusējumu git maintenance run padarīja ģeometrisko repaku, kas ieviesta 2.52. Tā apvieno packfailus pakāpeniski un izvairās no dārgā “viss vienā” repaka, kas monorepo gadījumā var aizņemt minūtes. Zem pārsega Git objektu datubāze kļuvusi par pievienojamu backend — pagaidām lietotājam neredzami, bet tas paver ceļu alternatīviem glabāšanas formātiem.

Ko darīt tagad

Ja vēl neesi atjauninājies, 2.55 ir pēdējā stabilā versija. Komanda git history ir atzīmēta kā eksperimentāla, tāpēc saskarne vēl var mainīties — bet reword, split un fixup jau tagad nosedz to, ko lielākā daļa cilvēku no rebase izmanto ikdienā. Kas turējās pa gabalu no rebase -i, tam tagad ir mazāk aukstasinīga alternatīva.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie