[{"data":1,"prerenderedAt":2853},["ShallowReactive",2],{"/blog/whats-new-in-git-2-56-0":3,"navigation-en-us":2094,"banner-en-us":2525,"footer-en-us":2535,"blog-post-authors-en-us-Karthik Nayak":2796,"blog-related-posts-en-us-whats-new-in-git-2-56-0":2811,"blog-share-wrapper-en-us":2834,"next-steps-en-us":2844},{"id":4,"title":5,"authors":6,"body":8,"category":2074,"date":2075,"description":2076,"extension":2077,"externalUrl":2078,"faq":2078,"featured":2079,"heroImage":2080,"meta":2081,"navigation":437,"path":2082,"seo":2083,"slug":2086,"stem":2087,"tags":2088,"template":2092,"updatedDate":2078,"__hash__":2093},"blogPosts/en-us/blog/whats-new-in-git-2-56-0.md","What's new in Git 2.56.0?",[7],"Karthik Nayak",{"type":9,"value":10,"toc":2058},"minimark",[11,28,31,81,85,94,105,108,119,122,131,134,189,192,195,200,222,232,274,280,298,301,304,348,359,366,475,478,555,576,612,634,645,648,670,848,856,870,873,882,887,908,1030,1033,1058,1062,1075,1082,1152,1158,1201,1225,1229,1248,1334,1342,1365,1369,1389,1416,1419,1427,1593,1610,1803,1820,1922,1935,1938,1951,1954,2022,2025,2036,2040,2054],[12,13,14,15,21,22,27],"p",{},"The Git project recently released ",[16,17,20],"a",{"href":18,"rel":19},"https://lore.kernel.org/git/xmqqpkxxmgxh.fsf@gitster.g/T/#u",[],"Git 2.56.0",". Let's look at some of the highlights of the release, including contributions from the ",[16,23,26],{"href":24,"rel":25},"https://handbook.gitlab.com/handbook/engineering/infrastructure-platforms/tenant-scale/git/",[],"Git team"," at GitLab.",[12,29,30],{},"What's covered:",[32,33,34,41,51,57,63,69,75],"ul",{},[35,36,37],"li",{},[16,38,40],{"href":39},"#git-merge-2026-and-schedule-for-git-30","Git Merge 2026 and schedule for Git 3.0",[35,42,43],{},[16,44,46,47],{"href":45},"#git-history1-learns-drop","git-history(1) learns ",[48,49,50],"code",{},"drop",[35,52,53],{},[16,54,56],{"href":55},"#git-branch1-learns-to-delete-merged-branches","git-branch(1) learns to delete merged branches",[35,58,59],{},[16,60,62],{"href":61},"#git-refs1-learns-to-modify-refs","git-refs(1) learns to modify refs",[35,64,65],{},[16,66,68],{"href":67},"#google-summer-of-code-2026","Google Summer of Code 2026",[35,70,71],{},[16,72,74],{"href":73},"#linearizing-history-with-git-replay1","Linearizing history with git-replay(1)",[35,76,77],{},[16,78,80],{"href":79},"#making-the-object-database-pluggable","Making the object database pluggable",[82,83,40],"h2",{"id":84},"git-merge-2026-and-schedule-for-git-30",[12,86,87,88,93],{},"This release cycle coincided with ",[16,89,92],{"href":90,"rel":91},"https://git-merge.com/",[],"Git Merge 2026"," held in Lisbon. The conference stretched over three days, consisting of a JJ Con day, a Git Talks day, and an unconference and Git Contributor Summit day. The Git talks will be available soon.",[12,95,96,97,104],{},"One of the main discussion points for the Git Contributor Summit was planning around the release of Git 3.0. The ",[16,98,101],{"href":99,"rel":100},"https://git-scm.com/docs/BreakingChanges",[],[48,102,103],{},"Documentation/BreakingChanges.adoc"," document in Git discusses the changes expected in 3.0, with the caveat that \"There is no planned release date for this breaking version yet\". That changed with the discussions held at the contributor summit.",[12,106,107],{},"The biggest changes scheduled for Git 3.0 include:",[32,109,110,113,116],{},[35,111,112],{},"SHA-256 as the default object hash format",[35,114,115],{},"reftable as the default reference storage format",[35,117,118],{},"Rust no longer being an optional dependency",[12,120,121],{},"While the code for these changes is available in current Git versions, they have varied levels of support in the larger Git ecosystem, which includes Git libraries, applications and forges. If the ecosystem doesn't support the changes, users would be left in limbo, where some tools support the new features while others fail.",[12,123,124,125,130],{},"For SHA-256 specifically, one of the biggest drawbacks was support on the forges. GitLab has been supporting SHA-256 ",[16,126,129],{"href":127,"rel":128},"https://about.gitlab.com/blog/gitlab-now-supports-sha256-repositories/",[],"since a year ago",", while GitHub has announced a private beta at Git Merge with general availability following in a few months.",[12,132,133],{},"With that in mind, the discussions at the summit led to the following schedule for Git 3.0:",[135,136,137,150],"table",{},[138,139,140],"thead",{},[141,142,143,147],"tr",{},[144,145,146],"th",{},"Release",[144,148,149],{},"Timing",[151,152,153,165,175],"tbody",{},[141,154,155,162],{},[156,157,158],"td",{},[159,160,161],"strong",{},"2.56",[156,163,164],{},"September 2026 (this release)",[141,166,167,172],{},[156,168,169],{},[159,170,171],{},"2.98",[156,173,174],{},"December 2026",[141,176,177,186],{},[156,178,179,182,183],{},[159,180,181],{},"2.99"," and ",[159,184,185],{},"3.0",[156,187,188],{},"Spring 2027",[12,190,191],{},"The plan is to jump straight from 2.56 to 2.98; this significant jump serves as an indication to both downstream maintainers and consumers that a big change is coming. After that, both 2.99 and 3.0 will be shipped together, the only difference being that Git 3.0 will have the breaking changes feature flag flipped. This keeps feature parity between the 2.99 and 3.0 releases, and keeps the changes in 3.0 small and limited.",[12,193,194],{},"The 2.99 release will be an LTS release so that platforms without a Rust toolchain continue to get updates. As usual, the discussion on details will follow on the mailing list.",[82,196,46,198],{"id":197},"git-history1-learns-drop",[48,199,50],{},[12,201,202,203,208,209,212,213,218,219,221],{},"In our ",[16,204,207],{"href":205,"rel":206},"https://about.gitlab.com/blog/whats-new-in-git-2-55-0/#git-history1-learns-fixup",[],"blog post for Git 2.55",", we learned about the ",[48,210,211],{},"fixup"," subcommand for ",[16,214,217],{"href":215,"rel":216},"https://git-scm.com/docs/git-history",[],"git-history(1)",". In this release, the command learns a new ",[48,220,50],{}," subcommand.",[12,223,224,225,228,229,231],{},"If you've ever wanted to delete an existing commit, the flow has been to use ",[48,226,227],{},"git rebase -i"," and then interactively mark individual commits to drop via an editor. The new ",[48,230,50],{}," subcommand allows users to do this in one single line.",[233,234,239],"pre",{"className":235,"code":236,"language":237,"meta":238,"style":238},"language-shell shiki shiki-themes github-light","$ git history drop \u003Ccommit>\n","shell","",[48,240,241],{"__ignoreMap":238},[242,243,246,250,254,257,260,264,267,271],"span",{"class":244,"line":245},"line",1,[242,247,249],{"class":248},"s7eDp","$",[242,251,253],{"class":252},"sYBdl"," git",[242,255,256],{"class":252}," history",[242,258,259],{"class":252}," drop",[242,261,263],{"class":262},"sD7c4"," \u003C",[242,265,266],{"class":252},"commi",[242,268,270],{"class":269},"sgsFI","t",[242,272,273],{"class":262},">\n",[12,275,276,277,279],{},"The provided commit is then removed, and its descendants are rebased on top of its parent. Like other subcommands within ",[48,278,217],{},", any changes made update all branches that are descendants of the original commit to point to the rewritten commit.",[12,281,282],{},[283,284,285,286,291,292,297],"em",{},"This ",[16,287,290],{"href":288,"rel":289},"https://gitlab.com/git-scm/git/-/commit/d11b348f7840c7ae4aba5d273ff56c813475a88e",[],"patch"," was submitted by ",[16,293,296],{"href":294,"rel":295},"https://gitlab.com/pks-gitlab",[],"Patrick Steinhardt",".",[82,299,56],{"id":300},"git-branch1-learns-to-delete-merged-branches",[12,302,303],{},"To clean up merged branches, I've generally used some variation of the command:",[233,305,307],{"className":235,"code":306,"language":237,"meta":238,"style":238},"$ git branch --merged main | grep -v main | xargs git branch --delete\n",[48,308,309],{"__ignoreMap":238},[242,310,311,313,315,318,322,325,328,331,334,336,338,341,343,345],{"class":244,"line":245},[242,312,249],{"class":248},[242,314,253],{"class":252},[242,316,317],{"class":252}," branch",[242,319,321],{"class":320},"sYu0t"," --merged",[242,323,324],{"class":252}," main",[242,326,327],{"class":262}," |",[242,329,330],{"class":248}," grep",[242,332,333],{"class":320}," -v",[242,335,324],{"class":252},[242,337,327],{"class":262},[242,339,340],{"class":248}," xargs",[242,342,253],{"class":252},[242,344,317],{"class":252},[242,346,347],{"class":320}," --delete\n",[12,349,350,351,354,355,358],{},"Unfortunately, this only deletes branches merged into the branch provided; it doesn't catch branches forked from ",[48,352,353],{},"main"," and merged into ",[48,356,357],{},"origin/main",". This release adds two new flags to help with this.",[12,360,361,362,365],{},"First, the ",[48,363,364],{},"--forked"," flag, which is a listing filter used to show branches whose configured upstream matches the provided ref, remote name or branch.",[233,367,369],{"className":235,"code":368,"language":237,"meta":238,"style":238},"$ git switch --create feature-a origin/main\nSwitched to a new branch 'feature-a'\nbranch 'feature-a' set up to track 'origin/main'.\n\n$ git branch --forked origin\n  feature-a\n  feature-b\n* main\n",[48,370,371,389,409,432,439,454,460,466],{"__ignoreMap":238},[242,372,373,375,377,380,383,386],{"class":244,"line":245},[242,374,249],{"class":248},[242,376,253],{"class":252},[242,378,379],{"class":252}," switch",[242,381,382],{"class":320}," --create",[242,384,385],{"class":252}," feature-a",[242,387,388],{"class":252}," origin/main\n",[242,390,392,395,398,401,404,406],{"class":244,"line":391},2,[242,393,394],{"class":248},"Switched",[242,396,397],{"class":252}," to",[242,399,400],{"class":252}," a",[242,402,403],{"class":252}," new",[242,405,317],{"class":252},[242,407,408],{"class":252}," 'feature-a'\n",[242,410,412,415,418,421,424,426,429],{"class":244,"line":411},3,[242,413,414],{"class":248},"branch",[242,416,417],{"class":252}," 'feature-a'",[242,419,420],{"class":252}," set",[242,422,423],{"class":252}," up",[242,425,397],{"class":252},[242,427,428],{"class":252}," track",[242,430,431],{"class":252}," 'origin/main'.\n",[242,433,435],{"class":244,"line":434},4,[242,436,438],{"emptyLinePlaceholder":437},true,"\n",[242,440,442,444,446,448,451],{"class":244,"line":441},5,[242,443,249],{"class":248},[242,445,253],{"class":252},[242,447,317],{"class":252},[242,449,450],{"class":320}," --forked",[242,452,453],{"class":252}," origin\n",[242,455,457],{"class":244,"line":456},6,[242,458,459],{"class":248},"  feature-a\n",[242,461,463],{"class":244,"line":462},7,[242,464,465],{"class":248},"  feature-b\n",[242,467,469,472],{"class":244,"line":468},8,[242,470,471],{"class":262},"*",[242,473,474],{"class":269}," main\n",[12,476,477],{},"This shows the branches which started from a particular integration branch. We can also see the status of each of the branches:",[233,479,481],{"className":235,"code":480,"language":237,"meta":238,"style":238},"$ git branch -vv\n  feature-a b3ebf58 [origin/main: behind 1] Add feature A\n  feature-b 34c0403 [origin/main: ahead 1, behind 1] Add feature B\n* main      230a3b0 [origin/main] Document the parser\n",[48,482,483,494,520,548],{"__ignoreMap":238},[242,484,485,487,489,491],{"class":244,"line":245},[242,486,249],{"class":248},[242,488,253],{"class":252},[242,490,317],{"class":252},[242,492,493],{"class":320}," -vv\n",[242,495,496,499,502,505,508,511,514,517],{"class":244,"line":391},[242,497,498],{"class":248},"  feature-a",[242,500,501],{"class":252}," b3ebf58",[242,503,504],{"class":269}," [origin/main: ",[242,506,507],{"class":252},"behind",[242,509,510],{"class":252}," 1]",[242,512,513],{"class":252}," Add",[242,515,516],{"class":252}," feature",[242,518,519],{"class":252}," A\n",[242,521,522,525,528,530,533,536,539,541,543,545],{"class":244,"line":411},[242,523,524],{"class":248},"  feature-b",[242,526,527],{"class":252}," 34c0403",[242,529,504],{"class":269},[242,531,532],{"class":252},"ahead",[242,534,535],{"class":252}," 1,",[242,537,538],{"class":252}," behind",[242,540,510],{"class":252},[242,542,513],{"class":252},[242,544,516],{"class":252},[242,546,547],{"class":252}," B\n",[242,549,550,552],{"class":244,"line":434},[242,551,471],{"class":262},[242,553,554],{"class":269}," main      230a3b0 [origin/main] Document the parser\n",[12,556,557,558,561,562,564,565,567,568,571,572,575],{},"Here ",[48,559,560],{},"feature-a"," is behind ",[48,563,357],{},", meaning that the branch was merged into ",[48,566,357],{},", while ",[48,569,570],{},"feature-b"," still needs to be. To plug this usability gap, the new option, ",[48,573,574],{},"--delete-merged",", comes into play. It deletes all branches whose tips are reachable from their configured upstreams, effectively removing every feature branch that was merged into the integration branch.",[233,577,579],{"className":235,"code":578,"language":237,"meta":238,"style":238},"$ git branch --delete-merged origin\nDeleted branch feature-a (was b3ebf58).\n",[48,580,581,594],{"__ignoreMap":238},[242,582,583,585,587,589,592],{"class":244,"line":245},[242,584,249],{"class":248},[242,586,253],{"class":252},[242,588,317],{"class":252},[242,590,591],{"class":320}," --delete-merged",[242,593,453],{"class":252},[242,595,596,599,601,603,606,609],{"class":244,"line":391},[242,597,598],{"class":248},"Deleted",[242,600,317],{"class":252},[242,602,385],{"class":252},[242,604,605],{"class":269}," (was ",[242,607,608],{"class":252},"b3ebf58",[242,610,611],{"class":269},").\n",[613,614,615],"blockquote",{},[12,616,617,620,621,624,625,628,629,297],{},[159,618,619],{},"Tip:"," These options rely on your branches tracking an integration branch. If you usually branch off your local integration branch instead, take a look at the ",[48,622,623],{},"inherit"," setting for the ",[48,626,627],{},"branch.autoSetupMerge"," ",[16,630,633],{"href":631,"rel":632},"https://git-scm.com/docs/git-config#Documentation/git-config.txt-inherit",[],"configuration",[12,635,636],{},[283,637,638,639,644],{},"This feature was ",[16,640,643],{"href":641,"rel":642},"https://lore.kernel.org/git/pull.2285.v25.git.git.1785939877.gitgitgadget@gmail.com/",[],"submitted"," by Harald Nordgren.",[82,646,62],{"id":647},"git-refs1-learns-to-modify-refs",[12,649,650,655,656,659,660,659,663,182,666,669],{},[16,651,654],{"href":652,"rel":653},"https://git-scm.com/docs/git-refs",[],"git-refs(1)",", introduced in Git 2.46, has been the new home for reference-related operations. Since its introduction it has grown several subcommands already to migrate references between storage backends, perform consistency checks, list existing references or check for existence of a reference. In this release, the command also learns to ",[48,657,658],{},"create",", ",[48,661,662],{},"delete",[48,664,665],{},"update",[48,667,668],{},"rename"," references.",[233,671,673],{"className":235,"code":672,"language":237,"meta":238,"style":238},"$ git refs list\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/branch-d\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/branch-r\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/branch-u\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/main\n\n$ git refs create refs/heads/branch-c main\n$ git refs update refs/heads/branch-u main~1\n$ git refs rename refs/heads/branch-r refs/heads/foo\n$ git refs delete refs/heads/branch-d\n\n$ git refs list\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/branch-c\nc4e9b6bafb7ac9a96c5d9337cd60a0ec6d5a240d commit refs/heads/branch-u\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/foo\n689f6e8164e070ed133d5176806ad69e31d22142 commit refs/heads/main\n",[48,674,675,687,698,707,716,725,729,745,762,780,794,799,810,820,830,839],{"__ignoreMap":238},[242,676,677,679,681,684],{"class":244,"line":245},[242,678,249],{"class":248},[242,680,253],{"class":252},[242,682,683],{"class":252}," refs",[242,685,686],{"class":252}," list\n",[242,688,689,692,695],{"class":244,"line":391},[242,690,691],{"class":248},"689f6e8164e070ed133d5176806ad69e31d22142",[242,693,694],{"class":252}," commit",[242,696,697],{"class":252}," refs/heads/branch-d\n",[242,699,700,702,704],{"class":244,"line":411},[242,701,691],{"class":248},[242,703,694],{"class":252},[242,705,706],{"class":252}," refs/heads/branch-r\n",[242,708,709,711,713],{"class":244,"line":434},[242,710,691],{"class":248},[242,712,694],{"class":252},[242,714,715],{"class":252}," refs/heads/branch-u\n",[242,717,718,720,722],{"class":244,"line":441},[242,719,691],{"class":248},[242,721,694],{"class":252},[242,723,724],{"class":252}," refs/heads/main\n",[242,726,727],{"class":244,"line":456},[242,728,438],{"emptyLinePlaceholder":437},[242,730,731,733,735,737,740,743],{"class":244,"line":462},[242,732,249],{"class":248},[242,734,253],{"class":252},[242,736,683],{"class":252},[242,738,739],{"class":252}," create",[242,741,742],{"class":252}," refs/heads/branch-c",[242,744,474],{"class":252},[242,746,747,749,751,753,756,759],{"class":244,"line":468},[242,748,249],{"class":248},[242,750,253],{"class":252},[242,752,683],{"class":252},[242,754,755],{"class":252}," update",[242,757,758],{"class":252}," refs/heads/branch-u",[242,760,761],{"class":252}," main~1\n",[242,763,765,767,769,771,774,777],{"class":244,"line":764},9,[242,766,249],{"class":248},[242,768,253],{"class":252},[242,770,683],{"class":252},[242,772,773],{"class":252}," rename",[242,775,776],{"class":252}," refs/heads/branch-r",[242,778,779],{"class":252}," refs/heads/foo\n",[242,781,783,785,787,789,792],{"class":244,"line":782},10,[242,784,249],{"class":248},[242,786,253],{"class":252},[242,788,683],{"class":252},[242,790,791],{"class":252}," delete",[242,793,697],{"class":252},[242,795,797],{"class":244,"line":796},11,[242,798,438],{"emptyLinePlaceholder":437},[242,800,802,804,806,808],{"class":244,"line":801},12,[242,803,249],{"class":248},[242,805,253],{"class":252},[242,807,683],{"class":252},[242,809,686],{"class":252},[242,811,813,815,817],{"class":244,"line":812},13,[242,814,691],{"class":248},[242,816,694],{"class":252},[242,818,819],{"class":252}," refs/heads/branch-c\n",[242,821,823,826,828],{"class":244,"line":822},14,[242,824,825],{"class":248},"c4e9b6bafb7ac9a96c5d9337cd60a0ec6d5a240d",[242,827,694],{"class":252},[242,829,715],{"class":252},[242,831,833,835,837],{"class":244,"line":832},15,[242,834,691],{"class":248},[242,836,694],{"class":252},[242,838,779],{"class":252},[242,840,842,844,846],{"class":244,"line":841},16,[242,843,691],{"class":248},[242,845,694],{"class":252},[242,847,724],{"class":252},[12,849,850,851,182,853,855],{},"The ",[48,852,665],{},[48,854,662],{}," subcommands also take an optional expected old value, which validates the previous value before performing the operation.",[12,857,858],{},[283,859,860,861,866,867,297],{},"These patches were ",[16,862,865],{"href":863,"rel":864},"https://lore.kernel.org/git/20260706-pks-refs-writing-subcommands-v4-0-d51f6ce7f830@pks.im/",[],"implemented"," by ",[16,868,296],{"href":294,"rel":869},[],[82,871,68],{"id":872},"google-summer-of-code-2026",[12,874,875,876,881],{},"The release also marks the successful completion of all four ",[16,877,880],{"href":878,"rel":879},"https://summerofcode.withgoogle.com/",[],"Google Summer of Code"," projects, each of which was co-mentored by a GitLab engineer.",[883,884,886],"h3",{"id":885},"add-remote-object-info-command-to-git-cat-file1","Add remote-object-info command to git-cat-file(1)",[12,888,889,890,895,896,899,900,903,904,907],{},"Working in a partial clone allows repositories to operate without downloading every object. Git lazily fetches objects on demand. While ",[16,891,894],{"href":892,"rel":893},"https://git-scm.com/docs/git-cat-file",[],"git-cat-file(1)"," supports reading object-info for a given object hash, it only works by transferring the entire object. Git 2.56 adds a new ",[48,897,898],{},"remote-object-info"," command to ",[16,901,894],{"href":892,"rel":902},[],"'s ",[48,905,906],{},"--batch-command"," mode, which requests only the metadata over v2 of the Git protocol. Consider a blobless clone that contains no blobs at all:",[233,909,911],{"className":235,"code":910,"language":237,"meta":238,"style":238},"$ git rev-parse HEAD:model.weights\n42ec5fc0f485f764cdf0eaa85ab061c055f5f518\n\n$ git cat-file --batch-all-objects --batch-check | grep -c blob\n0\n\n$ echo \"remote-object-info origin 42ec5fc0f485f764cdf0eaa85ab061c055f5f518\" |\n    git cat-file --batch-command\n42ec5fc0f485f764cdf0eaa85ab061c055f5f518 blob 3000000\n\n$ git cat-file --batch-all-objects --batch-check | grep -c blob\n0\n",[48,912,913,925,930,934,959,964,968,981,991,1002,1006,1026],{"__ignoreMap":238},[242,914,915,917,919,922],{"class":244,"line":245},[242,916,249],{"class":248},[242,918,253],{"class":252},[242,920,921],{"class":252}," rev-parse",[242,923,924],{"class":252}," HEAD:model.weights\n",[242,926,927],{"class":244,"line":391},[242,928,929],{"class":248},"42ec5fc0f485f764cdf0eaa85ab061c055f5f518\n",[242,931,932],{"class":244,"line":411},[242,933,438],{"emptyLinePlaceholder":437},[242,935,936,938,940,943,946,949,951,953,956],{"class":244,"line":434},[242,937,249],{"class":248},[242,939,253],{"class":252},[242,941,942],{"class":252}," cat-file",[242,944,945],{"class":320}," --batch-all-objects",[242,947,948],{"class":320}," --batch-check",[242,950,327],{"class":262},[242,952,330],{"class":248},[242,954,955],{"class":320}," -c",[242,957,958],{"class":252}," blob\n",[242,960,961],{"class":244,"line":441},[242,962,963],{"class":248},"0\n",[242,965,966],{"class":244,"line":456},[242,967,438],{"emptyLinePlaceholder":437},[242,969,970,972,975,978],{"class":244,"line":462},[242,971,249],{"class":248},[242,973,974],{"class":252}," echo",[242,976,977],{"class":252}," \"remote-object-info origin 42ec5fc0f485f764cdf0eaa85ab061c055f5f518\"",[242,979,980],{"class":262}," |\n",[242,982,983,986,988],{"class":244,"line":468},[242,984,985],{"class":248},"    git",[242,987,942],{"class":252},[242,989,990],{"class":320}," --batch-command\n",[242,992,993,996,999],{"class":244,"line":764},[242,994,995],{"class":248},"42ec5fc0f485f764cdf0eaa85ab061c055f5f518",[242,997,998],{"class":252}," blob",[242,1000,1001],{"class":320}," 3000000\n",[242,1003,1004],{"class":244,"line":782},[242,1005,438],{"emptyLinePlaceholder":437},[242,1007,1008,1010,1012,1014,1016,1018,1020,1022,1024],{"class":244,"line":796},[242,1009,249],{"class":248},[242,1011,253],{"class":252},[242,1013,942],{"class":252},[242,1015,945],{"class":320},[242,1017,948],{"class":320},[242,1019,327],{"class":262},[242,1021,330],{"class":248},[242,1023,955],{"class":320},[242,1025,958],{"class":252},[242,1027,1028],{"class":244,"line":801},[242,1029,963],{"class":248},[12,1031,1032],{},"This allows us to obtain the size of the blob without transferring the blob itself: three million bytes of network bandwidth saved.",[12,1034,1035],{},[283,1036,850,1037,1042,1043,1048,1049,182,1053,297],{},[16,1038,1041],{"href":1039,"rel":1040},"https://summerofcode.withgoogle.com/programs/2026/projects/752yzmwm",[],"project"," was worked on by ",[16,1044,1047],{"href":1045,"rel":1046},"https://pablosabater.dev/",[],"Pablo Sabater",", continuing previous work started by Eric Ju and Calvin Wan, and mentored by ",[16,1050,7],{"href":1051,"rel":1052},"https://gitlab.com/knayakgl",[],[16,1054,1057],{"href":1055,"rel":1056},"https://chand-ra.github.io/",[],"Chandra Pratap",[883,1059,1061],{"id":1060},"improve-disk-space-recovery-for-partial-clones","Improve disk space recovery for partial clones",[12,1063,1064,1065,1068,1069,1074],{},"Partial clones save considerable disk space by only lazily fetching blobs. With time, those fetches accumulate and the repository grows, losing the advantage. This GSoC project involved adding a new ",[48,1066,1067],{},"--drop-filtered"," option to ",[16,1070,1073],{"href":1071,"rel":1072},"https://git-scm.com/docs/git-repack",[],"git-repack(1)"," which finds large promisor blobs above the given filter and removes them locally.",[12,1076,1077,1078,1081],{},"Here is a filtered clone of a repository whose history contains a 3MB blob. Fresh out of ",[48,1079,1080],{},"git clone",", the repository size is small, but just looking at the blob fetches it onto the local disk:",[233,1083,1085],{"className":235,"code":1084,"language":237,"meta":238,"style":238},"$ du -sh .git\n144K    .git\n\n$ git cat-file -s b8086a678595c9fce29d980f7a12ca069b466f6c\n3000000\n\n$ du -sh .git\n3.1M    .git\n",[48,1086,1087,1100,1108,1112,1126,1131,1135,1145],{"__ignoreMap":238},[242,1088,1089,1091,1094,1097],{"class":244,"line":245},[242,1090,249],{"class":248},[242,1092,1093],{"class":252}," du",[242,1095,1096],{"class":320}," -sh",[242,1098,1099],{"class":252}," .git\n",[242,1101,1102,1105],{"class":244,"line":391},[242,1103,1104],{"class":248},"144K",[242,1106,1107],{"class":252},"    .git\n",[242,1109,1110],{"class":244,"line":411},[242,1111,438],{"emptyLinePlaceholder":437},[242,1113,1114,1116,1118,1120,1123],{"class":244,"line":434},[242,1115,249],{"class":248},[242,1117,253],{"class":252},[242,1119,942],{"class":252},[242,1121,1122],{"class":320}," -s",[242,1124,1125],{"class":252}," b8086a678595c9fce29d980f7a12ca069b466f6c\n",[242,1127,1128],{"class":244,"line":441},[242,1129,1130],{"class":248},"3000000\n",[242,1132,1133],{"class":244,"line":456},[242,1134,438],{"emptyLinePlaceholder":437},[242,1136,1137,1139,1141,1143],{"class":244,"line":462},[242,1138,249],{"class":248},[242,1140,1093],{"class":252},[242,1142,1096],{"class":320},[242,1144,1099],{"class":252},[242,1146,1147,1150],{"class":244,"line":468},[242,1148,1149],{"class":248},"3.1M",[242,1151,1107],{"class":252},[12,1153,1154,1155,1157],{},"While this blob isn't required in the working tree, nothing removes it. Running ",[48,1156,1067],{}," drops the blob, allowing Git to lazily refetch it when needed in the future.",[233,1159,1161],{"className":235,"code":1160,"language":237,"meta":238,"style":238},"$ git repack -a -d --filter=blob:limit=1k --drop-filtered\n$ du -sh .git\n156K    .git\n",[48,1162,1163,1184,1194],{"__ignoreMap":238},[242,1164,1165,1167,1169,1172,1175,1178,1181],{"class":244,"line":245},[242,1166,249],{"class":248},[242,1168,253],{"class":252},[242,1170,1171],{"class":252}," repack",[242,1173,1174],{"class":320}," -a",[242,1176,1177],{"class":320}," -d",[242,1179,1180],{"class":320}," --filter=blob:limit=1k",[242,1182,1183],{"class":320}," --drop-filtered\n",[242,1185,1186,1188,1190,1192],{"class":244,"line":391},[242,1187,249],{"class":248},[242,1189,1093],{"class":252},[242,1191,1096],{"class":320},[242,1193,1099],{"class":252},[242,1195,1196,1199],{"class":244,"line":411},[242,1197,1198],{"class":248},"156K",[242,1200,1107],{"class":252},[12,1202,1203],{},[283,1204,285,1205,1042,1209,1214,1215,182,1220,297],{},[16,1206,1041],{"href":1207,"rel":1208},"https://summerofcode.withgoogle.com/programs/2026/projects/hs14IFAn",[],[16,1210,1213],{"href":1211,"rel":1212},"https://siddharth.shrimali.info/",[],"Siddharth Shrimali"," and mentored by ",[16,1216,1219],{"href":1217,"rel":1218},"https://gitlab.com/chriscool",[],"Christian Couder",[16,1221,1224],{"href":1222,"rel":1223},"https://gitlab.com/edith007",[],"Siddharth Asthana",[883,1226,1228],{"id":1227},"improve-the-new-git-repo-command","Improve the new git repo command",[12,1230,850,1231,1236,1237,1240,1241,182,1244,1247],{},[16,1232,1235],{"href":1233,"rel":1234},"https://git-scm.com/docs/git-repo",[],"git-repo(1)"," command retrieves information about the repository. As part of the GSoC project, the ",[48,1238,1239],{},"git repo info"," subcommand was extended with ",[48,1242,1243],{},"path.gitdir",[48,1245,1246],{},"path.commondir",", each available in both absolute and relative forms.",[233,1249,1251],{"className":235,"code":1250,"language":237,"meta":238,"style":238},"$ git repo info --all\nlayout.bare=false\nlayout.shallow=false\nobject.format=sha1\npath.commondir.absolute=/home/karthik/code/git/.git\npath.commondir.relative=.git\npath.gitdir.absolute=/home/karthik/code/git/.git\npath.gitdir.relative=.git\nreferences.format=reftable\n",[48,1252,1253,1268,1279,1288,1296,1304,1312,1319,1326],{"__ignoreMap":238},[242,1254,1255,1257,1259,1262,1265],{"class":244,"line":245},[242,1256,249],{"class":248},[242,1258,253],{"class":252},[242,1260,1261],{"class":252}," repo",[242,1263,1264],{"class":252}," info",[242,1266,1267],{"class":320}," --all\n",[242,1269,1270,1273,1276],{"class":244,"line":391},[242,1271,1272],{"class":248},"layout.bare",[242,1274,1275],{"class":252},"=",[242,1277,1278],{"class":320},"false\n",[242,1280,1281,1284,1286],{"class":244,"line":411},[242,1282,1283],{"class":248},"layout.shallow",[242,1285,1275],{"class":252},[242,1287,1278],{"class":320},[242,1289,1290,1293],{"class":244,"line":434},[242,1291,1292],{"class":248},"object.format",[242,1294,1295],{"class":252},"=sha1\n",[242,1297,1298,1301],{"class":244,"line":441},[242,1299,1300],{"class":248},"path.commondir.absolute",[242,1302,1303],{"class":252},"=/home/karthik/code/git/.git\n",[242,1305,1306,1309],{"class":244,"line":456},[242,1307,1308],{"class":248},"path.commondir.relative",[242,1310,1311],{"class":252},"=.git\n",[242,1313,1314,1317],{"class":244,"line":462},[242,1315,1316],{"class":248},"path.gitdir.absolute",[242,1318,1303],{"class":252},[242,1320,1321,1324],{"class":244,"line":468},[242,1322,1323],{"class":248},"path.gitdir.relative",[242,1325,1311],{"class":252},[242,1327,1328,1331],{"class":244,"line":764},[242,1329,1330],{"class":248},"references.format",[242,1332,1333],{"class":252},"=reftable\n",[12,1335,1336,1337,297],{},"Further patches to add more path based information are currently on the ",[16,1338,1341],{"href":1339,"rel":1340},"https://lore.kernel.org/git/20260911144519.1011780-1-jayatheerthkulkarni2005@gmail.com/",[],"mailing list",[12,1343,1344],{},[283,1345,285,1346,1042,1350,1214,1355,182,1360,297],{},[16,1347,1041],{"href":1348,"rel":1349},"https://summerofcode.withgoogle.com/programs/2026/projects/O1nF3zMT",[],[16,1351,1354],{"href":1352,"rel":1353},"https://jayatheerth.com/",[],"K Jayatheerth",[16,1356,1359],{"href":1357,"rel":1358},"https://gitlab.com/justintobler",[],"Justin Tobler",[16,1361,1364],{"href":1362,"rel":1363},"https://lucasoshiro.github.io/en/",[],"Lucas Seiki Oshiro",[883,1366,1368],{"id":1367},"reduce-gits-global-state","Reduce Git's global state",[12,1370,1371,1372,1375,1376,1379,1380,1383,1384,1386,1387,297],{},"Git's core codebase still heavily relies on global state, from the famous ",[48,1373,1374],{},"the_repository"," variable to numerous config options. This acts as a blocker to the libification efforts in Git. This project moves some of the global config variables into a new ",[48,1377,1378],{},"repo_config_values"," struct on ",[48,1381,1382],{},"struct repository",". Call sites get updated to pass the ",[48,1385,1382],{}," explicitly instead of using the global ",[48,1388,1374],{},[12,1390,1391],{},[283,1392,285,1393,1042,1397,1402,1403,659,1406,182,1411,297],{},[16,1394,1041],{"href":1395,"rel":1396},"https://summerofcode.withgoogle.com/programs/2026/projects/Lx1PmL4k",[],[16,1398,1401],{"href":1399,"rel":1400},"https://malon7782.github.io/gsoc-blog-2026/",[],"Tian Yuchen",", mentored by ",[16,1404,1219],{"href":1217,"rel":1405},[],[16,1407,1410],{"href":1408,"rel":1409},"https://ayu-ch.github.io/",[],"Ayush Chandekar",[16,1412,1415],{"href":1413,"rel":1414},"https://cloobtech.hashnode.dev/",[],"Bello Caleb Olamide",[82,1417,74],{"id":1418},"linearizing-history-with-git-replay1",[12,1420,1421,1426],{},[16,1422,1425],{"href":1423,"rel":1424},"https://git-scm.com/docs/git-replay",[],"git-replay(1)"," is an experimental Git command which allows server-side rebases and doesn't require a working tree to operate:",[233,1428,1430],{"className":235,"code":1429,"language":237,"meta":238,"style":238},"$ git log --oneline --graph --all\n* 1756840 (main) main: unrelated upstream work\n| * 286e7f1 (topic) topic: add two\n| * 4324bcd topic: add one\n|/\n* 9497867 Initial commit\n\n$ git replay --ref-action=print --onto main topic\nupdate refs/heads/topic a144de2fc13ac40c8a481052be5e4d42071c4908 286e7f186f229ac4dd5ecb68a372951003f16224\n\n$ git log --oneline --graph a144de2fc13ac40c8a481052be5e4d42071c4908\n* a144de2 topic: add two\n* 6422f37 topic: add one\n* 1756840 (main) main: unrelated upstream work\n* 9497867 Initial commit\n",[48,1431,1432,1449,1461,1475,1493,1500,1507,1511,1531,1544,1548,1563,1570,1577,1587],{"__ignoreMap":238},[242,1433,1434,1436,1438,1441,1444,1447],{"class":244,"line":245},[242,1435,249],{"class":248},[242,1437,253],{"class":252},[242,1439,1440],{"class":252}," log",[242,1442,1443],{"class":320}," --oneline",[242,1445,1446],{"class":320}," --graph",[242,1448,1267],{"class":320},[242,1450,1451,1453,1456,1458],{"class":244,"line":391},[242,1452,471],{"class":262},[242,1454,1455],{"class":269}," 1756840 (",[242,1457,353],{"class":248},[242,1459,1460],{"class":269},") main: unrelated upstream work\n",[242,1462,1463,1466,1469,1472],{"class":244,"line":411},[242,1464,1465],{"class":262},"|",[242,1467,1468],{"class":248}," *",[242,1470,1471],{"class":252}," 286e7f1",[242,1473,1474],{"class":269}," (topic) topic: add two\n",[242,1476,1477,1479,1481,1484,1487,1490],{"class":244,"line":434},[242,1478,1465],{"class":262},[242,1480,1468],{"class":248},[242,1482,1483],{"class":252}," 4324bcd",[242,1485,1486],{"class":252}," topic:",[242,1488,1489],{"class":252}," add",[242,1491,1492],{"class":252}," one\n",[242,1494,1495,1497],{"class":244,"line":441},[242,1496,1465],{"class":262},[242,1498,1499],{"class":248},"/\n",[242,1501,1502,1504],{"class":244,"line":456},[242,1503,471],{"class":262},[242,1505,1506],{"class":269}," 9497867 Initial commit\n",[242,1508,1509],{"class":244,"line":462},[242,1510,438],{"emptyLinePlaceholder":437},[242,1512,1513,1515,1517,1520,1523,1526,1528],{"class":244,"line":468},[242,1514,249],{"class":248},[242,1516,253],{"class":252},[242,1518,1519],{"class":252}," replay",[242,1521,1522],{"class":320}," --ref-action=print",[242,1524,1525],{"class":320}," --onto",[242,1527,324],{"class":252},[242,1529,1530],{"class":252}," topic\n",[242,1532,1533,1535,1538,1541],{"class":244,"line":764},[242,1534,665],{"class":248},[242,1536,1537],{"class":252}," refs/heads/topic",[242,1539,1540],{"class":252}," a144de2fc13ac40c8a481052be5e4d42071c4908",[242,1542,1543],{"class":252}," 286e7f186f229ac4dd5ecb68a372951003f16224\n",[242,1545,1546],{"class":244,"line":782},[242,1547,438],{"emptyLinePlaceholder":437},[242,1549,1550,1552,1554,1556,1558,1560],{"class":244,"line":796},[242,1551,249],{"class":248},[242,1553,253],{"class":252},[242,1555,1440],{"class":252},[242,1557,1443],{"class":320},[242,1559,1446],{"class":320},[242,1561,1562],{"class":252}," a144de2fc13ac40c8a481052be5e4d42071c4908\n",[242,1564,1565,1567],{"class":244,"line":801},[242,1566,471],{"class":262},[242,1568,1569],{"class":269}," a144de2 topic: add two\n",[242,1571,1572,1574],{"class":244,"line":812},[242,1573,471],{"class":262},[242,1575,1576],{"class":269}," 6422f37 topic: add one\n",[242,1578,1579,1581,1583,1585],{"class":244,"line":822},[242,1580,471],{"class":262},[242,1582,1455],{"class":269},[242,1584,353],{"class":248},[242,1586,1460],{"class":269},[242,1588,1589,1591],{"class":244,"line":832},[242,1590,471],{"class":262},[242,1592,1506],{"class":269},[12,1594,1595,1596,1599,1600,1603,1604,1606,1607,1609],{},"Until now there was one issue: the command didn't work with commit ranges containing merge commits. Consider a scenario where you're working on a ",[48,1597,1598],{},"feature"," branch, and a ",[48,1601,1602],{},"bugfix"," which lands on ",[48,1605,353],{}," is also merged into your feature branch. This causes the ",[48,1608,1598],{}," branch to contain a merge commit as shown:",[233,1611,1613],{"className":235,"code":1612,"language":237,"meta":238,"style":238},"$ git log --graph --oneline --decorate --all\n* cb996b6 (HEAD -> feature) feature: handle the empty-input edge case\n*   4f76f3d Merge branch 'bugfix' into feature\n|\\\n| * 4959734 (main, bugfix) bugfix: do not crash on null input\n* | 829b62c feature: add parser tests\n* | 7fd60db feature: add the parser\n|/\n* 9497867 Initial commit\n\n$ git replay --onto main main..feature\nfatal: replaying merge commits is not supported yet!\n",[48,1614,1615,1632,1653,1666,1673,1708,1728,1747,1753,1759,1763,1778],{"__ignoreMap":238},[242,1616,1617,1619,1621,1623,1625,1627,1630],{"class":244,"line":245},[242,1618,249],{"class":248},[242,1620,253],{"class":252},[242,1622,1440],{"class":252},[242,1624,1446],{"class":320},[242,1626,1443],{"class":320},[242,1628,1629],{"class":320}," --decorate",[242,1631,1267],{"class":320},[242,1633,1634,1636,1639,1642,1645,1648,1650],{"class":244,"line":391},[242,1635,471],{"class":262},[242,1637,1638],{"class":269}," cb996b6 (",[242,1640,1641],{"class":248},"HEAD",[242,1643,1644],{"class":269}," -",[242,1646,1647],{"class":262},">",[242,1649,516],{"class":252},[242,1651,1652],{"class":269},") feature: handle the empty-input edge case\n",[242,1654,1655,1657,1660,1663],{"class":244,"line":411},[242,1656,471],{"class":262},[242,1658,1659],{"class":269},"   4f76f3d Merge branch ",[242,1661,1662],{"class":252},"'bugfix'",[242,1664,1665],{"class":269}," into feature\n",[242,1667,1668,1670],{"class":244,"line":434},[242,1669,1465],{"class":262},[242,1671,1672],{"class":320},"\\\n",[242,1674,1675,1677,1679,1682,1685,1687,1690,1693,1696,1699,1702,1705],{"class":244,"line":441},[242,1676,1465],{"class":262},[242,1678,1468],{"class":248},[242,1680,1681],{"class":320}," 4959734",[242,1683,1684],{"class":269}," (main, ",[242,1686,1602],{"class":252},[242,1688,1689],{"class":269},") bugfix: ",[242,1691,1692],{"class":262},"do",[242,1694,1695],{"class":248}," not",[242,1697,1698],{"class":252}," crash",[242,1700,1701],{"class":252}," on",[242,1703,1704],{"class":252}," null",[242,1706,1707],{"class":252}," input\n",[242,1709,1710,1712,1714,1717,1720,1722,1725],{"class":244,"line":456},[242,1711,471],{"class":262},[242,1713,327],{"class":262},[242,1715,1716],{"class":248}," 829b62c",[242,1718,1719],{"class":252}," feature:",[242,1721,1489],{"class":252},[242,1723,1724],{"class":252}," parser",[242,1726,1727],{"class":252}," tests\n",[242,1729,1730,1732,1734,1737,1739,1741,1744],{"class":244,"line":462},[242,1731,471],{"class":262},[242,1733,327],{"class":262},[242,1735,1736],{"class":248}," 7fd60db",[242,1738,1719],{"class":252},[242,1740,1489],{"class":252},[242,1742,1743],{"class":252}," the",[242,1745,1746],{"class":252}," parser\n",[242,1748,1749,1751],{"class":244,"line":468},[242,1750,1465],{"class":262},[242,1752,1499],{"class":248},[242,1754,1755,1757],{"class":244,"line":764},[242,1756,471],{"class":262},[242,1758,1506],{"class":269},[242,1760,1761],{"class":244,"line":782},[242,1762,438],{"emptyLinePlaceholder":437},[242,1764,1765,1767,1769,1771,1773,1775],{"class":244,"line":796},[242,1766,249],{"class":248},[242,1768,253],{"class":252},[242,1770,1519],{"class":252},[242,1772,1525],{"class":320},[242,1774,324],{"class":252},[242,1776,1777],{"class":252}," main..feature\n",[242,1779,1780,1783,1786,1789,1792,1795,1797,1800],{"class":244,"line":801},[242,1781,1782],{"class":248},"fatal:",[242,1784,1785],{"class":252}," replaying",[242,1787,1788],{"class":252}," merge",[242,1790,1791],{"class":252}," commits",[242,1793,1794],{"class":252}," is",[242,1796,1695],{"class":252},[242,1798,1799],{"class":252}," supported",[242,1801,1802],{"class":252}," yet!\n",[12,1804,1805,1806,1808,1809,1812,1813,1816,1817,297],{},"As you can see, ",[48,1807,1425],{}," refuses to rebase the branch due to the existing merge commit. In Git 2.56 we now have ",[48,1810,1811],{},"--linearize",", which is similar to the already default ",[48,1814,1815],{},"--no-rebase-merges"," option in ",[48,1818,1819],{},"git-rebase(1)",[233,1821,1823],{"className":235,"code":1822,"language":237,"meta":238,"style":238},"$ git replay --linearize --onto main main..feature\n$ git log --graph --oneline --decorate --all\n* da8df6e (HEAD -> feature) feature: handle the empty-input edge case\n* f68889f feature: add parser tests\n* f13885b feature: add the parser\n* 4959734 (main, bugfix) bugfix: do not crash on null input\n* 9497867 Initial commit\n",[48,1824,1825,1842,1858,1875,1882,1889,1916],{"__ignoreMap":238},[242,1826,1827,1829,1831,1833,1836,1838,1840],{"class":244,"line":245},[242,1828,249],{"class":248},[242,1830,253],{"class":252},[242,1832,1519],{"class":252},[242,1834,1835],{"class":320}," --linearize",[242,1837,1525],{"class":320},[242,1839,324],{"class":252},[242,1841,1777],{"class":252},[242,1843,1844,1846,1848,1850,1852,1854,1856],{"class":244,"line":391},[242,1845,249],{"class":248},[242,1847,253],{"class":252},[242,1849,1440],{"class":252},[242,1851,1446],{"class":320},[242,1853,1443],{"class":320},[242,1855,1629],{"class":320},[242,1857,1267],{"class":320},[242,1859,1860,1862,1865,1867,1869,1871,1873],{"class":244,"line":411},[242,1861,471],{"class":262},[242,1863,1864],{"class":269}," da8df6e (",[242,1866,1641],{"class":248},[242,1868,1644],{"class":269},[242,1870,1647],{"class":262},[242,1872,516],{"class":252},[242,1874,1652],{"class":269},[242,1876,1877,1879],{"class":244,"line":434},[242,1878,471],{"class":262},[242,1880,1881],{"class":269}," f68889f feature: add parser tests\n",[242,1883,1884,1886],{"class":244,"line":441},[242,1885,471],{"class":262},[242,1887,1888],{"class":269}," f13885b feature: add the parser\n",[242,1890,1891,1893,1896,1899,1902,1904,1906,1908,1910,1912,1914],{"class":244,"line":456},[242,1892,471],{"class":262},[242,1894,1895],{"class":269}," 4959734 (",[242,1897,1898],{"class":248},"main,",[242,1900,1901],{"class":252}," bugfix",[242,1903,1689],{"class":269},[242,1905,1692],{"class":262},[242,1907,1695],{"class":248},[242,1909,1698],{"class":252},[242,1911,1701],{"class":252},[242,1913,1704],{"class":252},[242,1915,1707],{"class":252},[242,1917,1918,1920],{"class":244,"line":462},[242,1919,471],{"class":262},[242,1921,1506],{"class":269},[12,1923,1924],{},[283,1925,638,1926,866,1930,297],{},[16,1927,643],{"href":1928,"rel":1929},"https://lore.kernel.org/git/20260831-toon-git-replay-drop-merges-v9-0-61c4232c6f36@iotcl.com/",[],[16,1931,1934],{"href":1932,"rel":1933},"https://gitlab.com/toon",[],"Toon Claes",[82,1936,80],{"id":1937},"making-the-object-database-pluggable",[12,1939,1940,1941,1946,1947,1950],{},"In the ",[16,1942,1945],{"href":1943,"rel":1944},"https://about.gitlab.com/blog/whats-new-in-git-2-54-0/#pluggable-object-databases",[],"2.54 release blog"," we discussed what pluggable object databases are and how they work. As a primer, Git stores its objects (blobs, trees and commits) under ",[48,1948,1949],{},".git/objects"," in two different formats: \"loose\" objects, which are individual files, and \"packfiles\", which consist of objects compacted together. Since there was no abstraction layer, different subsystems reached directly into the storage layer to interact with objects. This changed in 2.54 as an abstraction layer was finally put in place.",[12,1952,1953],{},"This release takes further steps in the direction of providing the required interfaces in the backends to make them truly pluggable, namely:",[32,1955,1956,1965,1977,1994,2000,2006,2016],{},[35,1957,1958,1961,1962,1964],{},[159,1959,1960],{},"Creating the on-disk data structures."," During the initialization of the repository, the ",[48,1963,1949],{}," folder gets created. This responsibility is now moved to individual backends.",[35,1966,1967,1970,1971,1976],{},[159,1968,1969],{},"Consistency checks."," The consistency checks that are part of ",[16,1972,1975],{"href":1973,"rel":1974},"https://git-scm.com/docs/git-fsck",[],"git-fsck(1)"," have now moved into the object source layer, so backends can implement their own consistency checks.",[35,1978,1979,1982,1983,182,1988,1993],{},[159,1980,1981],{},"Housekeeping."," The existing files-backend-specific housekeeping logic that exists as part of ",[16,1984,1987],{"href":1985,"rel":1986},"https://git-scm.com/docs/git-gc",[],"git-gc(1)",[16,1989,1992],{"href":1990,"rel":1991},"https://git-scm.com/docs/git-maintenance",[],"git-maintenance(1)"," (incremental repacking, geometric repacking and pruning) has moved out of the command and into the files object source.",[35,1995,1996,1999],{},[159,1997,1998],{},"Packfile generation."," Git produces packfiles as part of the protocol during the fetch/push commands by making a call to git-pack-objects(1). Now, backends can serve packfiles themselves.",[35,2001,2002,2005],{},[159,2003,2004],{},"Individual object sources."," Following the loose object backend in the last release, the packed object backend has now also been moved into its own object source.",[35,2007,2008,2011,2012,2015],{},[159,2009,2010],{},"Read and write streams."," The separate read and write object streams are now unified under a single ",[48,2013,2014],{},"struct odb_stream",", making it possible to stream arbitrary object types.",[35,2017,2018,2021],{},[159,2019,2020],{},"Using ODB transactions."," git-receive-pack(1) is now adapted to use ODB transactions, which ensures that the command writes objects via the interface without making assumptions about the backend.",[12,2023,2024],{},"And much more. While a multitude of changes landed in this release, from the user's perspective everything stays the same, which is as intended. This provides us at GitLab with the infrastructure required to build Git at scale, by being able to swap out the backend as needed, while doing so as part of the Git community. Stay tuned, as more details are to follow.",[12,2026,2027],{},[283,2028,2029,2030,182,2033,297],{},"These changes were collaboratively submitted by ",[16,2031,1359],{"href":1357,"rel":2032},[],[16,2034,296],{"href":294,"rel":2035},[],[82,2037,2039],{"id":2038},"read-more","Read more",[12,2041,2042,2043,2047,2048,2053],{},"This article highlighted just a few of the contributions made by GitLab and the wider Git community for this latest release. You can learn about these from the ",[16,2044,2046],{"href":18,"rel":2045},[],"official release announcement"," of the Git project. Also, check out our ",[16,2049,2052],{"href":2050,"rel":2051},"https://about.gitlab.com/blog/tags/git/",[],"previous Git release blog posts"," to see other past highlights of contributions from GitLab team members.",[2055,2056,2057],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":238,"searchDepth":391,"depth":391,"links":2059},[2060,2061,2063,2064,2065,2071,2072,2073],{"id":84,"depth":391,"text":40},{"id":197,"depth":391,"text":2062},"git-history(1) learns drop",{"id":300,"depth":391,"text":56},{"id":647,"depth":391,"text":62},{"id":872,"depth":391,"text":68,"children":2066},[2067,2068,2069,2070],{"id":885,"depth":411,"text":886},{"id":1060,"depth":411,"text":1061},{"id":1227,"depth":411,"text":1228},{"id":1367,"depth":411,"text":1368},{"id":1418,"depth":391,"text":74},{"id":1937,"depth":391,"text":80},{"id":2038,"depth":391,"text":2039},"open-source","2026-09-28","Learn about the new features and changes in the latest Git release, including a new git-history(1) drop command, git-refs(1) getting new subcommands to modify refs, linearizing history with git-replay(1), and more.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png",{},"/en-us/blog/whats-new-in-git-2-56-0",{"config":2084,"title":5,"description":2085},{"noIndex":2079},"Learn about the new features and changes in Git 2.56.0, including a new git-history(1) drop command, git-refs(1) getting new subcommands, and more.","whats-new-in-git-2-56-0","en-us/blog/whats-new-in-git-2-56-0",[2089,2090,2091],"open source","git","community","BlogPost","mtPAglI4p22shPwPp8p1838vYBdFSktz08LpXI4Zfi8",{"logo":2095,"freeTrial":2100,"sales":2105,"login":2110,"items":2115,"search":2445,"minimal":2476,"duo":2495,"switchNav":2504,"pricingDeployment":2515},{"config":2096},{"href":2097,"dataGaName":2098,"dataGaLocation":2099},"/","gitlab logo","header",{"text":2101,"config":2102},"Get free trial",{"href":2103,"dataGaName":2104,"dataGaLocation":2099},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":2106,"config":2107},"Request a demo",{"href":2108,"dataGaName":2109,"dataGaLocation":2099},"/request-a-demo/","sales",{"text":2111,"config":2112},"Sign in",{"href":2113,"dataGaName":2114,"dataGaLocation":2099},"https://gitlab.com/users/sign_in/","sign in",[2116,2202,2290,2295,2369,2423],{"text":2117,"left":437,"config":2118,"menu":2120},"Platform",{"dataNavLevelOne":2119},"platform",{"type":2121,"link":2122,"columns":2126,"feature":2191},"lists",{"text":2123,"config":2124},"Explore the Platform",{"href":2125,"dataGaName":2119,"dataGaLocation":2099},"/platform/",[2127,2150,2173],{"title":2128,"items":2129},"Execution & Workflows",[2130,2135,2140,2145],{"text":2131,"config":2132},"CI/CD",{"href":2133,"dataGaLocation":2099,"dataGaName":2134},"/solutions/continuous-integration/","ci/cd",{"text":2136,"config":2137},"Source Code Management",{"href":2138,"dataGaLocation":2099,"dataGaName":2139},"/solutions/source-code-management/","source code management",{"text":2141,"config":2142},"Agile Delivery",{"href":2143,"dataGaLocation":2099,"dataGaName":2144},"/solutions/agile-delivery/","agile delivery",{"text":2146,"config":2147},"Artifact Management",{"href":2148,"dataGaLocation":2099,"dataGaName":2149},"/artifact-central/","artifact management",{"title":2151,"items":2152},"Security & Governance",[2153,2158,2163,2168],{"text":2154,"config":2155},"Application Security Testing",{"href":2156,"dataGaLocation":2099,"dataGaName":2157},"/solutions/application-security-testing/","application security testing",{"text":2159,"config":2160},"Governance & Compliance",{"href":2161,"dataGaLocation":2099,"dataGaName":2162},"/solutions/software-compliance/","governance and compliance",{"text":2164,"config":2165},"Secrets Management",{"href":2166,"dataGaLocation":2099,"dataGaName":2167},"/gitlab-secrets-manager/","secrets management",{"text":2169,"config":2170},"Supply Chain Security",{"href":2171,"dataGaLocation":2099,"dataGaName":2172},"/solutions/supply-chain/","supply chain security",{"title":2174,"items":2175},"Context & AI",[2176,2181,2186],{"text":2177,"config":2178},"Agentic Orchestration",{"href":2179,"dataGaLocation":2099,"dataGaName":2180},"/gitlab-duo-agent-platform/","agentic orchestration",{"text":2182,"config":2183},"Context Graph",{"href":2184,"dataGaLocation":2099,"dataGaName":2185},"/gitlab-orbit/","context graph",{"text":2187,"config":2188},"Visibility & Measurement",{"href":2189,"dataGaLocation":2099,"dataGaName":2190},"/solutions/visibility-measurement/","visibility and measurement",{"config":2192,"title":2195,"text":2196,"link":2197},{"background":2193,"textColor":2194},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1790185102/o7dn32anqcb6z8dgd3as.jpg')","#000","Why GitLab","One platform for speed with control across your software lifecycle.",{"text":2198,"config":2199},"Learn more",{"href":2200,"dataGaName":2201,"dataGaLocation":2099},"/why-gitlab/","why gitlab",{"text":2203,"left":437,"config":2204,"menu":2206},"Solutions",{"dataNavLevelOne":2205},"solutions",{"type":2121,"link":2207,"columns":2211,"feature":2281},{"text":2208,"config":2209},"View all Solutions",{"href":2210,"dataGaName":2205,"dataGaLocation":2099},"/solutions/",[2212,2230,2248],{"title":2213,"items":2214},"Outcomes",[2215,2220,2225],{"text":2216,"config":2217},"DevOps Modernization",{"href":2218,"dataGaLocation":2099,"dataGaName":2219},"/assessments/devops-modernization-assessment/","devops modernization",{"text":2221,"config":2222},"Security Modernization",{"href":2223,"dataGaLocation":2099,"dataGaName":2224},"/assessments/security-modernization-assessment/","security modernization",{"text":2226,"config":2227},"AI Modernization",{"href":2228,"dataGaLocation":2099,"dataGaName":2229},"/assessments/ai-modernization-assessment/","ai modernization",{"title":2231,"items":2232},"By size",[2233,2238,2243],{"text":2234,"config":2235},"Enterprise",{"href":2236,"dataGaLocation":2099,"dataGaName":2237},"/enterprise/","enterprise",{"text":2239,"config":2240},"Small Business",{"href":2241,"dataGaLocation":2099,"dataGaName":2242},"/small-business/","small business",{"text":2244,"config":2245},"Startups",{"href":2246,"dataGaLocation":2099,"dataGaName":2247},"/solutions/startups/","startups",{"title":2249,"items":2250},"Industries",[2251,2256,2261,2266,2271,2276],{"text":2252,"config":2253},"Financial Services",{"href":2254,"dataGaLocation":2099,"dataGaName":2255},"/solutions/finance/","financial services",{"text":2257,"config":2258},"Public Sector",{"href":2259,"dataGaLocation":2099,"dataGaName":2260},"/solutions/public-sector/","public sector",{"text":2262,"config":2263},"Telecommunications",{"href":2264,"dataGaLocation":2099,"dataGaName":2265},"/solutions/telecommunications/","telecommunications",{"text":2267,"config":2268},"Automotive",{"href":2269,"dataGaLocation":2099,"dataGaName":2270},"/solutions/automotive/","automotive",{"text":2272,"config":2273},"Education",{"href":2274,"dataGaLocation":2099,"dataGaName":2275},"/solutions/education/","education",{"text":2277,"config":2278},"Aerospace",{"href":2279,"dataGaLocation":2099,"dataGaName":2280},"/solutions/aerospace/","aerospace",{"config":2282,"title":2283,"text":2284,"link":2285},{"background":2193,"textColor":2194},"GitLab Security Standard","Learn how to harden your software factory and let AI agents earn autonomy, without trading away security.",{"text":2286,"config":2287},"Explore the standard",{"href":2288,"dataGaName":2289,"dataGaLocation":2099},"/gitlab-security-standard/","gitlab security standard",{"text":2291,"config":2292},"Pricing",{"href":2293,"dataGaName":2294,"dataGaLocation":2099,"dataNavLevelOne":2294},"/pricing/","pricing",{"text":2296,"config":2297,"menu":2299},"Resources",{"dataNavLevelOne":2298},"resources",{"type":2121,"link":2300,"columns":2304,"feature":2360},{"text":2301,"config":2302},"View all resources",{"href":2303,"dataGaName":2298,"dataGaLocation":2099},"/resources/",[2305,2333],{"title":2306,"items":2307},"Discover",[2308,2313,2318,2323,2328],{"text":2309,"config":2310},"Docs",{"href":2311,"dataGaName":2312,"dataGaLocation":2099},"https://docs.gitlab.com/","docs",{"text":2314,"config":2315},"University",{"href":2316,"dataGaName":2317,"dataGaLocation":2099},"https://university.gitlab.com/","university",{"text":2319,"config":2320},"Demo Series",{"href":2321,"dataGaName":2322,"dataGaLocation":2099},"/gitlab-technical-demo-series/","demo series",{"text":2324,"config":2325},"Demo Hub",{"href":2326,"dataGaName":2327,"dataGaLocation":2099},"/demo-hub/","demo hub",{"text":2329,"config":2330},"Services",{"href":2331,"dataGaName":2332,"dataGaLocation":2099},"/services/","services",{"title":2334,"items":2335},"Connect",[2336,2341,2345,2350,2355],{"text":2337,"config":2338},"Blog",{"href":2339,"dataGaName":2340,"dataGaLocation":2099},"/blog/","blog",{"text":2342,"config":2343},"Community",{"href":2344,"dataGaName":2091,"dataGaLocation":2099},"/community/",{"text":2346,"config":2347},"Customers",{"href":2348,"dataGaName":2349,"dataGaLocation":2099},"/customers/","customers",{"text":2351,"config":2352},"Partners",{"href":2353,"dataGaName":2354,"dataGaLocation":2099},"/partners/","partners",{"text":2356,"config":2357},"Events",{"href":2358,"dataGaName":2359,"dataGaLocation":2099},"/events/","events",{"config":2361,"title":2362,"text":2363,"link":2364},{"background":2193,"textColor":2194},"What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":2365,"config":2366},"Read the latest",{"href":2367,"dataGaName":2368,"dataGaLocation":2099},"/whats-new/","whats new",{"text":2370,"config":2371,"menu":2373},"Company",{"dataNavLevelOne":2372},"company",{"type":2121,"columns":2374},[2375],{"items":2376},[2377,2382,2388,2393,2398,2403,2408,2413,2418],{"text":2378,"config":2379},"About",{"href":2380,"dataGaName":2381,"dataGaLocation":2099},"/company/","about",{"text":2383,"config":2384,"footerGa":2387},"Jobs",{"href":2385,"dataGaName":2386,"dataGaLocation":2099},"/jobs/","jobs",{"dataGaName":2386},{"text":2389,"config":2390},"Press",{"href":2391,"dataGaName":2392,"dataGaLocation":2099},"/press/","press",{"text":2394,"config":2395},"Handbook",{"href":2396,"dataGaName":2397,"dataGaLocation":2099},"https://handbook.gitlab.com/","handbook",{"text":2399,"config":2400},"Leadership",{"href":2401,"dataGaName":2402,"dataGaLocation":2099},"/company/team/e-group/","leadership",{"text":2404,"config":2405},"Investor relations",{"href":2406,"dataGaName":2407,"dataGaLocation":2099},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2409,"config":2410},"Trust Center",{"href":2411,"dataGaName":2412,"dataGaLocation":2099},"/security/","trust center",{"text":2414,"config":2415},"AI Transparency Center",{"href":2416,"dataGaName":2417,"dataGaLocation":2099},"/ai-transparency-center/","ai transparency center",{"text":2419,"config":2420},"Newsletter",{"href":2421,"dataGaName":2422,"dataGaLocation":2099},"/company/contact/#contact-forms","newsletter",{"text":2424,"config":2425,"menu":2426},"Contact us",{"dataNavLevelOne":2372},{"type":2121,"columns":2427},[2428],{"items":2429},[2430,2435,2440],{"text":2431,"config":2432},"Talk to sales",{"href":2433,"dataGaName":2434,"dataGaLocation":2099},"/sales/","talk to sales",{"text":2436,"config":2437},"Support portal",{"href":2438,"dataGaName":2439,"dataGaLocation":2099},"https://support.gitlab.com/hc/en-us","support portal",{"text":2441,"config":2442},"Customer portal",{"href":2443,"dataGaName":2444,"dataGaLocation":2099},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2446,"login":2447,"suggestions":2454},"Close",{"text":2448,"link":2449},"To search repositories and projects, login to",{"text":2450,"config":2451},"gitlab.com",{"href":2113,"dataGaName":2452,"dataGaLocation":2453},"search login","search",{"text":2455,"default":2456},"Suggestions",[2457,2460,2463,2465,2469,2473],{"text":2458,"config":2459},"GitLab Duo Agent Platform",{"href":2179,"dataGaName":2458,"dataGaLocation":2453},{"text":2461,"config":2462},"Code Suggestions (AI)",{"href":2179,"dataGaName":2461,"dataGaLocation":2453},{"text":2131,"config":2464},{"href":2133,"dataGaName":2131,"dataGaLocation":2453},{"text":2466,"config":2467},"GitLab on AWS",{"href":2468,"dataGaName":2466,"dataGaLocation":2453},"/partners/technology-partners/aws/",{"text":2470,"config":2471},"GitLab on Google Cloud",{"href":2472,"dataGaName":2470,"dataGaLocation":2453},"/partners/technology-partners/google-cloud-platform/",{"text":2474,"config":2475},"Why GitLab?",{"href":2200,"dataGaName":2474,"dataGaLocation":2453},{"freeTrial":2477,"mobileIcon":2482,"desktopIcon":2487,"secondaryButton":2490},{"text":2478,"config":2479},"Start free trial",{"href":2480,"dataGaName":2104,"dataGaLocation":2481},"https://gitlab.com/-/trials/new/","nav",{"altText":2483,"config":2484},"Gitlab Icon",{"src":2485,"dataGaName":2486,"dataGaLocation":2481},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2483,"config":2488},{"src":2489,"dataGaName":2486,"dataGaLocation":2481},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2491,"config":2492},"Get Started",{"href":2493,"dataGaName":2494,"dataGaLocation":2481},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":2496,"mobileIcon":2500,"desktopIcon":2502},{"text":2497,"config":2498},"Learn more about GitLab Duo",{"href":2179,"dataGaName":2499,"dataGaLocation":2481},"gitlab duo",{"altText":2483,"config":2501},{"src":2485,"dataGaName":2486,"dataGaLocation":2481},{"altText":2483,"config":2503},{"src":2489,"dataGaName":2486,"dataGaLocation":2481},{"button":2505,"mobileIcon":2510,"desktopIcon":2512},{"text":2506,"config":2507},"/switch",{"href":2508,"dataGaName":2509,"dataGaLocation":2481},"#contact","switch",{"altText":2483,"config":2511},{"src":2485,"dataGaName":2486,"dataGaLocation":2481},{"altText":2483,"config":2513},{"src":2514,"dataGaName":2486,"dataGaLocation":2481},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2516,"mobileIcon":2521,"desktopIcon":2523},{"text":2517,"config":2518},"Back to pricing",{"href":2293,"dataGaName":2519,"dataGaLocation":2481,"icon":2520},"back to pricing","GoBack",{"altText":2483,"config":2522},{"src":2485,"dataGaName":2486,"dataGaLocation":2481},{"altText":2483,"config":2524},{"src":2489,"dataGaName":2486,"dataGaLocation":2481},{"title":2526,"button":2527,"config":2533},"Ship at agent speed. Prove every step. Transcend is here.",{"text":2528,"config":2529},"Watch now",{"href":2530,"dataGaName":2531,"dataGaLocation":2532},"/events/transcend/virtual/#watch-gitlab-transcend","transcend-october-2026-banner","global-banner",{"layout":2534,"disabled":2079},"release",{"data":2536},{"text":2537,"source":2538,"edit":2544,"contribute":2549,"config":2554,"items":2559,"minimal":2785},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":2539,"config":2540},"View page source",{"href":2541,"dataGaName":2542,"dataGaLocation":2543},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2545,"config":2546},"Edit this page",{"href":2547,"dataGaName":2548,"dataGaLocation":2543},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2550,"config":2551},"Please contribute",{"href":2552,"dataGaName":2553,"dataGaLocation":2543},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2555,"facebook":2556,"youtube":2557,"linkedin":2558},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2560,2607,2665,2712,2753],{"title":2291,"links":2561,"subMenu":2576},[2562,2566,2571],{"text":2563,"config":2564},"View plans",{"href":2293,"dataGaName":2565,"dataGaLocation":2543},"view plans",{"text":2567,"config":2568},"Why Premium?",{"href":2569,"dataGaName":2570,"dataGaLocation":2543},"/pricing/premium/","why premium",{"text":2572,"config":2573},"Why Ultimate?",{"href":2574,"dataGaName":2575,"dataGaLocation":2543},"/pricing/ultimate/","why ultimate",[2577],{"title":2578,"links":2579},"Contact Us",[2580,2583,2585,2587,2592,2597,2602],{"text":2581,"config":2582},"Contact sales",{"href":2433,"dataGaName":2109,"dataGaLocation":2543},{"text":2436,"config":2584},{"href":2438,"dataGaName":2439,"dataGaLocation":2543},{"text":2441,"config":2586},{"href":2443,"dataGaName":2444,"dataGaLocation":2543},{"text":2588,"config":2589},"Status",{"href":2590,"dataGaName":2591,"dataGaLocation":2543},"https://status.gitlab.com/","status",{"text":2593,"config":2594},"Terms of use",{"href":2595,"dataGaName":2596,"dataGaLocation":2543},"/terms/","terms of use",{"text":2598,"config":2599},"Privacy statement",{"href":2600,"dataGaName":2601,"dataGaLocation":2543},"/privacy/","privacy statement",{"text":2603,"config":2604},"Cookie preferences",{"dataGaName":2605,"dataGaLocation":2543,"id":2606,"isOneTrustButton":437},"cookie preferences","ot-sdk-btn",{"title":2117,"links":2608,"subMenu":2622},[2609,2612,2614,2616,2618,2620],{"text":2610,"config":2611},"Explore the platform",{"href":2125,"dataGaName":2119,"dataGaLocation":2543},{"text":2177,"config":2613},{"href":2179,"dataGaName":2180,"dataGaLocation":2543},{"text":2131,"config":2615},{"href":2133,"dataGaName":2134,"dataGaLocation":2543},{"text":2182,"config":2617},{"href":2184,"dataGaName":2185,"dataGaLocation":2543},{"text":2164,"config":2619},{"href":2166,"dataGaName":2167,"dataGaLocation":2543},{"text":2195,"config":2621},{"href":2200,"dataGaName":2201,"dataGaLocation":2543},[2623],{"title":2624,"links":2625},"Topics",[2626,2630,2635,2640,2645,2650,2655,2660],{"text":2131,"config":2627},{"href":2628,"dataGaName":2629,"dataGaLocation":2543},"/topics/ci-cd/","cicd",{"text":2631,"config":2632},"GitOps",{"href":2633,"dataGaName":2634,"dataGaLocation":2543},"/topics/gitops/","gitops",{"text":2636,"config":2637},"DevOps",{"href":2638,"dataGaName":2639,"dataGaLocation":2543},"/topics/devops/","devops",{"text":2641,"config":2642},"Version Control",{"href":2643,"dataGaName":2644,"dataGaLocation":2543},"/topics/version-control/","version control",{"text":2646,"config":2647},"DevSecOps",{"href":2648,"dataGaName":2649,"dataGaLocation":2543},"/topics/devsecops/","devsecops",{"text":2651,"config":2652},"Cloud Native",{"href":2653,"dataGaName":2654,"dataGaLocation":2543},"/topics/cloud-native/","cloud native",{"text":2656,"config":2657},"AI for Coding",{"href":2658,"dataGaName":2659,"dataGaLocation":2543},"/topics/devops/ai-for-coding/","ai for coding",{"text":2661,"config":2662},"Agentic AI",{"href":2663,"dataGaName":2664,"dataGaLocation":2543},"/topics/agentic-ai/","agentic ai",{"title":2203,"links":2666},[2667,2670,2673,2676,2679,2682,2684,2686,2688,2690,2692,2695,2697,2700,2704,2708],{"text":2668,"config":2669},"DevOps modernization",{"href":2218,"dataGaName":2219,"dataGaLocation":2543},{"text":2671,"config":2672},"Security modernization",{"href":2223,"dataGaName":2224,"dataGaLocation":2543},{"text":2674,"config":2675},"AI modernization",{"href":2228,"dataGaName":2229,"dataGaLocation":2543},{"text":2677,"config":2678},"Financial services",{"href":2254,"dataGaName":2255,"dataGaLocation":2543},{"text":2680,"config":2681},"Public sector",{"href":2259,"dataGaName":2260,"dataGaLocation":2543},{"text":2262,"config":2683},{"href":2264,"dataGaName":2265,"dataGaLocation":2543},{"text":2267,"config":2685},{"href":2269,"dataGaName":2270,"dataGaLocation":2543},{"text":2272,"config":2687},{"href":2274,"dataGaName":2275,"dataGaLocation":2543},{"text":2277,"config":2689},{"href":2279,"dataGaName":2280,"dataGaLocation":2543},{"text":2234,"config":2691},{"href":2236,"dataGaName":2237,"dataGaLocation":2543},{"text":2693,"config":2694},"Small business",{"href":2241,"dataGaName":2242,"dataGaLocation":2543},{"text":2244,"config":2696},{"href":2246,"dataGaName":2247,"dataGaLocation":2543},{"text":2631,"config":2698},{"href":2699,"dataGaName":2634,"dataGaLocation":2543},"/solutions/gitops/",{"text":2701,"config":2702},"Software composition analysis",{"href":2171,"dataGaName":2703,"dataGaLocation":2543},"software composition analysis",{"text":2705,"config":2706},"Value stream management",{"href":2189,"dataGaName":2707,"dataGaLocation":2543},"value stream management",{"text":2709,"config":2710},"All solutions",{"href":2210,"dataGaName":2711,"dataGaLocation":2543},"all solutions",{"title":2296,"links":2713},[2714,2719,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2744,2746,2749],{"text":2715,"config":2716},"Install",{"href":2717,"dataGaName":2718,"dataGaLocation":2543},"/install/","install",{"text":2720,"config":2721},"Quick start guides",{"href":2722,"dataGaName":2723,"dataGaLocation":2543},"/get-started/","quick setup checklists",{"text":2309,"config":2725},{"href":2311,"dataGaName":2312,"dataGaLocation":2543},{"text":2314,"config":2727},{"href":2316,"dataGaName":2317,"dataGaLocation":2543},{"text":2319,"config":2729},{"href":2321,"dataGaName":2322,"dataGaLocation":2543},{"text":2324,"config":2731},{"href":2326,"dataGaName":2327,"dataGaLocation":2543},{"text":2329,"config":2733},{"href":2331,"dataGaName":2332,"dataGaLocation":2543},{"text":2337,"config":2735},{"href":2339,"dataGaName":2340,"dataGaLocation":2543},{"text":2342,"config":2737},{"href":2344,"dataGaName":2091,"dataGaLocation":2543},{"text":2346,"config":2739},{"href":2348,"dataGaName":2349,"dataGaLocation":2543},{"text":2351,"config":2741},{"href":2353,"dataGaName":2354,"dataGaLocation":2543},{"text":2356,"config":2743},{"href":2358,"dataGaName":2359,"dataGaLocation":2543},{"text":2419,"config":2745},{"href":2421,"dataGaName":2422,"dataGaLocation":2543},{"text":2747,"config":2748},"What's new",{"href":2367,"dataGaName":2368,"dataGaLocation":2543},{"text":2750,"config":2751},"All resources",{"href":2303,"dataGaName":2752,"dataGaLocation":2543},"all resources",{"title":2370,"links":2754},[2755,2757,2759,2761,2763,2765,2767,2769,2771,2775,2780],{"text":2378,"config":2756},{"href":2380,"dataGaName":2372,"dataGaLocation":2543},{"text":2383,"config":2758},{"href":2385,"dataGaName":2386,"dataGaLocation":2543},{"text":2389,"config":2760},{"href":2391,"dataGaName":2392,"dataGaLocation":2543},{"text":2394,"config":2762},{"href":2396,"dataGaName":2397,"dataGaLocation":2543},{"text":2399,"config":2764},{"href":2401,"dataGaName":2402,"dataGaLocation":2543},{"text":2404,"config":2766},{"href":2406,"dataGaName":2407,"dataGaLocation":2543},{"text":2409,"config":2768},{"href":2411,"dataGaName":2412,"dataGaLocation":2543},{"text":2414,"config":2770},{"href":2416,"dataGaName":2417,"dataGaLocation":2543},{"text":2772,"config":2773},"Sustainability",{"href":2774,"dataGaName":2772,"dataGaLocation":2543},"/sustainability/",{"text":2776,"config":2777},"Diversity, inclusion and belonging (DIB)",{"href":2778,"dataGaName":2779,"dataGaLocation":2543},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2781,"config":2782},"Modern Slavery Transparency Statement",{"href":2783,"dataGaName":2784,"dataGaLocation":2543},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2786},[2787,2790,2793],{"text":2788,"config":2789},"Terms",{"href":2595,"dataGaName":2596,"dataGaLocation":2543},{"text":2791,"config":2792},"Cookies",{"dataGaName":2605,"dataGaLocation":2543,"id":2606,"isOneTrustButton":437},{"text":2794,"config":2795},"Privacy",{"href":2600,"dataGaName":2601,"dataGaLocation":2543},[2797],{"id":2798,"title":7,"body":2078,"config":2799,"content":2801,"description":2078,"extension":2805,"meta":2806,"navigation":437,"path":2807,"seo":2808,"stem":2809,"__hash__":2810},"blogAuthors/en-us/blog/authors/karthik-nayak.yml",{"template":2800},"BlogAuthor",{"name":7,"config":2802},{"headshot":2803,"ctfId":2804},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659809/Blog/Author%20Headshots/Screenshot_2025-06-04_at_8.49.51%C3%A2__AM.png","3Q6ZKvaiCRw7tFZdDGlecg","yml",{},"/en-us/blog/authors/karthik-nayak",{},"en-us/blog/authors/karthik-nayak","pDQbfmQk6aaJ6PA9L68AzPlzIUBcosTh7WBoq680gpk",[2812,2820,2826],{"title":2813,"description":2814,"heroImage":2815,"category":2074,"date":2816,"authors":2817,"slug":2819,"externalUrl":2078},"How to recognize your team with GitLab Achievements","Reward the people who make your team great — in your company, community, or open source project. Learn why we built this feature and how to use it.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1757950181/q9kb7zfiw1cyxx9fcafp.png","2026-08-27",[2818],"Lee Tickett","how-to-recognize-your-team-with-gitlab-achievements",{"title":2821,"description":2822,"heroImage":2080,"category":2074,"date":2823,"authors":2824,"slug":2825,"externalUrl":2078},"What's new in Git 2.55.0?","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","2026-06-29",[1934],"whats-new-in-git-2-55-0",{"title":2827,"description":2828,"heroImage":2829,"category":2074,"date":2830,"authors":2831,"slug":2833,"externalUrl":2078},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[2832],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"header":2835,"text":2836,"button":2840,"disclaimer":2843},"Start your free\n\n30-day GitLab trial\n",[2837,2838,2839],"GitLab Duo Agent Platform access","Try our most advanced features","Automate complex tasks with AI",{"text":2101,"config":2841},{"href":2842,"dataGaName":2104,"dataGaLocation":2340},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/blog/","No credit card required.",{"header":2845,"blurb":2846,"button":2847,"secondaryButton":2851},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2848,"config":2849},"Get your free trial",{"href":2850,"dataGaName":2104,"dataGaLocation":1598},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/",{"text":2581,"config":2852},{"href":2433,"dataGaName":2109,"dataGaLocation":1598},1791944923926]