[{"data":1,"prerenderedAt":1252},["ShallowReactive",2],{"/blog/take-advantage-of-git-rebase":3,"navigation-en-us":464,"banner-en-us":892,"footer-en-us":902,"blog-post-authors-en-us-Christian Couder":1147,"blog-related-posts-en-us-take-advantage-of-git-rebase":1162,"blog-promotions-en-us":1188,"next-steps-en-us":1242},{"id":4,"title":5,"authors":6,"body":8,"category":442,"date":443,"description":444,"extension":445,"externalUrl":446,"faq":446,"featured":447,"heroImage":448,"meta":449,"navigation":450,"path":451,"seo":452,"slug":456,"stem":457,"tags":458,"template":462,"updatedDate":446,"__hash__":463},"blogPosts/en-us/blog/take-advantage-of-git-rebase.md","Take advantage of Git rebase",[7],"Christian Couder",{"type":9,"value":10,"toc":422},"minimark",[11,22,27,30,35,38,41,51,54,58,61,69,75,78,82,89,118,127,151,159,169,184,188,194,197,237,240,261,265,272,287,293,297,301,329,333,340,359,365,371,375,386,392,401,405,408,418],[12,13,14,15,21],"p",{},"These days, developers spend a lot of time reviewing merge requests\nand taking these reviews into account to improve the code. We'll discuss how\n",[16,17,20],"a",{"href":18,"rel":19},"https://git-scm.com/docs/git-rebase",[],"Git rebase"," can help in\nspeeding up these review cycles. But first, let's take a look at some\nworkflow considerations.",[23,24,26],"h2",{"id":25},"different-ways-to-rework-a-merge-request","Different ways to rework a merge request",[12,28,29],{},"A developer who worked on some code changes and created a merge\nrequest with these changes will often have to rework them. Why does\nthis happen? Tests can fail, bugs are found, or reviewers suggest\nimprovements and find shortcomings.",[31,32,34],"h3",{"id":33},"simple-but-messy-method-add-more-commits","Simple but messy method: add more commits",[12,36,37],{},"One way to rework the code changes is to make more changes in some new\ncommits on top of the branch that was used to create the merge\nrequest, and then push the branch again to update the merge\nrequest.",[12,39,40],{},"When a number of commits have been added in this way, the merge\nrequest becomes problematic:",[42,43,44,48],"ul",{},[45,46,47],"li",{},"It's difficult to review by looking at all the changes together.",[45,49,50],{},"It's difficult to review the commits separately as they may contain different unrelated changes, or even multiple reworks of the same code.",[12,52,53],{},"Reviewers find it easier to review changes split into a number of small,\nself-contained commits that can be reviewed individually.",[31,55,57],{"id":56},"pro-method-rebase","Pro method: rebase!",[12,59,60],{},"A better method to prepare or rework a merge request is to always\nensure that each commit contains small, self-contained, easy-to-review\nchanges.",[12,62,63,64,68],{},"This means that all the commits in the branch may need reworking\ninstead of stacking on yet more commits. This approach might seem much\nmore complex and tedious, but ",[65,66,67],"code",{},"git rebase"," comes to the rescue!",[23,70,72,73],{"id":71},"rework-your-commits-with-git-rebase","Rework your commits with ",[65,74,67],{},[12,76,77],{},"If your goal is to build a merge request from a series of small,\nself-contained commits, your branch may need significant rework before its\ncommits are good enough. When the commits are ready, you can push the branch\nand update or create a merge request with this branch.",[31,79,81],{"id":80},"start-an-interactive-rebase","Start an interactive rebase",[12,83,84,85,88],{},"If your branch is based on ",[65,86,87],{},"main",", the command to rework your branch\nis:",[90,91,96],"pre",{"className":92,"code":93,"language":94,"meta":95,"style":95},"language-shell shiki shiki-themes github-light","git rebase -i main\n","shell","",[65,97,98],{"__ignoreMap":95},[99,100,103,107,111,115],"span",{"class":101,"line":102},"line",1,[99,104,106],{"class":105},"s7eDp","git",[99,108,110],{"class":109},"sYBdl"," rebase",[99,112,114],{"class":113},"sYu0t"," -i",[99,116,117],{"class":109}," main\n",[12,119,120,121,126],{},"I encourage you to create ",[16,122,125],{"href":123,"rel":124},"https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases",[],"a Git alias",",\nor a shell alias or function for this command right away, as you will\nuse it very often.",[12,128,129,130,133,134,136,137,140,141,146,147,150],{},"The ",[65,131,132],{},"-i"," option passed to ",[65,135,67],{}," is an alias for\n",[65,138,139],{},"--interactive",". It starts\n",[16,142,145],{"href":143,"rel":144},"https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---interactive",[],"an 'interactive' rebase","\nwhich will open your editor. In it, you will find a list of the\ncommits in your branch followed by commented-out lines beginning with\n",[65,148,149],{},"#",". The list of commits looks like this:",[90,152,157],{"className":153,"code":155,"language":156,"meta":95},[154],"language-text","pick 1aac632db2 first commit subject\npick a385014ad4 second commit subject\npick 6af12a88cf other commit subject\npick 5cd121e2a1 last commit subject\n","text",[65,158,155],{"__ignoreMap":95},[12,160,161,162,164,165,168],{},"These lines are instructions for how ",[65,163,67],{}," should handle these\ncommits. The commits are listed in chronological order, with the\noldest commit at the top. (This order is the opposite of the default\n",[65,166,167],{},"git log"," order.) What do these lines contain?",[42,170,171,178,181],{},[45,172,173,174,177],{},"An instruction (here, ",[65,175,176],{},"pick",") that tells Git what action to take",[45,179,180],{},"An abbreviated commit ID",[45,182,183],{},"A commit subject to help you identify the commit contents",[31,185,187],{"id":186},"edit-the-instruction-list","Edit the instruction list",[12,189,190,191,193],{},"You can edit these instructions! When you quit your text editor, ",[65,192,67],{},"\nreads the instructions you've just edited, and performs them\nin sequence to recreate your branch the way you want.",[12,195,196],{},"After the instructions for all commits, a set of commented-out lines\nexplain how to edit the instruction lines, and how each instruction\nwill change your branch:",[42,198,199,207,213,230],{},[45,200,201,202,206],{},"If you ",[203,204,205],"strong",{},"delete a commit's entire instruction line"," from the list,\nthat commit won't be recreated.",[45,208,201,209,212],{},[203,210,211],{},"reorder the instruction lines",", the commits will be\nrecreated in the order you specify.",[45,214,201,215,218,219,221,222,225,226,229],{},[203,216,217],{},"change the action"," from ",[65,220,176],{}," to something else, such as\n",[65,223,224],{},"squash"," or ",[65,227,228],{},"reword",", Git performs the action you specify on that\ncommit.",[45,231,232,233,236],{},"You can even ",[203,234,235],{},"add new instruction lines"," before, after, or between\nexisting lines.",[12,238,239],{},"If the comment lines aren't enough, more information about what you\ncan do and how it works is available in:",[42,241,242,250],{},[45,243,129,244,249],{},[16,245,248],{"href":246,"rel":247},"https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History",[],"Git Tools - Rewriting History","\nsection of the \"Pro Git\" book",[45,251,129,252,257,258,260],{},[16,253,256],{"href":254,"rel":255},"https://git-scm.com/docs/git-rebase#_interactive_mode",[],"Interactive mode","\nsection of the ",[65,259,67],{}," documentation",[31,262,264],{"id":263},"continue-or-abort-the-rebase","Continue or abort the rebase",[12,266,267,268,271],{},"An interactive rebase can stop if there is a conflict (as a regular\nrebase would) or if you used an instruction like ",[65,269,270],{},"edit"," in the\ninstruction line. This allows you to make some changes, like splitting\nthe current commit into two commits, or fixing the rebase conflict if\nthere is one. You can then either:",[42,273,274,281],{},[45,275,276,277,280],{},"Continue the interactive rebase with ",[65,278,279],{},"git rebase --continue",".",[45,282,283,284,280],{},"Abort the rebase altogether with ",[65,285,286],{},"git rebase --abort",[12,288,289,290,292],{},"(These ",[65,291,67],{}," options also work when a regular, non-interactive\nrebase stops.)",[23,294,296],{"id":295},"further-tips-and-benefits","Further tips and benefits",[31,298,300],{"id":299},"try-different-instructions","Try different instructions",[12,302,303,304,306,307,306,309,311,312,315,316,319,320,306,323,311,326,280],{},"I recommend you try out the different instructions you can use in\neach instruction line, especially ",[65,305,228],{},", ",[65,308,270],{},[65,310,224],{},", and ",[65,313,314],{},"fixup",". You'll\nsoon want to use the abbreviated versions of these instructions: ",[65,317,318],{},"r",",\n",[65,321,322],{},"e",[65,324,325],{},"s",[65,327,328],{},"f",[31,330,332],{"id":331},"run-shell-commands-in-your-rebase","Run shell commands in your rebase",[12,334,335,336,339],{},"You might also have noticed an ",[65,337,338],{},"exec \u003Ccommand>"," instruction that\nallows you to run any shell command at any point in the interactive rebase.\nI've found it more useful for non-interactive rebases, such as:",[90,341,343],{"className":92,"code":342,"language":94,"meta":95,"style":95},"git rebase --exec 'make test' main\n",[65,344,345],{"__ignoreMap":95},[99,346,347,349,351,354,357],{"class":101,"line":102},[99,348,106],{"class":105},[99,350,110],{"class":109},[99,352,353],{"class":113}," --exec",[99,355,356],{"class":109}," 'make test'",[99,358,117],{"class":109},[12,360,361,362,364],{},"(It's not an interactive rebase because it doesn't contain the ",[65,363,132],{}," flag.)",[12,366,129,367,370],{},[65,368,369],{},"--exec \u003Ccommand>"," flag allows you to run any shell command after\neach rebased commit, stopping if the shell command fails (which is\nsignaled by a non zero exit code).",[31,372,374],{"id":373},"test-all-your-commits","Test all your commits",[12,376,377,378,381,382,385],{},"Passing a command to build your software and run its tests, like\n",[65,379,380],{},"make test",", to ",[65,383,384],{},"--exec"," will check that each commit in your branch\nbuilds correctly and passes your tests.",[12,387,388,389,391],{},"If ",[65,390,380],{}," fails, the rebase stops. You can then fix the current\ncommit right away, and continue the rebase to test the next\ncommits.",[12,393,394,395,400],{},"Checking each commit builds cleanly and passes all the tests ensures\nyour code base is always in a good state. It's especially useful if\nyou want to take advantage of\n",[16,396,399],{"href":397,"rel":398},"https://git-scm.com/docs/git-bisect",[],"Git bisect"," when you encounter\nregressions.",[23,402,404],{"id":403},"conclusion","Conclusion",[12,406,407],{},"In Git, a rebase is a very versatile and useful tool to rework\ncommits. Use it to achieve a workflow with high-quality changes\nproposed in high-quality commits and merge requests. It makes your\ndevelopers and reviewers more efficient. Code reviews and debugging also become easier and more effective.",[12,409,410,413,414,280],{},[203,411,412],{},"EDIT:"," Check out our ",[16,415,417],{"href":416},"/blog/rebase-in-real-life/","follow-up post on how you can apply this is real life",[419,420,421],"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 .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":95,"searchDepth":423,"depth":423,"links":424},2,[425,430,436,441],{"id":25,"depth":423,"text":26,"children":426},[427,429],{"id":33,"depth":428,"text":34},3,{"id":56,"depth":428,"text":57},{"id":71,"depth":423,"text":431,"children":432},"Rework your commits with git rebase",[433,434,435],{"id":80,"depth":428,"text":81},{"id":186,"depth":428,"text":187},{"id":263,"depth":428,"text":264},{"id":295,"depth":423,"text":296,"children":437},[438,439,440],{"id":299,"depth":428,"text":300},{"id":331,"depth":428,"text":332},{"id":373,"depth":428,"text":374},{"id":403,"depth":423,"text":404},"engineering","2022-10-06","Tap into the Git rebase features to improve your workflow.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665560/Blog/Hero%20Images/speedmonorepo.jpg",{},true,"/en-us/blog/take-advantage-of-git-rebase",{"title":5,"description":444,"ogTitle":5,"ogDescription":444,"noIndex":447,"ogImage":448,"ogUrl":453,"ogSiteName":454,"ogType":455,"canonicalUrls":453},"https://about.gitlab.com/blog/take-advantage-of-git-rebase","https://about.gitlab.com","article","take-advantage-of-git-rebase","en-us/blog/take-advantage-of-git-rebase",[106,459,460,461],"workflow","releases","tutorial","BlogPost","C1D77SgTpH7jFxAFUDY1PV9Li9iVULLp-eaw1bUeN3I",{"logo":465,"freeTrial":470,"sales":475,"login":480,"items":485,"search":812,"minimal":843,"duo":862,"switchNav":871,"pricingDeployment":882},{"config":466},{"href":467,"dataGaName":468,"dataGaLocation":469},"/","gitlab logo","header",{"text":471,"config":472},"Get free trial",{"href":473,"dataGaName":474,"dataGaLocation":469},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":476,"config":477},"Request a demo",{"href":478,"dataGaName":479,"dataGaLocation":469},"/sales/?contact-topic=request-demo","sales",{"text":481,"config":482},"Sign in",{"href":483,"dataGaName":484,"dataGaLocation":469},"https://gitlab.com/users/sign_in/","sign in",[486,515,615,620,734,790],{"text":487,"config":488,"menu":490},"Platform",{"dataNavLevelOne":489},"platform",{"type":491,"columns":492},"cards",[493,499,507],{"title":487,"description":494,"link":495},"The intelligent orchestration platform for DevSecOps",{"text":496,"config":497},"Explore our Platform",{"href":498,"dataGaName":489,"dataGaLocation":469},"/platform/",{"title":500,"description":501,"link":502},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":503,"config":504},"Meet GitLab Duo",{"href":505,"dataGaName":506,"dataGaLocation":469},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":508,"description":509,"link":510},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":511,"config":512},"Learn more",{"href":513,"dataGaName":514,"dataGaLocation":469},"/why-gitlab/","why gitlab",{"text":516,"left":450,"config":517,"menu":519},"Product",{"dataNavLevelOne":518},"solutions",{"type":520,"link":521,"columns":525,"feature":594},"lists",{"text":522,"config":523},"View all Solutions",{"href":524,"dataGaName":518,"dataGaLocation":469},"/solutions/",[526,550,573],{"title":527,"description":528,"link":529,"items":534},"Automation","CI/CD and automation to accelerate deployment",{"config":530},{"icon":531,"href":532,"dataGaName":533,"dataGaLocation":469},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[535,539,542,546],{"text":536,"config":537},"CI/CD",{"href":538,"dataGaLocation":469,"dataGaName":536},"/solutions/continuous-integration/",{"text":500,"config":540},{"href":505,"dataGaLocation":469,"dataGaName":541},"gitlab duo agent platform - product menu",{"text":543,"config":544},"Source Code Management",{"href":545,"dataGaLocation":469,"dataGaName":543},"/solutions/source-code-management/",{"text":547,"config":548},"Automated Software Delivery",{"href":532,"dataGaLocation":469,"dataGaName":549},"Automated software delivery",{"title":551,"description":552,"link":553,"items":558},"Security","Deliver code faster without compromising security",{"config":554},{"href":555,"dataGaName":556,"dataGaLocation":469,"icon":557},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[559,563,568],{"text":560,"config":561},"Application Security Testing",{"href":555,"dataGaName":562,"dataGaLocation":469},"Application security testing",{"text":564,"config":565},"Software Supply Chain Security",{"href":566,"dataGaLocation":469,"dataGaName":567},"/solutions/supply-chain/","Software supply chain security",{"text":569,"config":570},"Software Compliance",{"href":571,"dataGaName":572,"dataGaLocation":469},"/solutions/software-compliance/","software compliance",{"title":574,"link":575,"items":580},"Measurement",{"config":576},{"icon":577,"href":578,"dataGaName":579,"dataGaLocation":469},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[581,585,589],{"text":582,"config":583},"Visibility & Measurement",{"href":578,"dataGaLocation":469,"dataGaName":584},"Visibility and Measurement",{"text":586,"config":587},"Value Stream Management",{"href":588,"dataGaLocation":469,"dataGaName":586},"/solutions/value-stream-management/",{"text":590,"config":591},"Analytics & Insights",{"href":592,"dataGaLocation":469,"dataGaName":593},"/solutions/analytics-and-insights/","Analytics and insights",{"title":595,"type":520,"items":596},"GitLab for",[597,603,609],{"text":598,"config":599},"Enterprise",{"icon":600,"href":601,"dataGaLocation":469,"dataGaName":602},"Building","/enterprise/","enterprise",{"text":604,"config":605},"Small Business",{"icon":606,"href":607,"dataGaLocation":469,"dataGaName":608},"Work","/small-business/","small business",{"text":610,"config":611},"Public Sector",{"icon":612,"href":613,"dataGaLocation":469,"dataGaName":614},"Organization","/solutions/public-sector/","public sector",{"text":616,"config":617},"Pricing",{"href":618,"dataGaName":619,"dataGaLocation":469,"dataNavLevelOne":619},"/pricing/","pricing",{"text":621,"config":622,"menu":624},"Resources",{"dataNavLevelOne":623},"resources",{"type":520,"link":625,"columns":629,"feature":723},{"text":626,"config":627},"View all resources",{"href":628,"dataGaName":623,"dataGaLocation":469},"/resources/",[630,663,690],{"title":631,"items":632},"Getting started",[633,638,643,648,653,658],{"text":634,"config":635},"Install",{"href":636,"dataGaName":637,"dataGaLocation":469},"/install/","install",{"text":639,"config":640},"Quick start guides",{"href":641,"dataGaName":642,"dataGaLocation":469},"/get-started/","quick setup checklists",{"text":644,"config":645},"Learn",{"href":646,"dataGaLocation":469,"dataGaName":647},"https://university.gitlab.com/","learn",{"text":649,"config":650},"Product documentation",{"href":651,"dataGaName":652,"dataGaLocation":469},"https://docs.gitlab.com/","product documentation",{"text":654,"config":655},"Best practice videos",{"href":656,"dataGaName":657,"dataGaLocation":469},"/getting-started-videos/","best practice videos",{"text":659,"config":660},"Integrations",{"href":661,"dataGaName":662,"dataGaLocation":469},"/integrations/","integrations",{"title":664,"items":665},"Discover",[666,671,676,681,685],{"text":667,"config":668},"Customer success stories",{"href":669,"dataGaName":670,"dataGaLocation":469},"/customers/","customer success stories",{"text":672,"config":673},"Blog",{"href":674,"dataGaName":675,"dataGaLocation":469},"/blog/","blog",{"text":677,"config":678},"Demo Hub",{"href":679,"dataGaName":680,"dataGaLocation":469},"/demo-hub/","demo hub",{"text":682,"config":683},"The Source",{"href":684,"dataGaName":675,"dataGaLocation":469},"/the-source/",{"text":686,"config":687},"Remote",{"href":688,"dataGaName":689,"dataGaLocation":469},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":691,"items":692},"Connect",[693,698,703,708,713,718],{"text":694,"config":695},"GitLab Services",{"href":696,"dataGaName":697,"dataGaLocation":469},"/services/","services",{"text":699,"config":700},"Contribute",{"href":701,"dataGaName":702,"dataGaLocation":469},"https://contributors.gitlab.com","contribute",{"text":704,"config":705},"Community",{"href":706,"dataGaName":707,"dataGaLocation":469},"/community/","community",{"text":709,"config":710},"Forum",{"href":711,"dataGaName":712,"dataGaLocation":469},"https://forum.gitlab.com/","forum",{"text":714,"config":715},"Events",{"href":716,"dataGaName":717,"dataGaLocation":469},"/events/","events",{"text":719,"config":720},"Partners",{"href":721,"dataGaName":722,"dataGaLocation":469},"/partners/","partners",{"config":724,"title":727,"text":728,"link":729},{"background":725,"textColor":726},"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":730,"config":731},"Read the latest",{"href":732,"dataGaName":733,"dataGaLocation":469},"/whats-new/","whats new",{"text":735,"config":736,"menu":738},"Company",{"dataNavLevelOne":737},"company",{"type":520,"columns":739},[740],{"items":741},[742,747,753,755,760,765,770,775,780,785],{"text":743,"config":744},"About",{"href":745,"dataGaName":746,"dataGaLocation":469},"/company/","about",{"text":748,"config":749,"footerGa":752},"Jobs",{"href":750,"dataGaName":751,"dataGaLocation":469},"/jobs/","jobs",{"dataGaName":751},{"text":714,"config":754},{"href":716,"dataGaName":717,"dataGaLocation":469},{"text":756,"config":757},"Leadership",{"href":758,"dataGaName":759,"dataGaLocation":469},"/company/team/e-group/","leadership",{"text":761,"config":762},"Handbook",{"href":763,"dataGaName":764,"dataGaLocation":469},"https://handbook.gitlab.com/","handbook",{"text":766,"config":767},"Investor relations",{"href":768,"dataGaName":769,"dataGaLocation":469},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":771,"config":772},"Trust Center",{"href":773,"dataGaName":774,"dataGaLocation":469},"/security/","trust center",{"text":776,"config":777},"AI Transparency Center",{"href":778,"dataGaName":779,"dataGaLocation":469},"/ai-transparency-center/","ai transparency center",{"text":781,"config":782},"Newsletter",{"href":783,"dataGaName":784,"dataGaLocation":469},"/company/contact/#contact-forms","newsletter",{"text":786,"config":787},"Press",{"href":788,"dataGaName":789,"dataGaLocation":469},"/press/","press",{"text":791,"config":792,"menu":793},"Contact us",{"dataNavLevelOne":737},{"type":520,"columns":794},[795],{"items":796},[797,802,807],{"text":798,"config":799},"Talk to sales",{"href":800,"dataGaName":801,"dataGaLocation":469},"/sales/","talk to sales",{"text":803,"config":804},"Support portal",{"href":805,"dataGaName":806,"dataGaLocation":469},"https://support.gitlab.com/hc/en-us","support portal",{"text":808,"config":809},"Customer portal",{"href":810,"dataGaName":811,"dataGaLocation":469},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":813,"login":814,"suggestions":821},"Close",{"text":815,"link":816},"To search repositories and projects, login to",{"text":817,"config":818},"gitlab.com",{"href":483,"dataGaName":819,"dataGaLocation":820},"search login","search",{"text":822,"default":823},"Suggestions",[824,826,830,832,836,840],{"text":500,"config":825},{"href":505,"dataGaName":500,"dataGaLocation":820},{"text":827,"config":828},"Code Suggestions (AI)",{"href":829,"dataGaName":827,"dataGaLocation":820},"/solutions/code-suggestions/",{"text":536,"config":831},{"href":538,"dataGaName":536,"dataGaLocation":820},{"text":833,"config":834},"GitLab on AWS",{"href":835,"dataGaName":833,"dataGaLocation":820},"/partners/technology-partners/aws/",{"text":837,"config":838},"GitLab on Google Cloud",{"href":839,"dataGaName":837,"dataGaLocation":820},"/partners/technology-partners/google-cloud-platform/",{"text":841,"config":842},"Why GitLab?",{"href":513,"dataGaName":841,"dataGaLocation":820},{"freeTrial":844,"mobileIcon":849,"desktopIcon":854,"secondaryButton":857},{"text":845,"config":846},"Start free trial",{"href":847,"dataGaName":474,"dataGaLocation":848},"https://gitlab.com/-/trials/new/","nav",{"altText":850,"config":851},"Gitlab Icon",{"src":852,"dataGaName":853,"dataGaLocation":848},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":850,"config":855},{"src":856,"dataGaName":853,"dataGaLocation":848},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":858,"config":859},"Get Started",{"href":860,"dataGaName":861,"dataGaLocation":848},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":863,"mobileIcon":867,"desktopIcon":869},{"text":864,"config":865},"Learn more about GitLab Duo",{"href":505,"dataGaName":866,"dataGaLocation":848},"gitlab duo",{"altText":850,"config":868},{"src":852,"dataGaName":853,"dataGaLocation":848},{"altText":850,"config":870},{"src":856,"dataGaName":853,"dataGaLocation":848},{"button":872,"mobileIcon":877,"desktopIcon":879},{"text":873,"config":874},"/switch",{"href":875,"dataGaName":876,"dataGaLocation":848},"#contact","switch",{"altText":850,"config":878},{"src":852,"dataGaName":853,"dataGaLocation":848},{"altText":850,"config":880},{"src":881,"dataGaName":853,"dataGaLocation":848},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":883,"mobileIcon":888,"desktopIcon":890},{"text":884,"config":885},"Back to pricing",{"href":618,"dataGaName":886,"dataGaLocation":848,"icon":887},"back to pricing","GoBack",{"altText":850,"config":889},{"src":852,"dataGaName":853,"dataGaLocation":848},{"altText":850,"config":891},{"src":856,"dataGaName":853,"dataGaLocation":848},{"title":893,"titleMobile":894,"button":895,"config":900},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":511,"config":896},{"href":897,"dataGaName":898,"dataGaLocation":899},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":901,"disabled":447},"release",{"data":903},{"text":904,"source":905,"edit":911,"contribute":916,"config":921,"items":926,"minimal":1136},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":906,"config":907},"View page source",{"href":908,"dataGaName":909,"dataGaLocation":910},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":912,"config":913},"Edit this page",{"href":914,"dataGaName":915,"dataGaLocation":910},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":917,"config":918},"Please contribute",{"href":919,"dataGaName":920,"dataGaLocation":910},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":922,"facebook":923,"youtube":924,"linkedin":925},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[927,974,1028,1072,1104],{"title":616,"links":928,"subMenu":943},[929,933,938],{"text":930,"config":931},"View plans",{"href":618,"dataGaName":932,"dataGaLocation":910},"view plans",{"text":934,"config":935},"Why Premium?",{"href":936,"dataGaName":937,"dataGaLocation":910},"/pricing/premium/","why premium",{"text":939,"config":940},"Why Ultimate?",{"href":941,"dataGaName":942,"dataGaLocation":910},"/pricing/ultimate/","why ultimate",[944],{"title":945,"links":946},"Contact Us",[947,950,952,954,959,964,969],{"text":948,"config":949},"Contact sales",{"href":800,"dataGaName":479,"dataGaLocation":910},{"text":803,"config":951},{"href":805,"dataGaName":806,"dataGaLocation":910},{"text":808,"config":953},{"href":810,"dataGaName":811,"dataGaLocation":910},{"text":955,"config":956},"Status",{"href":957,"dataGaName":958,"dataGaLocation":910},"https://status.gitlab.com/","status",{"text":960,"config":961},"Terms of use",{"href":962,"dataGaName":963,"dataGaLocation":910},"/terms/","terms of use",{"text":965,"config":966},"Privacy statement",{"href":967,"dataGaName":968,"dataGaLocation":910},"/privacy/","privacy statement",{"text":970,"config":971},"Cookie preferences",{"dataGaName":972,"dataGaLocation":910,"id":973,"isOneTrustButton":450},"cookie preferences","ot-sdk-btn",{"title":516,"links":975,"subMenu":984},[976,980],{"text":977,"config":978},"DevSecOps platform",{"href":498,"dataGaName":979,"dataGaLocation":910},"devsecops platform",{"text":981,"config":982},"AI-Assisted Development",{"href":505,"dataGaName":983,"dataGaLocation":910},"ai-assisted development",[985],{"title":986,"links":987},"Topics",[988,993,998,1003,1008,1013,1018,1023],{"text":989,"config":990},"CICD",{"href":991,"dataGaName":992,"dataGaLocation":910},"/topics/ci-cd/","cicd",{"text":994,"config":995},"GitOps",{"href":996,"dataGaName":997,"dataGaLocation":910},"/topics/gitops/","gitops",{"text":999,"config":1000},"DevOps",{"href":1001,"dataGaName":1002,"dataGaLocation":910},"/topics/devops/","devops",{"text":1004,"config":1005},"Version Control",{"href":1006,"dataGaName":1007,"dataGaLocation":910},"/topics/version-control/","version control",{"text":1009,"config":1010},"DevSecOps",{"href":1011,"dataGaName":1012,"dataGaLocation":910},"/topics/devsecops/","devsecops",{"text":1014,"config":1015},"Cloud Native",{"href":1016,"dataGaName":1017,"dataGaLocation":910},"/topics/cloud-native/","cloud native",{"text":1019,"config":1020},"AI for Coding",{"href":1021,"dataGaName":1022,"dataGaLocation":910},"/topics/devops/ai-for-coding/","ai for coding",{"text":1024,"config":1025},"Agentic AI",{"href":1026,"dataGaName":1027,"dataGaLocation":910},"/topics/agentic-ai/","agentic ai",{"title":1029,"links":1030},"Solutions",[1031,1033,1035,1040,1044,1047,1051,1054,1056,1059,1062,1067],{"text":560,"config":1032},{"href":555,"dataGaName":560,"dataGaLocation":910},{"text":549,"config":1034},{"href":532,"dataGaName":533,"dataGaLocation":910},{"text":1036,"config":1037},"Agile development",{"href":1038,"dataGaName":1039,"dataGaLocation":910},"/solutions/agile-delivery/","agile delivery",{"text":1041,"config":1042},"SCM",{"href":545,"dataGaName":1043,"dataGaLocation":910},"source code management",{"text":989,"config":1045},{"href":538,"dataGaName":1046,"dataGaLocation":910},"continuous integration & delivery",{"text":1048,"config":1049},"Value stream management",{"href":588,"dataGaName":1050,"dataGaLocation":910},"value stream management",{"text":994,"config":1052},{"href":1053,"dataGaName":997,"dataGaLocation":910},"/solutions/gitops/",{"text":598,"config":1055},{"href":601,"dataGaName":602,"dataGaLocation":910},{"text":1057,"config":1058},"Small business",{"href":607,"dataGaName":608,"dataGaLocation":910},{"text":1060,"config":1061},"Public sector",{"href":613,"dataGaName":614,"dataGaLocation":910},{"text":1063,"config":1064},"Education",{"href":1065,"dataGaName":1066,"dataGaLocation":910},"/solutions/education/","education",{"text":1068,"config":1069},"Financial services",{"href":1070,"dataGaName":1071,"dataGaLocation":910},"/solutions/finance/","financial services",{"title":621,"links":1073},[1074,1076,1078,1080,1083,1085,1088,1090,1092,1094,1096,1098,1100,1102],{"text":634,"config":1075},{"href":636,"dataGaName":637,"dataGaLocation":910},{"text":639,"config":1077},{"href":641,"dataGaName":642,"dataGaLocation":910},{"text":644,"config":1079},{"href":646,"dataGaName":647,"dataGaLocation":910},{"text":649,"config":1081},{"href":651,"dataGaName":1082,"dataGaLocation":910},"docs",{"text":672,"config":1084},{"href":674,"dataGaName":675,"dataGaLocation":910},{"text":1086,"config":1087},"What's new",{"href":732,"dataGaName":733,"dataGaLocation":910},{"text":667,"config":1089},{"href":669,"dataGaName":670,"dataGaLocation":910},{"text":686,"config":1091},{"href":688,"dataGaName":689,"dataGaLocation":910},{"text":694,"config":1093},{"href":696,"dataGaName":697,"dataGaLocation":910},{"text":699,"config":1095},{"href":701,"dataGaName":702,"dataGaLocation":910},{"text":704,"config":1097},{"href":706,"dataGaName":707,"dataGaLocation":910},{"text":709,"config":1099},{"href":711,"dataGaName":712,"dataGaLocation":910},{"text":714,"config":1101},{"href":716,"dataGaName":717,"dataGaLocation":910},{"text":719,"config":1103},{"href":721,"dataGaName":722,"dataGaLocation":910},{"title":735,"links":1105},[1106,1108,1110,1112,1114,1116,1120,1125,1127,1129,1131],{"text":743,"config":1107},{"href":745,"dataGaName":737,"dataGaLocation":910},{"text":748,"config":1109},{"href":750,"dataGaName":751,"dataGaLocation":910},{"text":756,"config":1111},{"href":758,"dataGaName":759,"dataGaLocation":910},{"text":761,"config":1113},{"href":763,"dataGaName":764,"dataGaLocation":910},{"text":766,"config":1115},{"href":768,"dataGaName":769,"dataGaLocation":910},{"text":1117,"config":1118},"Sustainability",{"href":1119,"dataGaName":1117,"dataGaLocation":910},"/sustainability/",{"text":1121,"config":1122},"Diversity, inclusion and belonging (DIB)",{"href":1123,"dataGaName":1124,"dataGaLocation":910},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":771,"config":1126},{"href":773,"dataGaName":774,"dataGaLocation":910},{"text":781,"config":1128},{"href":783,"dataGaName":784,"dataGaLocation":910},{"text":786,"config":1130},{"href":788,"dataGaName":789,"dataGaLocation":910},{"text":1132,"config":1133},"Modern Slavery Transparency Statement",{"href":1134,"dataGaName":1135,"dataGaLocation":910},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1137},[1138,1141,1144],{"text":1139,"config":1140},"Terms",{"href":962,"dataGaName":963,"dataGaLocation":910},{"text":1142,"config":1143},"Cookies",{"dataGaName":972,"dataGaLocation":910,"id":973,"isOneTrustButton":450},{"text":1145,"config":1146},"Privacy",{"href":967,"dataGaName":968,"dataGaLocation":910},[1148],{"id":1149,"title":7,"body":446,"config":1150,"content":1152,"description":446,"extension":1156,"meta":1157,"navigation":450,"path":1158,"seo":1159,"stem":1160,"__hash__":1161},"blogAuthors/en-us/blog/authors/christian-couder.yml",{"template":1151},"BlogAuthor",{"name":7,"config":1153},{"headshot":1154,"ctfId":1155},"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",[1163,1172,1180],{"title":1164,"description":1165,"heroImage":1166,"category":442,"date":1167,"authors":1168,"slug":1171,"externalUrl":446},"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",[1169,1170],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1173,"description":1174,"heroImage":1175,"category":442,"date":1176,"authors":1177,"slug":1179,"externalUrl":446},"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",[1178],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1181,"description":1182,"heroImage":1183,"category":442,"date":1184,"authors":1185,"slug":1187,"externalUrl":446},"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",[1186],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1189},[1190,1204,1216,1228],{"id":1191,"categories":1192,"header":1194,"text":1195,"button":1196,"image":1201},"ai-modernization",[1193],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1197,"config":1198},"Get your AI maturity score",{"href":1199,"dataGaName":1200,"dataGaLocation":675},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1202},{"src":1203},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1205,"categories":1206,"header":1208,"text":1195,"button":1209,"image":1213},"devops-modernization",[1207,1012],"product","Are you just managing tools or shipping innovation?",{"text":1210,"config":1211},"Get your DevOps maturity score",{"href":1212,"dataGaName":1200,"dataGaLocation":675},"/assessments/devops-modernization-assessment/",{"config":1214},{"src":1215},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1217,"categories":1218,"header":1220,"text":1195,"button":1221,"image":1225},"security-modernization",[1219],"security","Are you trading speed for security?",{"text":1222,"config":1223},"Get your security maturity score",{"href":1224,"dataGaName":1200,"dataGaLocation":675},"/assessments/security-modernization-assessment/",{"config":1226},{"src":1227},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1229,"paths":1230,"header":1233,"text":1234,"button":1235,"image":1240},"github-azure-migration",[1231,1232],"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":1236,"config":1237},"See how GitLab compares to GitHub",{"href":1238,"dataGaName":1239,"dataGaLocation":675},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1241},{"src":1215},{"header":1243,"blurb":1244,"button":1245,"secondaryButton":1250},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1246,"config":1247},"Get your free trial",{"href":1248,"dataGaName":474,"dataGaLocation":1249},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":948,"config":1251},{"href":800,"dataGaName":479,"dataGaLocation":1249},1786803755415]