[{"data":1,"prerenderedAt":1345},["ShallowReactive",2],{"/blog/whats-new-in-git-2-48-0":3,"navigation-en-us":560,"banner-en-us":987,"footer-en-us":997,"blog-post-authors-en-us-Christian Couder":1242,"blog-related-posts-en-us-whats-new-in-git-2-48-0":1257,"blog-promotions-en-us":1281,"next-steps-en-us":1335},{"id":4,"title":5,"authors":6,"body":8,"category":538,"date":539,"description":540,"extension":541,"externalUrl":542,"faq":542,"featured":543,"heroImage":544,"meta":545,"navigation":543,"path":546,"seo":547,"slug":552,"stem":553,"tags":554,"template":558,"updatedDate":542,"__hash__":559},"blogPosts/en-us/blog/whats-new-in-git-2-48-0.md","What’s new in Git 2.48.0?",[7],"Christian Couder",{"type":9,"value":10,"toc":527},"minimark",[11,22,27,48,57,72,75,91,94,193,204,222,229,233,242,245,248,253,257,284,299,314,321,325,340,343,356,359,363,383,392,395,400,407,414,423,426,439,446,450,465,468,477,482,486,495,523],[12,13,14,15,21],"p",{},"The Git project recently released ",[16,17,20],"a",{"href":18,"rel":19},"https://lore.kernel.org/git/xmqqplku7cvm.fsf@gitster.g/",[],"Git 2.48.0",". Let's look at a few notable highlights from this release, which includes contributions from GitLab's Git team and the wider Git community.",[23,24,26],"h2",{"id":25},"meson-build-system","Meson build system",[12,28,29,30,35,36,41,42,47],{},"For a long time, Git could be built using either a ",[16,31,34],{"href":32,"rel":33},"https://en.wikipedia.org/wiki/GNU_Make",[],"Makefile","-based build system or an ",[16,37,40],{"href":38,"rel":39},"https://en.wikipedia.org/wiki/Autoconf",[],"Autoconf","-based build system. Git developers have been using mostly the Makefile-based build system, so\n",[16,43,46],{"href":44,"rel":45},"https://lore.kernel.org/git/GV1PR02MB848925A79A9DD733848182D58D662@GV1PR02MB8489.eurprd02.prod.outlook.com/",[],"the Autoconf-based build system has lagged behind"," in features and maintenance. Another issue was that a lot of Windows\ndevelopers use integrated development environments (IDEs) that don’t\nhave good support for Makefile- and Autoconf-based build systems.",[12,49,50,51,56],{},"In 2020, support for building Git using ",[16,52,55],{"href":53,"rel":54},"https://cmake.org/",[],"CMake"," was added. CMake added better Windows support and IDE integration, especially for Visual\nStudio. Some modern build system features like out-of-source builds were also included.",[12,58,59,60,65,66,71],{},"Recently, it appeared the CMake support was also lagging\nbehind and that it might never be a good option to replace the two other\nbuild systems. So ",[16,61,64],{"href":62,"rel":63},"https://gitlab.com/pks-gitlab",[],"Patrick Steinhardt",", GitLab Git Engineering Manager, implemented support for the ",[16,67,70],{"href":68,"rel":69},"https://mesonbuild.com/",[],"Meson"," build\nsystem with the goal of eventually replacing the Autoconf-, CMake-, and\nmaybe the Makefile-based build systems.",[12,73,74],{},"The new Meson-based build system has the following advantages:",[76,77,78,82,85,88],"ul",{},[79,80,81],"li",{},"Allows users to easily find the available build options, something which is difficult with Makefiles and CMake",[79,83,84],{},"Has a simple syntax compared to Autoconf and CMake",[79,86,87],{},"Supports many different operating systems, compilers, and IDEs",[79,89,90],{},"Supports modern build system features like out-of-source builds",[12,92,93],{},"Here is an example of how it can actually be used to build Git:",[95,96,101],"pre",{"className":97,"code":98,"language":99,"meta":100,"style":100},"language-shell shiki shiki-themes github-light","$ cd git                # go into the root of Git's source code\n$ meson setup build/    # setup \"build\" as a build directory\n$ cd build              # go into the \"build\" directory\n$ meson compile         # actually build Git\n$ meson test            # test the new build\n$ meson install         # install the new build\n\n","shell","",[102,103,104,124,141,154,167,180],"code",{"__ignoreMap":100},[105,106,109,113,117,120],"span",{"class":107,"line":108},"line",1,[105,110,112],{"class":111},"s7eDp","$",[105,114,116],{"class":115},"sYBdl"," cd",[105,118,119],{"class":115}," git",[105,121,123],{"class":122},"sAwPA","                # go into the root of Git's source code\n",[105,125,127,129,132,135,138],{"class":107,"line":126},2,[105,128,112],{"class":111},[105,130,131],{"class":115}," meson",[105,133,134],{"class":115}," setup",[105,136,137],{"class":115}," build/",[105,139,140],{"class":122},"    # setup \"build\" as a build directory\n",[105,142,144,146,148,151],{"class":107,"line":143},3,[105,145,112],{"class":111},[105,147,116],{"class":115},[105,149,150],{"class":115}," build",[105,152,153],{"class":122},"              # go into the \"build\" directory\n",[105,155,157,159,161,164],{"class":107,"line":156},4,[105,158,112],{"class":111},[105,160,131],{"class":115},[105,162,163],{"class":115}," compile",[105,165,166],{"class":122},"         # actually build Git\n",[105,168,170,172,174,177],{"class":107,"line":169},5,[105,171,112],{"class":111},[105,173,131],{"class":115},[105,175,176],{"class":115}," test",[105,178,179],{"class":122},"            # test the new build\n",[105,181,183,185,187,190],{"class":107,"line":182},6,[105,184,112],{"class":111},[105,186,131],{"class":115},[105,188,189],{"class":115}," install",[105,191,192],{"class":122},"         # install the new build\n",[12,194,195,196,199,200,203],{},"Multiple build directories can be set up using ",[102,197,198],{},"meson setup \u003Cbuild_dir>",", and the configuration of the build inside a build directory can be viewed or changed by running ",[102,201,202],{},"meson configure"," inside the build directory.",[12,205,206,207,215,216,221],{},"More information on how to build Git using Meson can be found at the top of the ",[16,208,211,214],{"href":209,"rel":210},"https://gitlab.com/gitlab-org/git/-/blob/master/meson.build",[],[102,212,213],{},"meson.build"," file"," in the Git code repository. A\n",[16,217,220],{"href":218,"rel":219},"https://gitlab.com/gitlab-org/git/-/blob/master/Documentation/technical/build-systems.txt",[],"comparison of the different build systems"," for Git is available as part of Git's technical documentation.",[12,223,224,225,228],{},"This project was led by ",[16,226,64],{"href":62,"rel":227},[],".",[23,230,232],{"id":231},"git-is-now-memory-leak-free-as-exercised-by-the-test-suite","Git is now memory-leak-free (as exercised by the test suite)",[12,234,235,236,241],{},"In our Git release blog post about the previous Git 2.47.0 release, we\ntalked about our ",[16,237,240],{"href":238,"rel":239},"https://about.gitlab.com/blog/whats-new-in-git-2-47-0/#code-refactoring-and-maintainability-improvements",[],"ongoing effort to fix all memory leaks"," surfaced by existing tests in the project. We said that prior to the Git 2.47.0 release, the project had 223 test files containing memory\nleaks, and that this had been whittled down to just 60.",[12,243,244],{},"We are pleased to report that the memory leaks in all 60 remaining test files have been resolved. As a result, Git, as exercised by the test suite, is now free of memory leaks. This is an important step towards the longstanding goal of “libifying” Git internal components (which means converting those components into internal libraries). It will also help with optimizing Git for memory usage.",[12,246,247],{},"Now, any newly added test must be leak-free by default. It's still\npossible to have leaking tests, but the authors will have to use an\nescape hatch for that and provide good arguments why their test cannot\nbe made leak free.",[12,249,224,250,228],{},[16,251,64],{"href":62,"rel":252},[],[23,254,256],{"id":255},"improved-bundle-uri-checks","Improved bundle URI checks",[12,258,259,260,265,266,271,272,277,278,283],{},"In our Git release blog post about the Git 2.46.0 release, we talked\nabout some ",[16,261,264],{"href":262,"rel":263},"https://about.gitlab.com/blog/whats-new-in-git-2-46-0/#bundle-uri-fixes",[],"bundle URI fixes","\nby ",[16,267,270],{"href":268,"rel":269},"https://lore.kernel.org/git/pull.1730.git.1715742069966.gitgitgadget@gmail.com/",[],"Xing Xin",".\nAfter those fixes, Xing Xin worked on making it possible for ",[16,273,276],{"href":274,"rel":275},"https://lore.kernel.org/git/pull.1730.v8.git.1718770053.gitgitgadget@gmail.com/",[],"fetches using bundles to be fully checked","\nusing the ",[16,279,282],{"href":280,"rel":281},"https://git-scm.com/docs/git-fsck",[],"fsck"," mechanism like regular fetches.",[12,285,286,287,292,293,298],{},"When validating regular fetches, it's possible to specify\n",[16,288,291],{"href":289,"rel":290},"https://git-scm.com/docs/git-fsck#Documentation/git-fsck.txt-fsckltmsg-idgt",[],"different severities"," for ",[16,294,297],{"href":295,"rel":296},"https://git-scm.com/docs/git-fsck#_fsck_messages",[],"different fsck issues","\nto have fine-grained handling of what is accepted and what is rejected in a specific repository. This wasn't possible for fetches using bundles previously.",[12,300,301,302,307,308,313],{},"To further increase the usefulness and safety of ",[16,303,306],{"href":304,"rel":305},"https://git-scm.com/docs/bundle-uri",[],"bundle-uri",", we ",[16,309,312],{"href":310,"rel":311},"https://lore.kernel.org/git/20241121204119.1440773-1-jltobler@gmail.com/",[],"addressed this problem"," so that the different severities specified for different fsck issues\nare now used when checking fetches using bundles, too.",[12,315,224,316,228],{},[16,317,320],{"href":318,"rel":319},"https://gitlab.com/justintobler",[],"Justin Tobler",[23,322,324],{"id":323},"add-reference-consistency-checks","Add reference consistency checks",[12,326,327,328,333,334,339],{},"In our Git release blog post about the Git 2.47.0 release, we mentioned Jialuo She's work on\n",[16,329,332],{"href":330,"rel":331},"https://about.gitlab.com/blog/whats-new-in-git-2-47-0/#new-subcommand-for-git-refs(1)",[],"adding a new 'verify' subcommand"," to git-refs(1) which was part of the\n",[16,335,338],{"href":336,"rel":337},"https://summerofcode.withgoogle.com/archive/2024/projects/ukm4PTEF",[],"Google Summer of Code 2024"," (GSoC 2024).",[12,341,342],{},"In that blog post, we said that eventually the goal was to integrate this new subcommand as part of git-fsck(1) to provide a unified way to execute repository consistency checks. Jialuo She has decided to work on that after his GSoC was over.",[12,344,345,346,351,352,355],{},"The result from ",[16,347,350],{"href":348,"rel":349},"https://lore.kernel.org/git/ZrtrT1CPI4YUf5db@ArchLinux/",[],"this effort","\nis that git-fsck(1) can now detect and handle a number of reference-related issues, like when the content of a reference is bad, when a symbolic link is used as a symbolic reference, or when the target of a symbolic reference doesn't point to a valid reference. We still need to call ",[102,353,354],{},"git refs verify"," as part of git-fsck(1), and have the former perform all non-backend-specific checks that the latter currently does, but we are closer to our end goal of a unified way to execute all refs consistency checks.",[12,357,358],{},"This project was led by Jialuo She.",[23,360,362],{"id":361},"iterator-reuse-in-reftables","Iterator reuse in reftables",[12,364,365,366,371,372,377,378,228],{},"In the ",[16,367,370],{"href":368,"rel":369},"https://gitlab.com/gitlab-org/git/-/raw/master/Documentation/RelNotes/2.45.0.txt",[],"Git 2.45.0"," release, the 'reftables' format was introduced as a new backend for storing references (mostly branches and tags). If you are not yet\nfamiliar with the reftables backend, check out our previous ",[16,373,376],{"href":374,"rel":375},"https://about.gitlab.com/blog/whats-new-in-git-2-45-0/",[],"Git release blog post"," where the feature was introduced and our beginner’s guide to ",[16,379,382],{"href":380,"rel":381},"https://about.gitlab.com/blog/a-beginners-guide-to-the-git-reftable-format/",[],"learn more about how reftables work",[12,384,385,386,391],{},"Since that release, we continued to improve this backend, and we recently focused on improving its performance by ",[16,387,390],{"href":388,"rel":389},"https://lore.kernel.org/git/cover.1730732881.git.ps@pks.im/",[],"reusing some internal iterators"," when reading random references. Before these changes, reading a single reference required us to create a whole new iterator, seek it to the correct location in the respective tables, and then read the next value from it, which can be quite inefficient when reading many references in quick succession. After the change we now only create a single iterator and reuse it to read multiple references, thus saving some overhead.",[12,393,394],{},"The result of this work is increased performance in a number of reftables-related use cases, especially a 7% speedup when creating many references in a transaction that performs many random reads. Furthermore, this creates the possibility for more optimizations as we can continue to reuse more state kept in the iterators.",[12,396,224,397,228],{},[16,398,64],{"href":62,"rel":399},[],[23,401,403,404],{"id":402},"support-for-reflogs-in-git-refs-migrate","Support for reflogs in ",[102,405,406],{},"git-refs migrate",[12,408,409,410,413],{},"After the 'reftables' backend was introduced in Git 2.45.0 (see the section above), we worked on tooling to migrate reference backends in Git 2.46.0, which consisted of adding a new ",[102,411,412],{},"migrate"," subcommand to git-refs(1).",[12,415,416,417,422],{},"Our article about Git 2.46.0 ",[16,418,421],{"href":419,"rel":420},"https://about.gitlab.com/blog/whats-new-in-git-2-46-0/#tooling-to-migrate-reference-backends",[],"talked about this work"," and mentioned some limitations that still existed. In particular, the article said:",[12,424,425],{},"\"The reflogs in a repository are a component of a reference backend and would also require migration between formats. Unfortunately, the tooling is not yet capable of converting reflogs between the files and reftables backends.\"",[12,427,428,429,434,435,438],{},"We are pleased to report that we have ",[16,430,433],{"href":431,"rel":432},"https://lore.kernel.org/git/20241216-320-git-refs-migrate-reflogs-v4-0-d7cd3f197453@gmail.com/",[],"lifted this limitation in Git 2.48.0",".\nReflogs can now also be migrated with ",[102,436,437],{},"git refs migrate",". The migration tool is not yet capable of handling a repository with multiple worktrees, but this is the only limitation left. If you\ndon't use worktrees, you can already take advantage of the reftables backend in your existing repositories.",[12,440,224,441,228],{},[16,442,445],{"href":443,"rel":444},"https://gitlab.com/knayakgl",[],"Karthik Nayak",[23,447,449],{"id":448},"ref-filter-optimization","Ref-filter optimization",[12,451,452,453,456,457,460,461,464],{},"The 'ref-filter' subsystem is some formatting code used by commands like ",[102,454,455],{},"git for-each-ref",", ",[102,458,459],{},"git branch"," and ",[102,462,463],{},"git tag"," to sort, filter, format, and display information related to Git references.",[12,466,467],{},"As repositories grow, they can contain a huge number of references. This is why there is work not only on improving backends that store references, like the reftables backend (see above), but\nalso on optimizing formatting code, like the 'ref-filter' subsystem.",[12,469,470,471,476],{},"We recently ",[16,472,475],{"href":473,"rel":474},"https://lore.kernel.org/git/d23c3e3ee7fdb49fcd05b4f2e52dd2a1cfdc10f2.1729510342.git.ps@pks.im/",[],"found a way","\nto avoid temporarily buffering references and iterating several times on them in the ref-filter code when they should be processed in the same sorting order as the order the backends provide them. This results in memory savings and makes certain commands up to 770 times faster in some\ncases.",[12,478,224,479,228],{},[16,480,64],{"href":62,"rel":481},[],[23,483,485],{"id":484},"read-more","Read more",[12,487,488,489,494],{},"This blog post 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 official release announcement of the Git project. Also, check out ",[16,490,493],{"href":491,"rel":492},"https://about.gitlab.com/blog/tags/git/",[],"our previous Git release blog posts"," to see other past highlights of contributions from GitLab team members.",[76,496,497,504,511,517],{},[79,498,499],{},[16,500,503],{"href":501,"rel":502},"https://about.gitlab.com/blog/whats-new-in-git-2-47-0/",[],"What’s new in Git 2.47.0?",[79,505,506],{},[16,507,510],{"href":508,"rel":509},"https://about.gitlab.com/blog/whats-new-in-git-2-46-0/",[],"What’s new in Git 2.46.0?",[79,512,513],{},[16,514,516],{"href":374,"rel":515},[],"What’s new in Git 2.45.0",[79,518,519],{},[16,520,522],{"href":380,"rel":521},[],"A beginner's guide to the Git reftable format",[524,525,526],"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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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);}",{"title":100,"searchDepth":126,"depth":126,"links":528},[529,530,531,532,533,534,536,537],{"id":25,"depth":126,"text":26},{"id":231,"depth":126,"text":232},{"id":255,"depth":126,"text":256},{"id":323,"depth":126,"text":324},{"id":361,"depth":126,"text":362},{"id":402,"depth":126,"text":535},"Support for reflogs in git-refs migrate",{"id":448,"depth":126,"text":449},{"id":484,"depth":126,"text":485},"open-source","2025-01-10","Learn about the latest version of Git, including a new build system and optimization in the new reftable backend. Discover contributions from GitLab's Git team and the Git community.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663691/Blog/Hero%20Images/AdobeStock_752438815.jpg",{},"/en-us/blog/whats-new-in-git-2-48-0",{"title":5,"description":540,"ogTitle":5,"ogDescription":540,"noIndex":548,"ogImage":544,"ogUrl":549,"ogSiteName":550,"ogType":551,"canonicalUrls":549},false,"https://about.gitlab.com/blog/whats-new-in-git-2-48-0","https://about.gitlab.com","article","whats-new-in-git-2-48-0","en-us/blog/whats-new-in-git-2-48-0",[555,556,557],"git","open source","community","BlogPost","ZemrpVNizyasPF3-U711Btti6dVW-BOOExPm8DE8XCQ",{"logo":561,"freeTrial":566,"sales":571,"login":576,"items":581,"search":907,"minimal":938,"duo":957,"switchNav":966,"pricingDeployment":977},{"config":562},{"href":563,"dataGaName":564,"dataGaLocation":565},"/","gitlab logo","header",{"text":567,"config":568},"Get free trial",{"href":569,"dataGaName":570,"dataGaLocation":565},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":572,"config":573},"Request a demo",{"href":574,"dataGaName":575,"dataGaLocation":565},"/sales/?contact-topic=request-demo","sales",{"text":577,"config":578},"Sign in",{"href":579,"dataGaName":580,"dataGaLocation":565},"https://gitlab.com/users/sign_in/","sign in",[582,611,711,716,829,885],{"text":583,"config":584,"menu":586},"Platform",{"dataNavLevelOne":585},"platform",{"type":587,"columns":588},"cards",[589,595,603],{"title":583,"description":590,"link":591},"The intelligent orchestration platform for DevSecOps",{"text":592,"config":593},"Explore our Platform",{"href":594,"dataGaName":585,"dataGaLocation":565},"/platform/",{"title":596,"description":597,"link":598},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":599,"config":600},"Meet GitLab Duo",{"href":601,"dataGaName":602,"dataGaLocation":565},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":604,"description":605,"link":606},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":607,"config":608},"Learn more",{"href":609,"dataGaName":610,"dataGaLocation":565},"/why-gitlab/","why gitlab",{"text":612,"left":543,"config":613,"menu":615},"Product",{"dataNavLevelOne":614},"solutions",{"type":616,"link":617,"columns":621,"feature":690},"lists",{"text":618,"config":619},"View all Solutions",{"href":620,"dataGaName":614,"dataGaLocation":565},"/solutions/",[622,646,669],{"title":623,"description":624,"link":625,"items":630},"Automation","CI/CD and automation to accelerate deployment",{"config":626},{"icon":627,"href":628,"dataGaName":629,"dataGaLocation":565},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[631,635,638,642],{"text":632,"config":633},"CI/CD",{"href":634,"dataGaLocation":565,"dataGaName":632},"/solutions/continuous-integration/",{"text":596,"config":636},{"href":601,"dataGaLocation":565,"dataGaName":637},"gitlab duo agent platform - product menu",{"text":639,"config":640},"Source Code Management",{"href":641,"dataGaLocation":565,"dataGaName":639},"/solutions/source-code-management/",{"text":643,"config":644},"Automated Software Delivery",{"href":628,"dataGaLocation":565,"dataGaName":645},"Automated software delivery",{"title":647,"description":648,"link":649,"items":654},"Security","Deliver code faster without compromising security",{"config":650},{"href":651,"dataGaName":652,"dataGaLocation":565,"icon":653},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[655,659,664],{"text":656,"config":657},"Application Security Testing",{"href":651,"dataGaName":658,"dataGaLocation":565},"Application security testing",{"text":660,"config":661},"Software Supply Chain Security",{"href":662,"dataGaLocation":565,"dataGaName":663},"/solutions/supply-chain/","Software supply chain security",{"text":665,"config":666},"Software Compliance",{"href":667,"dataGaName":668,"dataGaLocation":565},"/solutions/software-compliance/","software compliance",{"title":670,"link":671,"items":676},"Measurement",{"config":672},{"icon":673,"href":674,"dataGaName":675,"dataGaLocation":565},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[677,681,685],{"text":678,"config":679},"Visibility & Measurement",{"href":674,"dataGaLocation":565,"dataGaName":680},"Visibility and Measurement",{"text":682,"config":683},"Value Stream Management",{"href":684,"dataGaLocation":565,"dataGaName":682},"/solutions/value-stream-management/",{"text":686,"config":687},"Analytics & Insights",{"href":688,"dataGaLocation":565,"dataGaName":689},"/solutions/analytics-and-insights/","Analytics and insights",{"title":691,"type":616,"items":692},"GitLab for",[693,699,705],{"text":694,"config":695},"Enterprise",{"icon":696,"href":697,"dataGaLocation":565,"dataGaName":698},"Building","/enterprise/","enterprise",{"text":700,"config":701},"Small Business",{"icon":702,"href":703,"dataGaLocation":565,"dataGaName":704},"Work","/small-business/","small business",{"text":706,"config":707},"Public Sector",{"icon":708,"href":709,"dataGaLocation":565,"dataGaName":710},"Organization","/solutions/public-sector/","public sector",{"text":712,"config":713},"Pricing",{"href":714,"dataGaName":715,"dataGaLocation":565,"dataNavLevelOne":715},"/pricing/","pricing",{"text":717,"config":718,"menu":720},"Resources",{"dataNavLevelOne":719},"resources",{"type":616,"link":721,"columns":725,"feature":818},{"text":722,"config":723},"View all resources",{"href":724,"dataGaName":719,"dataGaLocation":565},"/resources/",[726,759,786],{"title":727,"items":728},"Getting started",[729,734,739,744,749,754],{"text":730,"config":731},"Install",{"href":732,"dataGaName":733,"dataGaLocation":565},"/install/","install",{"text":735,"config":736},"Quick start guides",{"href":737,"dataGaName":738,"dataGaLocation":565},"/get-started/","quick setup checklists",{"text":740,"config":741},"Learn",{"href":742,"dataGaLocation":565,"dataGaName":743},"https://university.gitlab.com/","learn",{"text":745,"config":746},"Product documentation",{"href":747,"dataGaName":748,"dataGaLocation":565},"https://docs.gitlab.com/","product documentation",{"text":750,"config":751},"Best practice videos",{"href":752,"dataGaName":753,"dataGaLocation":565},"/getting-started-videos/","best practice videos",{"text":755,"config":756},"Integrations",{"href":757,"dataGaName":758,"dataGaLocation":565},"/integrations/","integrations",{"title":760,"items":761},"Discover",[762,767,772,777,781],{"text":763,"config":764},"Customer success stories",{"href":765,"dataGaName":766,"dataGaLocation":565},"/customers/","customer success stories",{"text":768,"config":769},"Blog",{"href":770,"dataGaName":771,"dataGaLocation":565},"/blog/","blog",{"text":773,"config":774},"Demo Hub",{"href":775,"dataGaName":776,"dataGaLocation":565},"/demo-hub/","demo hub",{"text":778,"config":779},"The Source",{"href":780,"dataGaName":771,"dataGaLocation":565},"/the-source/",{"text":782,"config":783},"Remote",{"href":784,"dataGaName":785,"dataGaLocation":565},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":787,"items":788},"Connect",[789,794,799,803,808,813],{"text":790,"config":791},"GitLab Services",{"href":792,"dataGaName":793,"dataGaLocation":565},"/services/","services",{"text":795,"config":796},"Contribute",{"href":797,"dataGaName":798,"dataGaLocation":565},"https://contributors.gitlab.com","contribute",{"text":800,"config":801},"Community",{"href":802,"dataGaName":557,"dataGaLocation":565},"/community/",{"text":804,"config":805},"Forum",{"href":806,"dataGaName":807,"dataGaLocation":565},"https://forum.gitlab.com/","forum",{"text":809,"config":810},"Events",{"href":811,"dataGaName":812,"dataGaLocation":565},"/events/","events",{"text":814,"config":815},"Partners",{"href":816,"dataGaName":817,"dataGaLocation":565},"/partners/","partners",{"config":819,"title":822,"text":823,"link":824},{"background":820,"textColor":821},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":825,"config":826},"Read the latest",{"href":827,"dataGaName":828,"dataGaLocation":565},"/whats-new/","whats new",{"text":830,"config":831,"menu":833},"Company",{"dataNavLevelOne":832},"company",{"type":616,"columns":834},[835],{"items":836},[837,842,848,850,855,860,865,870,875,880],{"text":838,"config":839},"About",{"href":840,"dataGaName":841,"dataGaLocation":565},"/company/","about",{"text":843,"config":844,"footerGa":847},"Jobs",{"href":845,"dataGaName":846,"dataGaLocation":565},"/jobs/","jobs",{"dataGaName":846},{"text":809,"config":849},{"href":811,"dataGaName":812,"dataGaLocation":565},{"text":851,"config":852},"Leadership",{"href":853,"dataGaName":854,"dataGaLocation":565},"/company/team/e-group/","leadership",{"text":856,"config":857},"Handbook",{"href":858,"dataGaName":859,"dataGaLocation":565},"https://handbook.gitlab.com/","handbook",{"text":861,"config":862},"Investor relations",{"href":863,"dataGaName":864,"dataGaLocation":565},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":866,"config":867},"Trust Center",{"href":868,"dataGaName":869,"dataGaLocation":565},"/security/","trust center",{"text":871,"config":872},"AI Transparency Center",{"href":873,"dataGaName":874,"dataGaLocation":565},"/ai-transparency-center/","ai transparency center",{"text":876,"config":877},"Newsletter",{"href":878,"dataGaName":879,"dataGaLocation":565},"/company/contact/#contact-forms","newsletter",{"text":881,"config":882},"Press",{"href":883,"dataGaName":884,"dataGaLocation":565},"/press/","press",{"text":886,"config":887,"menu":888},"Contact us",{"dataNavLevelOne":832},{"type":616,"columns":889},[890],{"items":891},[892,897,902],{"text":893,"config":894},"Talk to sales",{"href":895,"dataGaName":896,"dataGaLocation":565},"/sales/","talk to sales",{"text":898,"config":899},"Support portal",{"href":900,"dataGaName":901,"dataGaLocation":565},"https://support.gitlab.com/hc/en-us","support portal",{"text":903,"config":904},"Customer portal",{"href":905,"dataGaName":906,"dataGaLocation":565},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":908,"login":909,"suggestions":916},"Close",{"text":910,"link":911},"To search repositories and projects, login to",{"text":912,"config":913},"gitlab.com",{"href":579,"dataGaName":914,"dataGaLocation":915},"search login","search",{"text":917,"default":918},"Suggestions",[919,921,925,927,931,935],{"text":596,"config":920},{"href":601,"dataGaName":596,"dataGaLocation":915},{"text":922,"config":923},"Code Suggestions (AI)",{"href":924,"dataGaName":922,"dataGaLocation":915},"/solutions/code-suggestions/",{"text":632,"config":926},{"href":634,"dataGaName":632,"dataGaLocation":915},{"text":928,"config":929},"GitLab on AWS",{"href":930,"dataGaName":928,"dataGaLocation":915},"/partners/technology-partners/aws/",{"text":932,"config":933},"GitLab on Google Cloud",{"href":934,"dataGaName":932,"dataGaLocation":915},"/partners/technology-partners/google-cloud-platform/",{"text":936,"config":937},"Why GitLab?",{"href":609,"dataGaName":936,"dataGaLocation":915},{"freeTrial":939,"mobileIcon":944,"desktopIcon":949,"secondaryButton":952},{"text":940,"config":941},"Start free trial",{"href":942,"dataGaName":570,"dataGaLocation":943},"https://gitlab.com/-/trials/new/","nav",{"altText":945,"config":946},"Gitlab Icon",{"src":947,"dataGaName":948,"dataGaLocation":943},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":945,"config":950},{"src":951,"dataGaName":948,"dataGaLocation":943},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":953,"config":954},"Get Started",{"href":955,"dataGaName":956,"dataGaLocation":943},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":958,"mobileIcon":962,"desktopIcon":964},{"text":959,"config":960},"Learn more about GitLab Duo",{"href":601,"dataGaName":961,"dataGaLocation":943},"gitlab duo",{"altText":945,"config":963},{"src":947,"dataGaName":948,"dataGaLocation":943},{"altText":945,"config":965},{"src":951,"dataGaName":948,"dataGaLocation":943},{"button":967,"mobileIcon":972,"desktopIcon":974},{"text":968,"config":969},"/switch",{"href":970,"dataGaName":971,"dataGaLocation":943},"#contact","switch",{"altText":945,"config":973},{"src":947,"dataGaName":948,"dataGaLocation":943},{"altText":945,"config":975},{"src":976,"dataGaName":948,"dataGaLocation":943},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":978,"mobileIcon":983,"desktopIcon":985},{"text":979,"config":980},"Back to pricing",{"href":714,"dataGaName":981,"dataGaLocation":943,"icon":982},"back to pricing","GoBack",{"altText":945,"config":984},{"src":947,"dataGaName":948,"dataGaLocation":943},{"altText":945,"config":986},{"src":951,"dataGaName":948,"dataGaLocation":943},{"title":988,"titleMobile":989,"button":990,"config":995},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":607,"config":991},{"href":992,"dataGaName":993,"dataGaLocation":994},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":996,"disabled":548},"release",{"data":998},{"text":999,"source":1000,"edit":1006,"contribute":1011,"config":1016,"items":1021,"minimal":1231},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1001,"config":1002},"View page source",{"href":1003,"dataGaName":1004,"dataGaLocation":1005},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1007,"config":1008},"Edit this page",{"href":1009,"dataGaName":1010,"dataGaLocation":1005},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1012,"config":1013},"Please contribute",{"href":1014,"dataGaName":1015,"dataGaLocation":1005},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1017,"facebook":1018,"youtube":1019,"linkedin":1020},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1022,1069,1123,1167,1199],{"title":712,"links":1023,"subMenu":1038},[1024,1028,1033],{"text":1025,"config":1026},"View plans",{"href":714,"dataGaName":1027,"dataGaLocation":1005},"view plans",{"text":1029,"config":1030},"Why Premium?",{"href":1031,"dataGaName":1032,"dataGaLocation":1005},"/pricing/premium/","why premium",{"text":1034,"config":1035},"Why Ultimate?",{"href":1036,"dataGaName":1037,"dataGaLocation":1005},"/pricing/ultimate/","why ultimate",[1039],{"title":1040,"links":1041},"Contact Us",[1042,1045,1047,1049,1054,1059,1064],{"text":1043,"config":1044},"Contact sales",{"href":895,"dataGaName":575,"dataGaLocation":1005},{"text":898,"config":1046},{"href":900,"dataGaName":901,"dataGaLocation":1005},{"text":903,"config":1048},{"href":905,"dataGaName":906,"dataGaLocation":1005},{"text":1050,"config":1051},"Status",{"href":1052,"dataGaName":1053,"dataGaLocation":1005},"https://status.gitlab.com/","status",{"text":1055,"config":1056},"Terms of use",{"href":1057,"dataGaName":1058,"dataGaLocation":1005},"/terms/","terms of use",{"text":1060,"config":1061},"Privacy statement",{"href":1062,"dataGaName":1063,"dataGaLocation":1005},"/privacy/","privacy statement",{"text":1065,"config":1066},"Cookie preferences",{"dataGaName":1067,"dataGaLocation":1005,"id":1068,"isOneTrustButton":543},"cookie preferences","ot-sdk-btn",{"title":612,"links":1070,"subMenu":1079},[1071,1075],{"text":1072,"config":1073},"DevSecOps platform",{"href":594,"dataGaName":1074,"dataGaLocation":1005},"devsecops platform",{"text":1076,"config":1077},"AI-Assisted Development",{"href":601,"dataGaName":1078,"dataGaLocation":1005},"ai-assisted development",[1080],{"title":1081,"links":1082},"Topics",[1083,1088,1093,1098,1103,1108,1113,1118],{"text":1084,"config":1085},"CICD",{"href":1086,"dataGaName":1087,"dataGaLocation":1005},"/topics/ci-cd/","cicd",{"text":1089,"config":1090},"GitOps",{"href":1091,"dataGaName":1092,"dataGaLocation":1005},"/topics/gitops/","gitops",{"text":1094,"config":1095},"DevOps",{"href":1096,"dataGaName":1097,"dataGaLocation":1005},"/topics/devops/","devops",{"text":1099,"config":1100},"Version Control",{"href":1101,"dataGaName":1102,"dataGaLocation":1005},"/topics/version-control/","version control",{"text":1104,"config":1105},"DevSecOps",{"href":1106,"dataGaName":1107,"dataGaLocation":1005},"/topics/devsecops/","devsecops",{"text":1109,"config":1110},"Cloud Native",{"href":1111,"dataGaName":1112,"dataGaLocation":1005},"/topics/cloud-native/","cloud native",{"text":1114,"config":1115},"AI for Coding",{"href":1116,"dataGaName":1117,"dataGaLocation":1005},"/topics/devops/ai-for-coding/","ai for coding",{"text":1119,"config":1120},"Agentic AI",{"href":1121,"dataGaName":1122,"dataGaLocation":1005},"/topics/agentic-ai/","agentic ai",{"title":1124,"links":1125},"Solutions",[1126,1128,1130,1135,1139,1142,1146,1149,1151,1154,1157,1162],{"text":656,"config":1127},{"href":651,"dataGaName":656,"dataGaLocation":1005},{"text":645,"config":1129},{"href":628,"dataGaName":629,"dataGaLocation":1005},{"text":1131,"config":1132},"Agile development",{"href":1133,"dataGaName":1134,"dataGaLocation":1005},"/solutions/agile-delivery/","agile delivery",{"text":1136,"config":1137},"SCM",{"href":641,"dataGaName":1138,"dataGaLocation":1005},"source code management",{"text":1084,"config":1140},{"href":634,"dataGaName":1141,"dataGaLocation":1005},"continuous integration & delivery",{"text":1143,"config":1144},"Value stream management",{"href":684,"dataGaName":1145,"dataGaLocation":1005},"value stream management",{"text":1089,"config":1147},{"href":1148,"dataGaName":1092,"dataGaLocation":1005},"/solutions/gitops/",{"text":694,"config":1150},{"href":697,"dataGaName":698,"dataGaLocation":1005},{"text":1152,"config":1153},"Small business",{"href":703,"dataGaName":704,"dataGaLocation":1005},{"text":1155,"config":1156},"Public sector",{"href":709,"dataGaName":710,"dataGaLocation":1005},{"text":1158,"config":1159},"Education",{"href":1160,"dataGaName":1161,"dataGaLocation":1005},"/solutions/education/","education",{"text":1163,"config":1164},"Financial services",{"href":1165,"dataGaName":1166,"dataGaLocation":1005},"/solutions/finance/","financial services",{"title":717,"links":1168},[1169,1171,1173,1175,1178,1180,1183,1185,1187,1189,1191,1193,1195,1197],{"text":730,"config":1170},{"href":732,"dataGaName":733,"dataGaLocation":1005},{"text":735,"config":1172},{"href":737,"dataGaName":738,"dataGaLocation":1005},{"text":740,"config":1174},{"href":742,"dataGaName":743,"dataGaLocation":1005},{"text":745,"config":1176},{"href":747,"dataGaName":1177,"dataGaLocation":1005},"docs",{"text":768,"config":1179},{"href":770,"dataGaName":771,"dataGaLocation":1005},{"text":1181,"config":1182},"What's new",{"href":827,"dataGaName":828,"dataGaLocation":1005},{"text":763,"config":1184},{"href":765,"dataGaName":766,"dataGaLocation":1005},{"text":782,"config":1186},{"href":784,"dataGaName":785,"dataGaLocation":1005},{"text":790,"config":1188},{"href":792,"dataGaName":793,"dataGaLocation":1005},{"text":795,"config":1190},{"href":797,"dataGaName":798,"dataGaLocation":1005},{"text":800,"config":1192},{"href":802,"dataGaName":557,"dataGaLocation":1005},{"text":804,"config":1194},{"href":806,"dataGaName":807,"dataGaLocation":1005},{"text":809,"config":1196},{"href":811,"dataGaName":812,"dataGaLocation":1005},{"text":814,"config":1198},{"href":816,"dataGaName":817,"dataGaLocation":1005},{"title":830,"links":1200},[1201,1203,1205,1207,1209,1211,1215,1220,1222,1224,1226],{"text":838,"config":1202},{"href":840,"dataGaName":832,"dataGaLocation":1005},{"text":843,"config":1204},{"href":845,"dataGaName":846,"dataGaLocation":1005},{"text":851,"config":1206},{"href":853,"dataGaName":854,"dataGaLocation":1005},{"text":856,"config":1208},{"href":858,"dataGaName":859,"dataGaLocation":1005},{"text":861,"config":1210},{"href":863,"dataGaName":864,"dataGaLocation":1005},{"text":1212,"config":1213},"Sustainability",{"href":1214,"dataGaName":1212,"dataGaLocation":1005},"/sustainability/",{"text":1216,"config":1217},"Diversity, inclusion and belonging (DIB)",{"href":1218,"dataGaName":1219,"dataGaLocation":1005},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":866,"config":1221},{"href":868,"dataGaName":869,"dataGaLocation":1005},{"text":876,"config":1223},{"href":878,"dataGaName":879,"dataGaLocation":1005},{"text":881,"config":1225},{"href":883,"dataGaName":884,"dataGaLocation":1005},{"text":1227,"config":1228},"Modern Slavery Transparency Statement",{"href":1229,"dataGaName":1230,"dataGaLocation":1005},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1232},[1233,1236,1239],{"text":1234,"config":1235},"Terms",{"href":1057,"dataGaName":1058,"dataGaLocation":1005},{"text":1237,"config":1238},"Cookies",{"dataGaName":1067,"dataGaLocation":1005,"id":1068,"isOneTrustButton":543},{"text":1240,"config":1241},"Privacy",{"href":1062,"dataGaName":1063,"dataGaLocation":1005},[1243],{"id":1244,"title":7,"body":542,"config":1245,"content":1247,"description":542,"extension":1251,"meta":1252,"navigation":543,"path":1253,"seo":1254,"stem":1255,"__hash__":1256},"blogAuthors/en-us/blog/authors/christian-couder.yml",{"template":1246},"BlogAuthor",{"name":7,"config":1248},{"headshot":1249,"ctfId":1250},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663687/Blog/Author%20Headshots/chriscool-headshot.jpg","chriscool","yml",{},"/en-us/blog/authors/christian-couder",{},"en-us/blog/authors/christian-couder","6VsKjKNdm1XKAmFMZHj53ROyylDlxaSJhcARRkw6EQQ",[1258,1266,1274],{"title":1259,"description":1260,"heroImage":1261,"category":538,"date":1262,"authors":1263,"slug":1265,"externalUrl":542},"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.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1264],"Toon Claes","whats-new-in-git-2-55-0",{"title":1267,"description":1268,"heroImage":1269,"category":538,"date":1270,"authors":1271,"slug":1273,"externalUrl":542},"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",[1272],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1275,"description":1276,"heroImage":1277,"category":538,"date":1278,"authors":1279,"slug":1280,"externalUrl":542},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[64],"whats-new-in-git-2-54-0",{"promotions":1282},[1283,1297,1309,1321],{"id":1284,"categories":1285,"header":1287,"text":1288,"button":1289,"image":1294},"ai-modernization",[1286],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1290,"config":1291},"Get your AI maturity score",{"href":1292,"dataGaName":1293,"dataGaLocation":771},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1295},{"src":1296},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1298,"categories":1299,"header":1301,"text":1288,"button":1302,"image":1306},"devops-modernization",[1300,1107],"product","Are you just managing tools or shipping innovation?",{"text":1303,"config":1304},"Get your DevOps maturity score",{"href":1305,"dataGaName":1293,"dataGaLocation":771},"/assessments/devops-modernization-assessment/",{"config":1307},{"src":1308},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1310,"categories":1311,"header":1313,"text":1288,"button":1314,"image":1318},"security-modernization",[1312],"security","Are you trading speed for security?",{"text":1315,"config":1316},"Get your security maturity score",{"href":1317,"dataGaName":1293,"dataGaLocation":771},"/assessments/security-modernization-assessment/",{"config":1319},{"src":1320},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1322,"paths":1323,"header":1326,"text":1327,"button":1328,"image":1333},"github-azure-migration",[1324,1325],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1329,"config":1330},"See how GitLab compares to GitHub",{"href":1331,"dataGaName":1332,"dataGaLocation":771},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1334},{"src":1308},{"header":1336,"blurb":1337,"button":1338,"secondaryButton":1343},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1339,"config":1340},"Get your free trial",{"href":1341,"dataGaName":570,"dataGaLocation":1342},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1043,"config":1344},{"href":895,"dataGaName":575,"dataGaLocation":1342},1786803739216]