[{"data":1,"prerenderedAt":1738},["ShallowReactive",2],{"/blog/rebase-in-real-life":3,"navigation-en-us":950,"banner-en-us":1378,"footer-en-us":1388,"blog-post-authors-en-us-Toon Claes":1633,"blog-related-posts-en-us-rebase-in-real-life":1648,"blog-promotions-en-us":1674,"next-steps-en-us":1728},{"id":4,"title":5,"authors":6,"body":8,"category":930,"date":931,"description":932,"extension":933,"externalUrl":934,"faq":934,"featured":935,"heroImage":936,"meta":937,"navigation":69,"path":938,"seo":939,"slug":943,"stem":944,"tags":945,"template":948,"updatedDate":934,"__hash__":949},"blogPosts/en-us/blog/rebase-in-real-life.md","How to use Git rebase in real life",[7],"Toon Claes",{"type":9,"value":10,"toc":922},"minimark",[11,21,26,34,219,222,227,230,233,289,308,358,369,372,376,379,399,406,414,417,423,432,444,510,514,517,532,558,578,581,665,672,801,808,828,848,852,860,899,918],[12,13,14,15,20],"p",{},"My colleague Chris recently wrote about ",[16,17,19],"a",{"href":18},"/blog/take-advantage-of-git-rebase/","how to take advantage of Git\nrebase",". In this post we'll\nexplain how you can take these techniques, and apply them to daily developer life.",[22,23,25],"h2",{"id":24},"fixup","Fixup",[12,27,28,29,33],{},"Imagine you have created a merge request, and there are some pipeline failures\nand some comments from reviews, and suddenly your ",[16,30,32],{"href":31},"/blog/keeping-git-commit-history-clean/","commit history"," looks something\nlike this:",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-shell shiki shiki-themes github-light","$ git log --oneline\n\n8f8ef5af (HEAD -> my-change) More CI fixes\ne4fb7935 Apply suggestion from reviewer\nc1a1bec6 Apply suggestion from reviewer\n673222be Make linter happy\na0c30577 Fix CI failure for X\n5ff160db Implement feature Y\nf68080e3 Implement feature X\n3cdbc201 (origin/main, origin/HEAD, main) Merge branch 'other-change' into 'main'\n...\n","shell","",[42,43,44,64,71,91,109,123,138,159,174,186,213],"code",{"__ignoreMap":40},[45,46,49,53,57,60],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"s7eDp","$",[45,54,56],{"class":55},"sYBdl"," git",[45,58,59],{"class":55}," log",[45,61,63],{"class":62},"sYu0t"," --oneline\n",[45,65,67],{"class":47,"line":66},2,[45,68,70],{"emptyLinePlaceholder":69},true,"\n",[45,72,74,77,81,85,88],{"class":47,"line":73},3,[45,75,76],{"class":51},"8f8ef5af",[45,78,80],{"class":79},"sgsFI"," (HEAD -",[45,82,84],{"class":83},"sD7c4",">",[45,86,87],{"class":55}," my-change",[45,89,90],{"class":79},") More CI fixes\n",[45,92,94,97,100,103,106],{"class":47,"line":93},4,[45,95,96],{"class":51},"e4fb7935",[45,98,99],{"class":55}," Apply",[45,101,102],{"class":55}," suggestion",[45,104,105],{"class":55}," from",[45,107,108],{"class":55}," reviewer\n",[45,110,112,115,117,119,121],{"class":47,"line":111},5,[45,113,114],{"class":51},"c1a1bec6",[45,116,99],{"class":55},[45,118,102],{"class":55},[45,120,105],{"class":55},[45,122,108],{"class":55},[45,124,126,129,132,135],{"class":47,"line":125},6,[45,127,128],{"class":51},"673222be",[45,130,131],{"class":55}," Make",[45,133,134],{"class":55}," linter",[45,136,137],{"class":55}," happy\n",[45,139,141,144,147,150,153,156],{"class":47,"line":140},7,[45,142,143],{"class":51},"a0c30577",[45,145,146],{"class":55}," Fix",[45,148,149],{"class":55}," CI",[45,151,152],{"class":55}," failure",[45,154,155],{"class":55}," for",[45,157,158],{"class":55}," X\n",[45,160,162,165,168,171],{"class":47,"line":161},8,[45,163,164],{"class":51},"5ff160db",[45,166,167],{"class":55}," Implement",[45,169,170],{"class":55}," feature",[45,172,173],{"class":55}," Y\n",[45,175,177,180,182,184],{"class":47,"line":176},9,[45,178,179],{"class":51},"f68080e3",[45,181,167],{"class":55},[45,183,170],{"class":55},[45,185,158],{"class":55},[45,187,189,192,195,198,201,204,207,210],{"class":47,"line":188},10,[45,190,191],{"class":51},"3cdbc201",[45,193,194],{"class":79}," (origin/main, ",[45,196,197],{"class":55},"origin/HEAD,",[45,199,200],{"class":55}," main",[45,202,203],{"class":79},") Merge branch ",[45,205,206],{"class":55},"'other-change'",[45,208,209],{"class":79}," into ",[45,211,212],{"class":55},"'main'\n",[45,214,216],{"class":47,"line":215},11,[45,217,218],{"class":62},"...\n",[12,220,221],{},"In this example there are 2 commits implementing feature X and Y, followed by a\nhandful of commits that aren't useful on their own. We used the fixup feature of\nGit rebase to get rid of them.",[223,224,226],"h3",{"id":225},"finding-the-commit","Finding the commit",[12,228,229],{},"The idea of this technique is to integrate the changes of these follow-up\ncommits into the commits that introduced each feature. This means for each\nfollow-up commit we need to determine which commit they belong to.",[12,231,232],{},"Based on the filename you may already know which commits belong together, but if\nyou don't you can use git-blame to find the commit.",[35,234,236],{"className":37,"code":235,"language":39,"meta":40,"style":40},"git blame \u003Crevision> -L\u003Cstart>,\u003Cend> \u003Cfilename>\n",[42,237,238],{"__ignoreMap":40},[45,239,240,243,246,249,252,255,257,260,263,266,268,271,273,276,278,280,283,286],{"class":47,"line":48},[45,241,242],{"class":51},"git",[45,244,245],{"class":55}," blame",[45,247,248],{"class":83}," \u003C",[45,250,251],{"class":55},"revisio",[45,253,254],{"class":79},"n",[45,256,84],{"class":83},[45,258,259],{"class":62}," -L",[45,261,262],{"class":83},"\u003C",[45,264,265],{"class":62},"start",[45,267,84],{"class":83},[45,269,270],{"class":62},",",[45,272,262],{"class":83},[45,274,275],{"class":62},"end",[45,277,84],{"class":83},[45,279,248],{"class":83},[45,281,282],{"class":55},"filenam",[45,284,285],{"class":79},"e",[45,287,288],{"class":83},">\n",[12,290,291,292,295,296,299,300,303,304,307],{},"With the option ",[42,293,294],{},"-L"," we'll specify a range of a line numbers we're interested in.\nHere ",[42,297,298],{},"\u003Cend>"," cannot be omitted, but it can be the same as ",[42,301,302],{},"\u003Cstart>",". You can\nomit ",[42,305,306],{},"\u003Crevision>",", but you probably shouldn't because you want to skip over the\ncommits you want to rebase away. Your command will look something like this:",[35,309,311],{"className":37,"code":310,"language":39,"meta":40,"style":40},"$ git blame 5ff160db -L22,22 app/model/user.rb\n\nf68080e3 22) scope :admins, -> { where(admin: true) }\n",[42,312,313,330,334],{"__ignoreMap":40},[45,314,315,317,319,321,324,327],{"class":47,"line":48},[45,316,52],{"class":51},[45,318,56],{"class":55},[45,320,245],{"class":55},[45,322,323],{"class":55}," 5ff160db",[45,325,326],{"class":62}," -L22,22",[45,328,329],{"class":55}," app/model/user.rb\n",[45,331,332],{"class":47,"line":66},[45,333,70],{"emptyLinePlaceholder":69},[45,335,336,338,341,344,346,349,352,355],{"class":47,"line":73},[45,337,179],{"class":51},[45,339,340],{"class":62}," 22",[45,342,343],{"class":79},") scope :admins, -",[45,345,84],{"class":83},[45,347,348],{"class":79}," { ",[45,350,351],{"class":51},"where(admin:",[45,353,354],{"class":62}," true",[45,356,357],{"class":79},") }\n",[12,359,360,361,364,365,368],{},"This tells us line ",[42,362,363],{},"22"," was touched by ",[42,366,367],{},"f68080e3 Implement feature X",".",[12,370,371],{},"Now repeat this step until you know the commit for each of the commits you want\nto rebase out.",[223,373,375],{"id":374},"interactive-rebase","Interactive rebase",[12,377,378],{},"The next step is to start the interactive rebase:",[35,380,382],{"className":37,"code":381,"language":39,"meta":40,"style":40},"$ git rebase -i main\n",[42,383,384],{"__ignoreMap":40},[45,385,386,388,390,393,396],{"class":47,"line":48},[45,387,52],{"class":51},[45,389,56],{"class":55},[45,391,392],{"class":55}," rebase",[45,394,395],{"class":62}," -i",[45,397,398],{"class":55}," main\n",[12,400,401,402,405],{},"Here you're presented with the list of instructions in your ",[42,403,404],{},"$EDITOR",":",[35,407,412],{"className":408,"code":410,"language":411,"meta":40},[409],"language-text","pick 8f8ef5af More CI fixes\npick e4fb7935 Apply suggestion from reviewer\npick c1a1bec6 Apply suggestion from reviewer\npick 673222be Make linter happy\npick a0c30577 Fix CI failure for X\npick 5ff160db Implement feature Y\npick f68080e3 Implement feature X\n","text",[42,413,410],{"__ignoreMap":40},[12,415,416],{},"Now you'll need to change these instructions to something like this:",[35,418,421],{"className":419,"code":420,"language":411,"meta":40},[409],"fixup 8f8ef5af More CI fixes\nfixup e4fb7935 Apply suggestion from reviewer\nfixup 673222be Make linter happy\npick 5ff160db Implement feature Y\nfixup c1a1bec6 Apply suggestion from reviewer\nfixup a0c30577 Fix CI failure for X\npick f68080e3 Implement feature X\n",[42,422,420],{"__ignoreMap":40},[12,424,425,426,429,430,368],{},"As you can see I've reordered the commits, and I've changed some occurrences of\n",[42,427,428],{},"pick"," to ",[42,431,24],{},[12,433,434,435,437,438,440,441,443],{},"The Git rebase will process this list bottom-to-top. It takes each line with\n",[42,436,428],{}," and uses its commit message. On each line starting with ",[42,439,24],{}," it\nintegrates the changes into the commit below. When you've saved this file and\nclosed your ",[42,442,404],{},", the Git history will look something like this:",[35,445,447],{"className":37,"code":446,"language":39,"meta":40,"style":40},"$ git log --oneline\n\ne880c726 (HEAD -> my-change) Implement feature Y\ne088ea06 Implement feature X\n3cdbc201 (origin/main, origin/HEAD, main) Merge branch 'other-change' into 'main'\n...\n",[42,448,449,459,463,477,488,506],{"__ignoreMap":40},[45,450,451,453,455,457],{"class":47,"line":48},[45,452,52],{"class":51},[45,454,56],{"class":55},[45,456,59],{"class":55},[45,458,63],{"class":62},[45,460,461],{"class":47,"line":66},[45,462,70],{"emptyLinePlaceholder":69},[45,464,465,468,470,472,474],{"class":47,"line":73},[45,466,467],{"class":51},"e880c726",[45,469,80],{"class":79},[45,471,84],{"class":83},[45,473,87],{"class":55},[45,475,476],{"class":79},") Implement feature Y\n",[45,478,479,482,484,486],{"class":47,"line":93},[45,480,481],{"class":51},"e088ea06",[45,483,167],{"class":55},[45,485,170],{"class":55},[45,487,158],{"class":55},[45,489,490,492,494,496,498,500,502,504],{"class":47,"line":111},[45,491,191],{"class":51},[45,493,194],{"class":79},[45,495,197],{"class":55},[45,497,200],{"class":55},[45,499,203],{"class":79},[45,501,206],{"class":55},[45,503,209],{"class":79},[45,505,212],{"class":55},[45,507,508],{"class":47,"line":125},[45,509,218],{"class":62},[22,511,513],{"id":512},"autosquash","Autosquash",[12,515,516],{},"Using autosquash can be an alternative technique to the above. First we'll\nuncommit all the commits we want to get rid of.",[35,518,520],{"className":37,"code":519,"language":39,"meta":40,"style":40},"git checkout f68080e3\n",[42,521,522],{"__ignoreMap":40},[45,523,524,526,529],{"class":47,"line":48},[45,525,242],{"class":51},[45,527,528],{"class":55}," checkout",[45,530,531],{"class":55}," f68080e3\n",[12,533,534,535,538,539,542,543,546,547,538,550,553,554,557],{},"Now all changes only exist in your working tree, and are gone from the commit\nhistory. You can use ",[42,536,537],{},"git add"," or ",[42,540,541],{},"git add -p"," to stage all changes related to\n",[42,544,545],{},"e088ea06 Implement feature X",". Instead of running ",[42,548,549],{},"git commit",[42,551,552],{},"git commit -m","\nwe'll use the ",[42,555,556],{},"--fixup"," option:",[35,559,561],{"className":37,"code":560,"language":39,"meta":40,"style":40},"$ git commit --fixup e088ea06\n",[42,562,563],{"__ignoreMap":40},[45,564,565,567,569,572,575],{"class":47,"line":48},[45,566,52],{"class":51},[45,568,56],{"class":55},[45,570,571],{"class":55}," commit",[45,573,574],{"class":62}," --fixup",[45,576,577],{"class":55}," e088ea06\n",[12,579,580],{},"Now the history will look something like:",[35,582,584],{"className":37,"code":583,"language":39,"meta":40,"style":40},"$ git log --oneline\n\ne744646b (HEAD -> my-change) fixup! Implement feature X\n5ff160db Implement feature Y\nf68080e3 Implement feature X\n3cdbc201 (origin/main, origin/HEAD, main) Merge branch 'other-change' into 'main'\n...\n",[42,585,586,596,600,623,633,643,661],{"__ignoreMap":40},[45,587,588,590,592,594],{"class":47,"line":48},[45,589,52],{"class":51},[45,591,56],{"class":55},[45,593,59],{"class":55},[45,595,63],{"class":62},[45,597,598],{"class":47,"line":66},[45,599,70],{"emptyLinePlaceholder":69},[45,601,602,605,607,609,611,614,617,619,621],{"class":47,"line":73},[45,603,604],{"class":51},"e744646b",[45,606,80],{"class":79},[45,608,84],{"class":83},[45,610,87],{"class":55},[45,612,613],{"class":79},") fixup",[45,615,616],{"class":83},"!",[45,618,167],{"class":51},[45,620,170],{"class":55},[45,622,158],{"class":55},[45,624,625,627,629,631],{"class":47,"line":93},[45,626,164],{"class":51},[45,628,167],{"class":55},[45,630,170],{"class":55},[45,632,173],{"class":55},[45,634,635,637,639,641],{"class":47,"line":111},[45,636,179],{"class":51},[45,638,167],{"class":55},[45,640,170],{"class":55},[45,642,158],{"class":55},[45,644,645,647,649,651,653,655,657,659],{"class":47,"line":125},[45,646,191],{"class":51},[45,648,194],{"class":79},[45,650,197],{"class":55},[45,652,200],{"class":55},[45,654,203],{"class":79},[45,656,206],{"class":55},[45,658,209],{"class":79},[45,660,212],{"class":55},[45,662,663],{"class":47,"line":140},[45,664,218],{"class":62},[12,666,667,668,671],{},"All remaining changes should now belong to ",[42,669,670],{},"5ff160db Implement feature Y"," so we\ncan run:",[35,673,675],{"className":37,"code":674,"language":39,"meta":40,"style":40},"$ git add .\n\n$ git commit --fixup 5ff160db\n\n$ git log --oneline\n\n18c0fff9 (HEAD -> my-change) fixup! Implement feature Y\ne744646b fixup! Implement feature X\n5ff160db Implement feature Y\nf68080e3 Implement feature X\n3cdbc201 (origin/main, origin/HEAD, main) Merge branch 'other-change' into 'main'\n...\n",[42,676,677,689,693,706,710,720,724,745,758,768,778,796],{"__ignoreMap":40},[45,678,679,681,683,686],{"class":47,"line":48},[45,680,52],{"class":51},[45,682,56],{"class":55},[45,684,685],{"class":55}," add",[45,687,688],{"class":55}," .\n",[45,690,691],{"class":47,"line":66},[45,692,70],{"emptyLinePlaceholder":69},[45,694,695,697,699,701,703],{"class":47,"line":73},[45,696,52],{"class":51},[45,698,56],{"class":55},[45,700,571],{"class":55},[45,702,574],{"class":62},[45,704,705],{"class":55}," 5ff160db\n",[45,707,708],{"class":47,"line":93},[45,709,70],{"emptyLinePlaceholder":69},[45,711,712,714,716,718],{"class":47,"line":111},[45,713,52],{"class":51},[45,715,56],{"class":55},[45,717,59],{"class":55},[45,719,63],{"class":62},[45,721,722],{"class":47,"line":125},[45,723,70],{"emptyLinePlaceholder":69},[45,725,726,729,731,733,735,737,739,741,743],{"class":47,"line":140},[45,727,728],{"class":51},"18c0fff9",[45,730,80],{"class":79},[45,732,84],{"class":83},[45,734,87],{"class":55},[45,736,613],{"class":79},[45,738,616],{"class":83},[45,740,167],{"class":51},[45,742,170],{"class":55},[45,744,173],{"class":55},[45,746,747,749,752,754,756],{"class":47,"line":161},[45,748,604],{"class":51},[45,750,751],{"class":55}," fixup!",[45,753,167],{"class":55},[45,755,170],{"class":55},[45,757,158],{"class":55},[45,759,760,762,764,766],{"class":47,"line":176},[45,761,164],{"class":51},[45,763,167],{"class":55},[45,765,170],{"class":55},[45,767,173],{"class":55},[45,769,770,772,774,776],{"class":47,"line":188},[45,771,179],{"class":51},[45,773,167],{"class":55},[45,775,170],{"class":55},[45,777,158],{"class":55},[45,779,780,782,784,786,788,790,792,794],{"class":47,"line":215},[45,781,191],{"class":51},[45,783,194],{"class":79},[45,785,197],{"class":55},[45,787,200],{"class":55},[45,789,203],{"class":79},[45,791,206],{"class":55},[45,793,209],{"class":79},[45,795,212],{"class":55},[45,797,799],{"class":47,"line":798},12,[45,800,218],{"class":62},[12,802,803,804,807],{},"You can now review the ",[42,805,806],{},"fixup!"," commits and if you're happy with it, run:",[35,809,811],{"className":37,"code":810,"language":39,"meta":40,"style":40},"$ git rebase -i --autosquash main\n",[42,812,813],{"__ignoreMap":40},[45,814,815,817,819,821,823,826],{"class":47,"line":48},[45,816,52],{"class":51},[45,818,56],{"class":55},[45,820,392],{"class":55},[45,822,395],{"class":62},[45,824,825],{"class":62}," --autosquash",[45,827,398],{"class":55},[12,829,830,831,834,835,837,838,840,841,844,845,847],{},"You see we provide the extra option ",[42,832,833],{},"--autosquash",". This option will look for\n",[42,836,806],{}," commits and automatically reorder those and set their instruction to\n",[42,839,24],{},". Normally there's nothing for you to be done now, and you can just close\nthe instruction list in your editor. If you type ",[42,842,843],{},"git log"," now you'll see the\n",[42,846,806],{}," commits are gone.",[22,849,851],{"id":850},"alternatives","Alternatives",[12,853,854,855,859],{},"Finally, there are some tools that allow you to ",[856,857,858],"em",{},"absorb"," commits more easily, for\nexample:",[861,862,863,871,878,885,892],"ul",{},[864,865,866],"li",{},[16,867,870],{"href":868,"rel":869},"https://lib.rs/crates/git-absorb",[],"lib.rs/crates/git-absorb",[864,872,873],{},[16,874,877],{"href":875,"rel":876},"https://github.com/MrFlynn/git-absorb",[],"github.com/MrFlynn/git-absorb",[864,879,880],{},[16,881,884],{"href":882,"rel":883},"https://gitlab.com/bertoldia/git-absorb",[],"gitlab.com/bertoldia/git-absorb",[864,886,887],{},[16,888,891],{"href":889,"rel":890},"https://github.com/tummychow/git-absorb",[],"github.com/tummychow/git-absorb",[864,893,894],{},[16,895,898],{"href":896,"rel":897},"https://github.com/torbiak/git-autofixup",[],"github.com/torbiak/git-autofixup",[12,900,901,906,907,912,913,368],{},[16,902,905],{"href":903,"rel":904},"https://unsplash.com/photos/qAShc5SV83M",[],"Cover image"," by ",[16,908,911],{"href":909,"rel":910},"https://unsplash.com/@yungnoma",[],"Yung Chang"," on ",[16,914,917],{"href":915,"rel":916},"https://unsplash.com/",[],"Unsplash",[919,920,921],"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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}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":40,"searchDepth":66,"depth":66,"links":923},[924,928,929],{"id":24,"depth":66,"text":25,"children":925},[926,927],{"id":225,"depth":73,"text":226},{"id":374,"depth":73,"text":375},{"id":512,"depth":66,"text":513},{"id":850,"depth":66,"text":851},"engineering","2022-11-08","From fixup to autosquash here are real world ways to leverage Git rebase.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682486/Blog/Hero%20Images/rebase-in-real-life.jpg",{},"/en-us/blog/rebase-in-real-life",{"title":5,"description":932,"ogTitle":5,"ogDescription":932,"noIndex":935,"ogImage":936,"ogUrl":940,"ogSiteName":941,"ogType":942,"canonicalUrls":940},"https://about.gitlab.com/blog/rebase-in-real-life","https://about.gitlab.com","article","rebase-in-real-life","en-us/blog/rebase-in-real-life",[242,946,947],"workflow","tutorial","BlogPost","vFQZjpdVMG2pkMhheMjfskrcQemz7uhVGgBVJhCIW6c",{"logo":951,"freeTrial":956,"sales":961,"login":966,"items":971,"search":1298,"minimal":1329,"duo":1348,"switchNav":1357,"pricingDeployment":1368},{"config":952},{"href":953,"dataGaName":954,"dataGaLocation":955},"/","gitlab logo","header",{"text":957,"config":958},"Get free trial",{"href":959,"dataGaName":960,"dataGaLocation":955},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":962,"config":963},"Request a demo",{"href":964,"dataGaName":965,"dataGaLocation":955},"/sales/?contact-topic=request-demo","sales",{"text":967,"config":968},"Sign in",{"href":969,"dataGaName":970,"dataGaLocation":955},"https://gitlab.com/users/sign_in/","sign in",[972,1001,1101,1106,1220,1276],{"text":973,"config":974,"menu":976},"Platform",{"dataNavLevelOne":975},"platform",{"type":977,"columns":978},"cards",[979,985,993],{"title":973,"description":980,"link":981},"The intelligent orchestration platform for DevSecOps",{"text":982,"config":983},"Explore our Platform",{"href":984,"dataGaName":975,"dataGaLocation":955},"/platform/",{"title":986,"description":987,"link":988},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":989,"config":990},"Meet GitLab Duo",{"href":991,"dataGaName":992,"dataGaLocation":955},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":994,"description":995,"link":996},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":997,"config":998},"Learn more",{"href":999,"dataGaName":1000,"dataGaLocation":955},"/why-gitlab/","why gitlab",{"text":1002,"left":69,"config":1003,"menu":1005},"Product",{"dataNavLevelOne":1004},"solutions",{"type":1006,"link":1007,"columns":1011,"feature":1080},"lists",{"text":1008,"config":1009},"View all Solutions",{"href":1010,"dataGaName":1004,"dataGaLocation":955},"/solutions/",[1012,1036,1059],{"title":1013,"description":1014,"link":1015,"items":1020},"Automation","CI/CD and automation to accelerate deployment",{"config":1016},{"icon":1017,"href":1018,"dataGaName":1019,"dataGaLocation":955},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1021,1025,1028,1032],{"text":1022,"config":1023},"CI/CD",{"href":1024,"dataGaLocation":955,"dataGaName":1022},"/solutions/continuous-integration/",{"text":986,"config":1026},{"href":991,"dataGaLocation":955,"dataGaName":1027},"gitlab duo agent platform - product menu",{"text":1029,"config":1030},"Source Code Management",{"href":1031,"dataGaLocation":955,"dataGaName":1029},"/solutions/source-code-management/",{"text":1033,"config":1034},"Automated Software Delivery",{"href":1018,"dataGaLocation":955,"dataGaName":1035},"Automated software delivery",{"title":1037,"description":1038,"link":1039,"items":1044},"Security","Deliver code faster without compromising security",{"config":1040},{"href":1041,"dataGaName":1042,"dataGaLocation":955,"icon":1043},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1045,1049,1054],{"text":1046,"config":1047},"Application Security Testing",{"href":1041,"dataGaName":1048,"dataGaLocation":955},"Application security testing",{"text":1050,"config":1051},"Software Supply Chain Security",{"href":1052,"dataGaLocation":955,"dataGaName":1053},"/solutions/supply-chain/","Software supply chain security",{"text":1055,"config":1056},"Software Compliance",{"href":1057,"dataGaName":1058,"dataGaLocation":955},"/solutions/software-compliance/","software compliance",{"title":1060,"link":1061,"items":1066},"Measurement",{"config":1062},{"icon":1063,"href":1064,"dataGaName":1065,"dataGaLocation":955},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1067,1071,1075],{"text":1068,"config":1069},"Visibility & Measurement",{"href":1064,"dataGaLocation":955,"dataGaName":1070},"Visibility and Measurement",{"text":1072,"config":1073},"Value Stream Management",{"href":1074,"dataGaLocation":955,"dataGaName":1072},"/solutions/value-stream-management/",{"text":1076,"config":1077},"Analytics & Insights",{"href":1078,"dataGaLocation":955,"dataGaName":1079},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1081,"type":1006,"items":1082},"GitLab for",[1083,1089,1095],{"text":1084,"config":1085},"Enterprise",{"icon":1086,"href":1087,"dataGaLocation":955,"dataGaName":1088},"Building","/enterprise/","enterprise",{"text":1090,"config":1091},"Small Business",{"icon":1092,"href":1093,"dataGaLocation":955,"dataGaName":1094},"Work","/small-business/","small business",{"text":1096,"config":1097},"Public Sector",{"icon":1098,"href":1099,"dataGaLocation":955,"dataGaName":1100},"Organization","/solutions/public-sector/","public sector",{"text":1102,"config":1103},"Pricing",{"href":1104,"dataGaName":1105,"dataGaLocation":955,"dataNavLevelOne":1105},"/pricing/","pricing",{"text":1107,"config":1108,"menu":1110},"Resources",{"dataNavLevelOne":1109},"resources",{"type":1006,"link":1111,"columns":1115,"feature":1209},{"text":1112,"config":1113},"View all resources",{"href":1114,"dataGaName":1109,"dataGaLocation":955},"/resources/",[1116,1149,1176],{"title":1117,"items":1118},"Getting started",[1119,1124,1129,1134,1139,1144],{"text":1120,"config":1121},"Install",{"href":1122,"dataGaName":1123,"dataGaLocation":955},"/install/","install",{"text":1125,"config":1126},"Quick start guides",{"href":1127,"dataGaName":1128,"dataGaLocation":955},"/get-started/","quick setup checklists",{"text":1130,"config":1131},"Learn",{"href":1132,"dataGaLocation":955,"dataGaName":1133},"https://university.gitlab.com/","learn",{"text":1135,"config":1136},"Product documentation",{"href":1137,"dataGaName":1138,"dataGaLocation":955},"https://docs.gitlab.com/","product documentation",{"text":1140,"config":1141},"Best practice videos",{"href":1142,"dataGaName":1143,"dataGaLocation":955},"/getting-started-videos/","best practice videos",{"text":1145,"config":1146},"Integrations",{"href":1147,"dataGaName":1148,"dataGaLocation":955},"/integrations/","integrations",{"title":1150,"items":1151},"Discover",[1152,1157,1162,1167,1171],{"text":1153,"config":1154},"Customer success stories",{"href":1155,"dataGaName":1156,"dataGaLocation":955},"/customers/","customer success stories",{"text":1158,"config":1159},"Blog",{"href":1160,"dataGaName":1161,"dataGaLocation":955},"/blog/","blog",{"text":1163,"config":1164},"Demo Hub",{"href":1165,"dataGaName":1166,"dataGaLocation":955},"/demo-hub/","demo hub",{"text":1168,"config":1169},"The Source",{"href":1170,"dataGaName":1161,"dataGaLocation":955},"/the-source/",{"text":1172,"config":1173},"Remote",{"href":1174,"dataGaName":1175,"dataGaLocation":955},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1177,"items":1178},"Connect",[1179,1184,1189,1194,1199,1204],{"text":1180,"config":1181},"GitLab Services",{"href":1182,"dataGaName":1183,"dataGaLocation":955},"/services/","services",{"text":1185,"config":1186},"Contribute",{"href":1187,"dataGaName":1188,"dataGaLocation":955},"https://contributors.gitlab.com","contribute",{"text":1190,"config":1191},"Community",{"href":1192,"dataGaName":1193,"dataGaLocation":955},"/community/","community",{"text":1195,"config":1196},"Forum",{"href":1197,"dataGaName":1198,"dataGaLocation":955},"https://forum.gitlab.com/","forum",{"text":1200,"config":1201},"Events",{"href":1202,"dataGaName":1203,"dataGaLocation":955},"/events/","events",{"text":1205,"config":1206},"Partners",{"href":1207,"dataGaName":1208,"dataGaLocation":955},"/partners/","partners",{"config":1210,"title":1213,"text":1214,"link":1215},{"background":1211,"textColor":1212},"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":1216,"config":1217},"Read the latest",{"href":1218,"dataGaName":1219,"dataGaLocation":955},"/whats-new/","whats new",{"text":1221,"config":1222,"menu":1224},"Company",{"dataNavLevelOne":1223},"company",{"type":1006,"columns":1225},[1226],{"items":1227},[1228,1233,1239,1241,1246,1251,1256,1261,1266,1271],{"text":1229,"config":1230},"About",{"href":1231,"dataGaName":1232,"dataGaLocation":955},"/company/","about",{"text":1234,"config":1235,"footerGa":1238},"Jobs",{"href":1236,"dataGaName":1237,"dataGaLocation":955},"/jobs/","jobs",{"dataGaName":1237},{"text":1200,"config":1240},{"href":1202,"dataGaName":1203,"dataGaLocation":955},{"text":1242,"config":1243},"Leadership",{"href":1244,"dataGaName":1245,"dataGaLocation":955},"/company/team/e-group/","leadership",{"text":1247,"config":1248},"Handbook",{"href":1249,"dataGaName":1250,"dataGaLocation":955},"https://handbook.gitlab.com/","handbook",{"text":1252,"config":1253},"Investor relations",{"href":1254,"dataGaName":1255,"dataGaLocation":955},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1257,"config":1258},"Trust Center",{"href":1259,"dataGaName":1260,"dataGaLocation":955},"/security/","trust center",{"text":1262,"config":1263},"AI Transparency Center",{"href":1264,"dataGaName":1265,"dataGaLocation":955},"/ai-transparency-center/","ai transparency center",{"text":1267,"config":1268},"Newsletter",{"href":1269,"dataGaName":1270,"dataGaLocation":955},"/company/contact/#contact-forms","newsletter",{"text":1272,"config":1273},"Press",{"href":1274,"dataGaName":1275,"dataGaLocation":955},"/press/","press",{"text":1277,"config":1278,"menu":1279},"Contact us",{"dataNavLevelOne":1223},{"type":1006,"columns":1280},[1281],{"items":1282},[1283,1288,1293],{"text":1284,"config":1285},"Talk to sales",{"href":1286,"dataGaName":1287,"dataGaLocation":955},"/sales/","talk to sales",{"text":1289,"config":1290},"Support portal",{"href":1291,"dataGaName":1292,"dataGaLocation":955},"https://support.gitlab.com/hc/en-us","support portal",{"text":1294,"config":1295},"Customer portal",{"href":1296,"dataGaName":1297,"dataGaLocation":955},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1299,"login":1300,"suggestions":1307},"Close",{"text":1301,"link":1302},"To search repositories and projects, login to",{"text":1303,"config":1304},"gitlab.com",{"href":969,"dataGaName":1305,"dataGaLocation":1306},"search login","search",{"text":1308,"default":1309},"Suggestions",[1310,1312,1316,1318,1322,1326],{"text":986,"config":1311},{"href":991,"dataGaName":986,"dataGaLocation":1306},{"text":1313,"config":1314},"Code Suggestions (AI)",{"href":1315,"dataGaName":1313,"dataGaLocation":1306},"/solutions/code-suggestions/",{"text":1022,"config":1317},{"href":1024,"dataGaName":1022,"dataGaLocation":1306},{"text":1319,"config":1320},"GitLab on AWS",{"href":1321,"dataGaName":1319,"dataGaLocation":1306},"/partners/technology-partners/aws/",{"text":1323,"config":1324},"GitLab on Google Cloud",{"href":1325,"dataGaName":1323,"dataGaLocation":1306},"/partners/technology-partners/google-cloud-platform/",{"text":1327,"config":1328},"Why GitLab?",{"href":999,"dataGaName":1327,"dataGaLocation":1306},{"freeTrial":1330,"mobileIcon":1335,"desktopIcon":1340,"secondaryButton":1343},{"text":1331,"config":1332},"Start free trial",{"href":1333,"dataGaName":960,"dataGaLocation":1334},"https://gitlab.com/-/trials/new/","nav",{"altText":1336,"config":1337},"Gitlab Icon",{"src":1338,"dataGaName":1339,"dataGaLocation":1334},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1336,"config":1341},{"src":1342,"dataGaName":1339,"dataGaLocation":1334},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1344,"config":1345},"Get Started",{"href":1346,"dataGaName":1347,"dataGaLocation":1334},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1349,"mobileIcon":1353,"desktopIcon":1355},{"text":1350,"config":1351},"Learn more about GitLab Duo",{"href":991,"dataGaName":1352,"dataGaLocation":1334},"gitlab duo",{"altText":1336,"config":1354},{"src":1338,"dataGaName":1339,"dataGaLocation":1334},{"altText":1336,"config":1356},{"src":1342,"dataGaName":1339,"dataGaLocation":1334},{"button":1358,"mobileIcon":1363,"desktopIcon":1365},{"text":1359,"config":1360},"/switch",{"href":1361,"dataGaName":1362,"dataGaLocation":1334},"#contact","switch",{"altText":1336,"config":1364},{"src":1338,"dataGaName":1339,"dataGaLocation":1334},{"altText":1336,"config":1366},{"src":1367,"dataGaName":1339,"dataGaLocation":1334},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1369,"mobileIcon":1374,"desktopIcon":1376},{"text":1370,"config":1371},"Back to pricing",{"href":1104,"dataGaName":1372,"dataGaLocation":1334,"icon":1373},"back to pricing","GoBack",{"altText":1336,"config":1375},{"src":1338,"dataGaName":1339,"dataGaLocation":1334},{"altText":1336,"config":1377},{"src":1342,"dataGaName":1339,"dataGaLocation":1334},{"title":1379,"titleMobile":1380,"button":1381,"config":1386},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":997,"config":1382},{"href":1383,"dataGaName":1384,"dataGaLocation":1385},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1387,"disabled":935},"release",{"data":1389},{"text":1390,"source":1391,"edit":1397,"contribute":1402,"config":1407,"items":1412,"minimal":1622},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1392,"config":1393},"View page source",{"href":1394,"dataGaName":1395,"dataGaLocation":1396},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1398,"config":1399},"Edit this page",{"href":1400,"dataGaName":1401,"dataGaLocation":1396},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1403,"config":1404},"Please contribute",{"href":1405,"dataGaName":1406,"dataGaLocation":1396},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1408,"facebook":1409,"youtube":1410,"linkedin":1411},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1413,1460,1514,1558,1590],{"title":1102,"links":1414,"subMenu":1429},[1415,1419,1424],{"text":1416,"config":1417},"View plans",{"href":1104,"dataGaName":1418,"dataGaLocation":1396},"view plans",{"text":1420,"config":1421},"Why Premium?",{"href":1422,"dataGaName":1423,"dataGaLocation":1396},"/pricing/premium/","why premium",{"text":1425,"config":1426},"Why Ultimate?",{"href":1427,"dataGaName":1428,"dataGaLocation":1396},"/pricing/ultimate/","why ultimate",[1430],{"title":1431,"links":1432},"Contact Us",[1433,1436,1438,1440,1445,1450,1455],{"text":1434,"config":1435},"Contact sales",{"href":1286,"dataGaName":965,"dataGaLocation":1396},{"text":1289,"config":1437},{"href":1291,"dataGaName":1292,"dataGaLocation":1396},{"text":1294,"config":1439},{"href":1296,"dataGaName":1297,"dataGaLocation":1396},{"text":1441,"config":1442},"Status",{"href":1443,"dataGaName":1444,"dataGaLocation":1396},"https://status.gitlab.com/","status",{"text":1446,"config":1447},"Terms of use",{"href":1448,"dataGaName":1449,"dataGaLocation":1396},"/terms/","terms of use",{"text":1451,"config":1452},"Privacy statement",{"href":1453,"dataGaName":1454,"dataGaLocation":1396},"/privacy/","privacy statement",{"text":1456,"config":1457},"Cookie preferences",{"dataGaName":1458,"dataGaLocation":1396,"id":1459,"isOneTrustButton":69},"cookie preferences","ot-sdk-btn",{"title":1002,"links":1461,"subMenu":1470},[1462,1466],{"text":1463,"config":1464},"DevSecOps platform",{"href":984,"dataGaName":1465,"dataGaLocation":1396},"devsecops platform",{"text":1467,"config":1468},"AI-Assisted Development",{"href":991,"dataGaName":1469,"dataGaLocation":1396},"ai-assisted development",[1471],{"title":1472,"links":1473},"Topics",[1474,1479,1484,1489,1494,1499,1504,1509],{"text":1475,"config":1476},"CICD",{"href":1477,"dataGaName":1478,"dataGaLocation":1396},"/topics/ci-cd/","cicd",{"text":1480,"config":1481},"GitOps",{"href":1482,"dataGaName":1483,"dataGaLocation":1396},"/topics/gitops/","gitops",{"text":1485,"config":1486},"DevOps",{"href":1487,"dataGaName":1488,"dataGaLocation":1396},"/topics/devops/","devops",{"text":1490,"config":1491},"Version Control",{"href":1492,"dataGaName":1493,"dataGaLocation":1396},"/topics/version-control/","version control",{"text":1495,"config":1496},"DevSecOps",{"href":1497,"dataGaName":1498,"dataGaLocation":1396},"/topics/devsecops/","devsecops",{"text":1500,"config":1501},"Cloud Native",{"href":1502,"dataGaName":1503,"dataGaLocation":1396},"/topics/cloud-native/","cloud native",{"text":1505,"config":1506},"AI for Coding",{"href":1507,"dataGaName":1508,"dataGaLocation":1396},"/topics/devops/ai-for-coding/","ai for coding",{"text":1510,"config":1511},"Agentic AI",{"href":1512,"dataGaName":1513,"dataGaLocation":1396},"/topics/agentic-ai/","agentic ai",{"title":1515,"links":1516},"Solutions",[1517,1519,1521,1526,1530,1533,1537,1540,1542,1545,1548,1553],{"text":1046,"config":1518},{"href":1041,"dataGaName":1046,"dataGaLocation":1396},{"text":1035,"config":1520},{"href":1018,"dataGaName":1019,"dataGaLocation":1396},{"text":1522,"config":1523},"Agile development",{"href":1524,"dataGaName":1525,"dataGaLocation":1396},"/solutions/agile-delivery/","agile delivery",{"text":1527,"config":1528},"SCM",{"href":1031,"dataGaName":1529,"dataGaLocation":1396},"source code management",{"text":1475,"config":1531},{"href":1024,"dataGaName":1532,"dataGaLocation":1396},"continuous integration & delivery",{"text":1534,"config":1535},"Value stream management",{"href":1074,"dataGaName":1536,"dataGaLocation":1396},"value stream management",{"text":1480,"config":1538},{"href":1539,"dataGaName":1483,"dataGaLocation":1396},"/solutions/gitops/",{"text":1084,"config":1541},{"href":1087,"dataGaName":1088,"dataGaLocation":1396},{"text":1543,"config":1544},"Small business",{"href":1093,"dataGaName":1094,"dataGaLocation":1396},{"text":1546,"config":1547},"Public sector",{"href":1099,"dataGaName":1100,"dataGaLocation":1396},{"text":1549,"config":1550},"Education",{"href":1551,"dataGaName":1552,"dataGaLocation":1396},"/solutions/education/","education",{"text":1554,"config":1555},"Financial services",{"href":1556,"dataGaName":1557,"dataGaLocation":1396},"/solutions/finance/","financial services",{"title":1107,"links":1559},[1560,1562,1564,1566,1569,1571,1574,1576,1578,1580,1582,1584,1586,1588],{"text":1120,"config":1561},{"href":1122,"dataGaName":1123,"dataGaLocation":1396},{"text":1125,"config":1563},{"href":1127,"dataGaName":1128,"dataGaLocation":1396},{"text":1130,"config":1565},{"href":1132,"dataGaName":1133,"dataGaLocation":1396},{"text":1135,"config":1567},{"href":1137,"dataGaName":1568,"dataGaLocation":1396},"docs",{"text":1158,"config":1570},{"href":1160,"dataGaName":1161,"dataGaLocation":1396},{"text":1572,"config":1573},"What's new",{"href":1218,"dataGaName":1219,"dataGaLocation":1396},{"text":1153,"config":1575},{"href":1155,"dataGaName":1156,"dataGaLocation":1396},{"text":1172,"config":1577},{"href":1174,"dataGaName":1175,"dataGaLocation":1396},{"text":1180,"config":1579},{"href":1182,"dataGaName":1183,"dataGaLocation":1396},{"text":1185,"config":1581},{"href":1187,"dataGaName":1188,"dataGaLocation":1396},{"text":1190,"config":1583},{"href":1192,"dataGaName":1193,"dataGaLocation":1396},{"text":1195,"config":1585},{"href":1197,"dataGaName":1198,"dataGaLocation":1396},{"text":1200,"config":1587},{"href":1202,"dataGaName":1203,"dataGaLocation":1396},{"text":1205,"config":1589},{"href":1207,"dataGaName":1208,"dataGaLocation":1396},{"title":1221,"links":1591},[1592,1594,1596,1598,1600,1602,1606,1611,1613,1615,1617],{"text":1229,"config":1593},{"href":1231,"dataGaName":1223,"dataGaLocation":1396},{"text":1234,"config":1595},{"href":1236,"dataGaName":1237,"dataGaLocation":1396},{"text":1242,"config":1597},{"href":1244,"dataGaName":1245,"dataGaLocation":1396},{"text":1247,"config":1599},{"href":1249,"dataGaName":1250,"dataGaLocation":1396},{"text":1252,"config":1601},{"href":1254,"dataGaName":1255,"dataGaLocation":1396},{"text":1603,"config":1604},"Sustainability",{"href":1605,"dataGaName":1603,"dataGaLocation":1396},"/sustainability/",{"text":1607,"config":1608},"Diversity, inclusion and belonging (DIB)",{"href":1609,"dataGaName":1610,"dataGaLocation":1396},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1257,"config":1612},{"href":1259,"dataGaName":1260,"dataGaLocation":1396},{"text":1267,"config":1614},{"href":1269,"dataGaName":1270,"dataGaLocation":1396},{"text":1272,"config":1616},{"href":1274,"dataGaName":1275,"dataGaLocation":1396},{"text":1618,"config":1619},"Modern Slavery Transparency Statement",{"href":1620,"dataGaName":1621,"dataGaLocation":1396},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1623},[1624,1627,1630],{"text":1625,"config":1626},"Terms",{"href":1448,"dataGaName":1449,"dataGaLocation":1396},{"text":1628,"config":1629},"Cookies",{"dataGaName":1458,"dataGaLocation":1396,"id":1459,"isOneTrustButton":69},{"text":1631,"config":1632},"Privacy",{"href":1453,"dataGaName":1454,"dataGaLocation":1396},[1634],{"id":1635,"title":7,"body":934,"config":1636,"content":1638,"description":934,"extension":1642,"meta":1643,"navigation":69,"path":1644,"seo":1645,"stem":1646,"__hash__":1647},"blogAuthors/en-us/blog/authors/toon-claes.yml",{"template":1637},"BlogAuthor",{"name":7,"config":1639},{"headshot":1640,"ctfId":1641},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663082/Blog/Author%20Headshots/toon_claes_headshot.png","toon","yml",{},"/en-us/blog/authors/toon-claes",{},"en-us/blog/authors/toon-claes","guXJXoqO1anz4H932Namk7kqyZsO1xyVQr6stBL4o18",[1649,1658,1666],{"title":1650,"description":1651,"heroImage":1652,"category":930,"date":1653,"authors":1654,"slug":1657,"externalUrl":934},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1655,1656],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1659,"description":1660,"heroImage":1661,"category":930,"date":1662,"authors":1663,"slug":1665,"externalUrl":934},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1664],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1667,"description":1668,"heroImage":1669,"category":930,"date":1670,"authors":1671,"slug":1673,"externalUrl":934},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1672],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1675},[1676,1690,1702,1714],{"id":1677,"categories":1678,"header":1680,"text":1681,"button":1682,"image":1687},"ai-modernization",[1679],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1683,"config":1684},"Get your AI maturity score",{"href":1685,"dataGaName":1686,"dataGaLocation":1161},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1688},{"src":1689},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1691,"categories":1692,"header":1694,"text":1681,"button":1695,"image":1699},"devops-modernization",[1693,1498],"product","Are you just managing tools or shipping innovation?",{"text":1696,"config":1697},"Get your DevOps maturity score",{"href":1698,"dataGaName":1686,"dataGaLocation":1161},"/assessments/devops-modernization-assessment/",{"config":1700},{"src":1701},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1703,"categories":1704,"header":1706,"text":1681,"button":1707,"image":1711},"security-modernization",[1705],"security","Are you trading speed for security?",{"text":1708,"config":1709},"Get your security maturity score",{"href":1710,"dataGaName":1686,"dataGaLocation":1161},"/assessments/security-modernization-assessment/",{"config":1712},{"src":1713},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1715,"paths":1716,"header":1719,"text":1720,"button":1721,"image":1726},"github-azure-migration",[1717,1718],"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":1722,"config":1723},"See how GitLab compares to GitHub",{"href":1724,"dataGaName":1725,"dataGaLocation":1161},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1727},{"src":1701},{"header":1729,"blurb":1730,"button":1731,"secondaryButton":1736},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1732,"config":1733},"Get your free trial",{"href":1734,"dataGaName":960,"dataGaLocation":1735},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1434,"config":1737},{"href":1286,"dataGaName":965,"dataGaLocation":1735},1786803764824]