[{"data":1,"prerenderedAt":1030},["ShallowReactive",2],{"/blog/start-using-git":3,"navigation-en-us":242,"banner-en-us":670,"footer-en-us":680,"blog-post-authors-en-us-Ronald van Zon":925,"blog-related-posts-en-us-start-using-git":940,"blog-promotions-en-us":966,"next-steps-en-us":1020},{"id":4,"title":5,"authors":6,"body":8,"category":220,"date":221,"description":222,"extension":223,"externalUrl":224,"faq":224,"featured":225,"heroImage":226,"meta":227,"navigation":228,"path":229,"seo":230,"slug":234,"stem":235,"tags":236,"template":240,"updatedDate":224,"__hash__":241},"blogPosts/en-us/blog/start-using-git.md","How to tidy up your merge requests with Git",[7],"Ronald van Zon",{"type":9,"value":10,"toc":215},"minimark",[11,20,23,26,33,48,53,76,79,82,87,106,129,134,154,159,169,174,177,193,198],[12,13,14,15,19],"p",{},"I've worked on a lot of open source projects and one thing they all have in common is\nwhen you create a merge request (or pull request) they will often ask, \"Can you clean up your request?\"\nbecause commits like ",[16,17,18],"em",{},"fix typo"," should not be included in a Git history.",[12,21,22],{},"Now there are a few ways of cleaning up commits and I'll show you what I have found to be the easiest way.",[12,24,25],{},"Below is an example scenario where I use a feature of Git that has saved me a lot of time.\nI have a tiny project seen in the image below.",[12,27,28],{},[29,30],"img",{"alt":31,"src":32},"Git Project","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399047/blog/Content%20Images/start-using-git/git_demo_project.png",[12,34,35,36,40,41,44,45,47],{},"Now I like to run my ",[37,38,39],"code",{},"main.py"," in a test environment to see if it works as expected.\nI like to do that by configuring a ",[37,42,43],{},".gitlab-ci.yml"," to run ",[37,46,39],{},".\nAlthough this is extremely easy, for this example I made sure I increased the number of commits\nto illustrate my example a bit more clearly. So after some time my commit history looks like this:",[12,49,50],{},[29,51],{"alt":31,"src":52},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399046/blog/Content%20Images/start-using-git/git_commits_bad.png",[12,54,55,56,59,60,62,63,65,66,69,70,72,73,75],{},"Here you can see my first three commits add ",[37,57,58],{},"README.md",", ",[37,61,39],{}," and ",[37,64,43],{},".\nA few commits update my ",[37,67,68],{},"gitlab-ci"," file, trying some stuff out, and fixing typos.\nThere's also a commit that cleans up my ",[37,71,68],{}," and two more to fix and clean up ",[37,74,39],{},".",[12,77,78],{},"Now some of you might see this and think, \"Looks good,\" while others might want to scream at me\nfor making a mess out of my commits.",[12,80,81],{},"How do we fix it?",[83,84,86],"h2",{"id":85},"how-to-consolidate-your-commits","How to consolidate your commits",[12,88,89,90,93,94,97,98,101,102,105],{},"First, let's revert the last two commits using reset.\nWe don't want to lose our changes so we will use ",[37,91,92],{},"git reset --soft HEAD~2",".\n",[37,95,96],{},"--soft"," will keep our changes of the files and ",[37,99,100],{},"HEAD~2"," tells Git the two commits from ",[37,103,104],{},"HEAD"," position should be reverted.",[12,107,108,109,112,113,116,117,120,121,124,125,128],{},"We create a new commit, ",[37,110,111],{},"git commit --fixup 6c29979",". This will create a commit called ",[37,114,115],{},"fixup! Add main Python file",".\nWhen we run ",[37,118,119],{},"git rebase -i --autosquash 24d214a"," we can see below that our ",[37,122,123],{},"fixup"," commit has been moved below\nthe commit we referenced with the tag ",[16,126,127],{},"6c29979",". I could save this and the fixup will be merged into the commit above.",[12,130,131],{},[29,132],{"alt":31,"src":133},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399047/blog/Content%20Images/start-using-git/git_rebase_1.png",[12,135,136,137,139,140,142,143,146,147,149,150,153],{},"But if we look at the commits below the ",[16,138,123],{},", we see that all the commits are related to the ",[16,141,43],{},"\nand by making a small change here, we can clean up my commits in a single go. We will change the ",[16,144,145],{},"pick"," to ",[16,148,123],{}," for all\ncommits but ",[37,151,152],{},"Add default gitlab-ci"," (shown in the image below) and we will save this.",[12,155,156],{},[29,157],{"alt":31,"src":158},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399048/blog/Content%20Images/start-using-git/git_rebase_2.png",[12,160,161,162,165,166,75],{},"Checking our Git log, we see that our long list of commits has been reduced to just three. There is a big change that\nyou should be aware of: because I have just rewritten my Git history I will have to use ",[37,163,164],{},"git push --force"," to update\nany ",[16,167,168],{},"remote repository",[12,170,171],{},[29,172],{"alt":31,"src":173},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399047/blog/Content%20Images/start-using-git/git_commits_good.png",[12,175,176],{},"This looks a lot better now; only the relevant commits are left. But could we have prevented this while working on this\nfeature? The answer is yes.",[12,178,179,180,183,184,187,188,190,191,75],{},"We could have used ",[37,181,182],{},"git commit --amend"," to add almost every commit behind ",[16,185,186],{},"19d8353 Add default gitlab-ci",".\nThis wouldn't require any new commit for any changes that we were making to our ",[37,189,43],{}," file. We would have ended\nup with the following and we already know how to handle the ",[16,192,123],{},[12,194,195],{},[29,196],{"alt":31,"src":197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399046/blog/Content%20Images/start-using-git/git_commits_alternative.png",[12,199,200,201,203,204,206,207,209,210],{},"Something to keep in mind when using features that rewrite the history of your Git repository: If you already\npushed your previous commits to a ",[16,202,168],{}," you will have to use ",[37,205,164],{}," to overwrite the\nhistory of the ",[16,208,168],{},". Bad use of this could cause serious problems, so be careful!\nIf you run into trouble, a useful guide that could help you recover from this is [git push --force and how to deal with it](",[211,212,213],"a",{"href":213,"rel":214},"https://evilmartians.com/chronicles/git-push",[],{"title":216,"searchDepth":217,"depth":217,"links":218},"",2,[219],{"id":85,"depth":217,"text":86},"engineering","2019-02-07","Here's how to use a Git feature that saves a lot of time and cleans up your MRs.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749672243/Blog/Hero%20Images/git-tricks-cover-image.png",{},true,"/en-us/blog/start-using-git",{"title":5,"description":222,"ogTitle":5,"ogDescription":222,"noIndex":225,"ogImage":226,"ogUrl":231,"ogSiteName":232,"ogType":233,"canonicalUrls":231},"https://about.gitlab.com/blog/start-using-git","https://about.gitlab.com","article","start-using-git","en-us/blog/start-using-git",[237,238,239],"user stories","workflow","git","BlogPost","qu3oHCO-mcTaQX08KZgTsRJ4SPChxoY14OYVICkVuJM",{"logo":243,"freeTrial":248,"sales":253,"login":258,"items":263,"search":590,"minimal":621,"duo":640,"switchNav":649,"pricingDeployment":660},{"config":244},{"href":245,"dataGaName":246,"dataGaLocation":247},"/","gitlab logo","header",{"text":249,"config":250},"Get free trial",{"href":251,"dataGaName":252,"dataGaLocation":247},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":254,"config":255},"Request a demo",{"href":256,"dataGaName":257,"dataGaLocation":247},"/sales/?contact-topic=request-demo","sales",{"text":259,"config":260},"Sign in",{"href":261,"dataGaName":262,"dataGaLocation":247},"https://gitlab.com/users/sign_in/","sign in",[264,293,393,398,512,568],{"text":265,"config":266,"menu":268},"Platform",{"dataNavLevelOne":267},"platform",{"type":269,"columns":270},"cards",[271,277,285],{"title":265,"description":272,"link":273},"The intelligent orchestration platform for DevSecOps",{"text":274,"config":275},"Explore our Platform",{"href":276,"dataGaName":267,"dataGaLocation":247},"/platform/",{"title":278,"description":279,"link":280},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":281,"config":282},"Meet GitLab Duo",{"href":283,"dataGaName":284,"dataGaLocation":247},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":286,"description":287,"link":288},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":289,"config":290},"Learn more",{"href":291,"dataGaName":292,"dataGaLocation":247},"/why-gitlab/","why gitlab",{"text":294,"left":228,"config":295,"menu":297},"Product",{"dataNavLevelOne":296},"solutions",{"type":298,"link":299,"columns":303,"feature":372},"lists",{"text":300,"config":301},"View all Solutions",{"href":302,"dataGaName":296,"dataGaLocation":247},"/solutions/",[304,328,351],{"title":305,"description":306,"link":307,"items":312},"Automation","CI/CD and automation to accelerate deployment",{"config":308},{"icon":309,"href":310,"dataGaName":311,"dataGaLocation":247},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[313,317,320,324],{"text":314,"config":315},"CI/CD",{"href":316,"dataGaLocation":247,"dataGaName":314},"/solutions/continuous-integration/",{"text":278,"config":318},{"href":283,"dataGaLocation":247,"dataGaName":319},"gitlab duo agent platform - product menu",{"text":321,"config":322},"Source Code Management",{"href":323,"dataGaLocation":247,"dataGaName":321},"/solutions/source-code-management/",{"text":325,"config":326},"Automated Software Delivery",{"href":310,"dataGaLocation":247,"dataGaName":327},"Automated software delivery",{"title":329,"description":330,"link":331,"items":336},"Security","Deliver code faster without compromising security",{"config":332},{"href":333,"dataGaName":334,"dataGaLocation":247,"icon":335},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[337,341,346],{"text":338,"config":339},"Application Security Testing",{"href":333,"dataGaName":340,"dataGaLocation":247},"Application security testing",{"text":342,"config":343},"Software Supply Chain Security",{"href":344,"dataGaLocation":247,"dataGaName":345},"/solutions/supply-chain/","Software supply chain security",{"text":347,"config":348},"Software Compliance",{"href":349,"dataGaName":350,"dataGaLocation":247},"/solutions/software-compliance/","software compliance",{"title":352,"link":353,"items":358},"Measurement",{"config":354},{"icon":355,"href":356,"dataGaName":357,"dataGaLocation":247},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[359,363,367],{"text":360,"config":361},"Visibility & Measurement",{"href":356,"dataGaLocation":247,"dataGaName":362},"Visibility and Measurement",{"text":364,"config":365},"Value Stream Management",{"href":366,"dataGaLocation":247,"dataGaName":364},"/solutions/value-stream-management/",{"text":368,"config":369},"Analytics & Insights",{"href":370,"dataGaLocation":247,"dataGaName":371},"/solutions/analytics-and-insights/","Analytics and insights",{"title":373,"type":298,"items":374},"GitLab for",[375,381,387],{"text":376,"config":377},"Enterprise",{"icon":378,"href":379,"dataGaLocation":247,"dataGaName":380},"Building","/enterprise/","enterprise",{"text":382,"config":383},"Small Business",{"icon":384,"href":385,"dataGaLocation":247,"dataGaName":386},"Work","/small-business/","small business",{"text":388,"config":389},"Public Sector",{"icon":390,"href":391,"dataGaLocation":247,"dataGaName":392},"Organization","/solutions/public-sector/","public sector",{"text":394,"config":395},"Pricing",{"href":396,"dataGaName":397,"dataGaLocation":247,"dataNavLevelOne":397},"/pricing/","pricing",{"text":399,"config":400,"menu":402},"Resources",{"dataNavLevelOne":401},"resources",{"type":298,"link":403,"columns":407,"feature":501},{"text":404,"config":405},"View all resources",{"href":406,"dataGaName":401,"dataGaLocation":247},"/resources/",[408,441,468],{"title":409,"items":410},"Getting started",[411,416,421,426,431,436],{"text":412,"config":413},"Install",{"href":414,"dataGaName":415,"dataGaLocation":247},"/install/","install",{"text":417,"config":418},"Quick start guides",{"href":419,"dataGaName":420,"dataGaLocation":247},"/get-started/","quick setup checklists",{"text":422,"config":423},"Learn",{"href":424,"dataGaLocation":247,"dataGaName":425},"https://university.gitlab.com/","learn",{"text":427,"config":428},"Product documentation",{"href":429,"dataGaName":430,"dataGaLocation":247},"https://docs.gitlab.com/","product documentation",{"text":432,"config":433},"Best practice videos",{"href":434,"dataGaName":435,"dataGaLocation":247},"/getting-started-videos/","best practice videos",{"text":437,"config":438},"Integrations",{"href":439,"dataGaName":440,"dataGaLocation":247},"/integrations/","integrations",{"title":442,"items":443},"Discover",[444,449,454,459,463],{"text":445,"config":446},"Customer success stories",{"href":447,"dataGaName":448,"dataGaLocation":247},"/customers/","customer success stories",{"text":450,"config":451},"Blog",{"href":452,"dataGaName":453,"dataGaLocation":247},"/blog/","blog",{"text":455,"config":456},"Demo Hub",{"href":457,"dataGaName":458,"dataGaLocation":247},"/demo-hub/","demo hub",{"text":460,"config":461},"The Source",{"href":462,"dataGaName":453,"dataGaLocation":247},"/the-source/",{"text":464,"config":465},"Remote",{"href":466,"dataGaName":467,"dataGaLocation":247},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":469,"items":470},"Connect",[471,476,481,486,491,496],{"text":472,"config":473},"GitLab Services",{"href":474,"dataGaName":475,"dataGaLocation":247},"/services/","services",{"text":477,"config":478},"Contribute",{"href":479,"dataGaName":480,"dataGaLocation":247},"https://contributors.gitlab.com","contribute",{"text":482,"config":483},"Community",{"href":484,"dataGaName":485,"dataGaLocation":247},"/community/","community",{"text":487,"config":488},"Forum",{"href":489,"dataGaName":490,"dataGaLocation":247},"https://forum.gitlab.com/","forum",{"text":492,"config":493},"Events",{"href":494,"dataGaName":495,"dataGaLocation":247},"/events/","events",{"text":497,"config":498},"Partners",{"href":499,"dataGaName":500,"dataGaLocation":247},"/partners/","partners",{"config":502,"title":505,"text":506,"link":507},{"background":503,"textColor":504},"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":508,"config":509},"Read the latest",{"href":510,"dataGaName":511,"dataGaLocation":247},"/whats-new/","whats new",{"text":513,"config":514,"menu":516},"Company",{"dataNavLevelOne":515},"company",{"type":298,"columns":517},[518],{"items":519},[520,525,531,533,538,543,548,553,558,563],{"text":521,"config":522},"About",{"href":523,"dataGaName":524,"dataGaLocation":247},"/company/","about",{"text":526,"config":527,"footerGa":530},"Jobs",{"href":528,"dataGaName":529,"dataGaLocation":247},"/jobs/","jobs",{"dataGaName":529},{"text":492,"config":532},{"href":494,"dataGaName":495,"dataGaLocation":247},{"text":534,"config":535},"Leadership",{"href":536,"dataGaName":537,"dataGaLocation":247},"/company/team/e-group/","leadership",{"text":539,"config":540},"Handbook",{"href":541,"dataGaName":542,"dataGaLocation":247},"https://handbook.gitlab.com/","handbook",{"text":544,"config":545},"Investor relations",{"href":546,"dataGaName":547,"dataGaLocation":247},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":549,"config":550},"Trust Center",{"href":551,"dataGaName":552,"dataGaLocation":247},"/security/","trust center",{"text":554,"config":555},"AI Transparency Center",{"href":556,"dataGaName":557,"dataGaLocation":247},"/ai-transparency-center/","ai transparency center",{"text":559,"config":560},"Newsletter",{"href":561,"dataGaName":562,"dataGaLocation":247},"/company/contact/#contact-forms","newsletter",{"text":564,"config":565},"Press",{"href":566,"dataGaName":567,"dataGaLocation":247},"/press/","press",{"text":569,"config":570,"menu":571},"Contact us",{"dataNavLevelOne":515},{"type":298,"columns":572},[573],{"items":574},[575,580,585],{"text":576,"config":577},"Talk to sales",{"href":578,"dataGaName":579,"dataGaLocation":247},"/sales/","talk to sales",{"text":581,"config":582},"Support portal",{"href":583,"dataGaName":584,"dataGaLocation":247},"https://support.gitlab.com/hc/en-us","support portal",{"text":586,"config":587},"Customer portal",{"href":588,"dataGaName":589,"dataGaLocation":247},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":591,"login":592,"suggestions":599},"Close",{"text":593,"link":594},"To search repositories and projects, login to",{"text":595,"config":596},"gitlab.com",{"href":261,"dataGaName":597,"dataGaLocation":598},"search login","search",{"text":600,"default":601},"Suggestions",[602,604,608,610,614,618],{"text":278,"config":603},{"href":283,"dataGaName":278,"dataGaLocation":598},{"text":605,"config":606},"Code Suggestions (AI)",{"href":607,"dataGaName":605,"dataGaLocation":598},"/solutions/code-suggestions/",{"text":314,"config":609},{"href":316,"dataGaName":314,"dataGaLocation":598},{"text":611,"config":612},"GitLab on AWS",{"href":613,"dataGaName":611,"dataGaLocation":598},"/partners/technology-partners/aws/",{"text":615,"config":616},"GitLab on Google Cloud",{"href":617,"dataGaName":615,"dataGaLocation":598},"/partners/technology-partners/google-cloud-platform/",{"text":619,"config":620},"Why GitLab?",{"href":291,"dataGaName":619,"dataGaLocation":598},{"freeTrial":622,"mobileIcon":627,"desktopIcon":632,"secondaryButton":635},{"text":623,"config":624},"Start free trial",{"href":625,"dataGaName":252,"dataGaLocation":626},"https://gitlab.com/-/trials/new/","nav",{"altText":628,"config":629},"Gitlab Icon",{"src":630,"dataGaName":631,"dataGaLocation":626},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":628,"config":633},{"src":634,"dataGaName":631,"dataGaLocation":626},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":636,"config":637},"Get Started",{"href":638,"dataGaName":639,"dataGaLocation":626},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":641,"mobileIcon":645,"desktopIcon":647},{"text":642,"config":643},"Learn more about GitLab Duo",{"href":283,"dataGaName":644,"dataGaLocation":626},"gitlab duo",{"altText":628,"config":646},{"src":630,"dataGaName":631,"dataGaLocation":626},{"altText":628,"config":648},{"src":634,"dataGaName":631,"dataGaLocation":626},{"button":650,"mobileIcon":655,"desktopIcon":657},{"text":651,"config":652},"/switch",{"href":653,"dataGaName":654,"dataGaLocation":626},"#contact","switch",{"altText":628,"config":656},{"src":630,"dataGaName":631,"dataGaLocation":626},{"altText":628,"config":658},{"src":659,"dataGaName":631,"dataGaLocation":626},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":661,"mobileIcon":666,"desktopIcon":668},{"text":662,"config":663},"Back to pricing",{"href":396,"dataGaName":664,"dataGaLocation":626,"icon":665},"back to pricing","GoBack",{"altText":628,"config":667},{"src":630,"dataGaName":631,"dataGaLocation":626},{"altText":628,"config":669},{"src":634,"dataGaName":631,"dataGaLocation":626},{"title":671,"titleMobile":672,"button":673,"config":678},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":289,"config":674},{"href":675,"dataGaName":676,"dataGaLocation":677},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":679,"disabled":225},"release",{"data":681},{"text":682,"source":683,"edit":689,"contribute":694,"config":699,"items":704,"minimal":914},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":684,"config":685},"View page source",{"href":686,"dataGaName":687,"dataGaLocation":688},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":690,"config":691},"Edit this page",{"href":692,"dataGaName":693,"dataGaLocation":688},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":695,"config":696},"Please contribute",{"href":697,"dataGaName":698,"dataGaLocation":688},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":700,"facebook":701,"youtube":702,"linkedin":703},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[705,752,806,850,882],{"title":394,"links":706,"subMenu":721},[707,711,716],{"text":708,"config":709},"View plans",{"href":396,"dataGaName":710,"dataGaLocation":688},"view plans",{"text":712,"config":713},"Why Premium?",{"href":714,"dataGaName":715,"dataGaLocation":688},"/pricing/premium/","why premium",{"text":717,"config":718},"Why Ultimate?",{"href":719,"dataGaName":720,"dataGaLocation":688},"/pricing/ultimate/","why ultimate",[722],{"title":723,"links":724},"Contact Us",[725,728,730,732,737,742,747],{"text":726,"config":727},"Contact sales",{"href":578,"dataGaName":257,"dataGaLocation":688},{"text":581,"config":729},{"href":583,"dataGaName":584,"dataGaLocation":688},{"text":586,"config":731},{"href":588,"dataGaName":589,"dataGaLocation":688},{"text":733,"config":734},"Status",{"href":735,"dataGaName":736,"dataGaLocation":688},"https://status.gitlab.com/","status",{"text":738,"config":739},"Terms of use",{"href":740,"dataGaName":741,"dataGaLocation":688},"/terms/","terms of use",{"text":743,"config":744},"Privacy statement",{"href":745,"dataGaName":746,"dataGaLocation":688},"/privacy/","privacy statement",{"text":748,"config":749},"Cookie preferences",{"dataGaName":750,"dataGaLocation":688,"id":751,"isOneTrustButton":228},"cookie preferences","ot-sdk-btn",{"title":294,"links":753,"subMenu":762},[754,758],{"text":755,"config":756},"DevSecOps platform",{"href":276,"dataGaName":757,"dataGaLocation":688},"devsecops platform",{"text":759,"config":760},"AI-Assisted Development",{"href":283,"dataGaName":761,"dataGaLocation":688},"ai-assisted development",[763],{"title":764,"links":765},"Topics",[766,771,776,781,786,791,796,801],{"text":767,"config":768},"CICD",{"href":769,"dataGaName":770,"dataGaLocation":688},"/topics/ci-cd/","cicd",{"text":772,"config":773},"GitOps",{"href":774,"dataGaName":775,"dataGaLocation":688},"/topics/gitops/","gitops",{"text":777,"config":778},"DevOps",{"href":779,"dataGaName":780,"dataGaLocation":688},"/topics/devops/","devops",{"text":782,"config":783},"Version Control",{"href":784,"dataGaName":785,"dataGaLocation":688},"/topics/version-control/","version control",{"text":787,"config":788},"DevSecOps",{"href":789,"dataGaName":790,"dataGaLocation":688},"/topics/devsecops/","devsecops",{"text":792,"config":793},"Cloud Native",{"href":794,"dataGaName":795,"dataGaLocation":688},"/topics/cloud-native/","cloud native",{"text":797,"config":798},"AI for Coding",{"href":799,"dataGaName":800,"dataGaLocation":688},"/topics/devops/ai-for-coding/","ai for coding",{"text":802,"config":803},"Agentic AI",{"href":804,"dataGaName":805,"dataGaLocation":688},"/topics/agentic-ai/","agentic ai",{"title":807,"links":808},"Solutions",[809,811,813,818,822,825,829,832,834,837,840,845],{"text":338,"config":810},{"href":333,"dataGaName":338,"dataGaLocation":688},{"text":327,"config":812},{"href":310,"dataGaName":311,"dataGaLocation":688},{"text":814,"config":815},"Agile development",{"href":816,"dataGaName":817,"dataGaLocation":688},"/solutions/agile-delivery/","agile delivery",{"text":819,"config":820},"SCM",{"href":323,"dataGaName":821,"dataGaLocation":688},"source code management",{"text":767,"config":823},{"href":316,"dataGaName":824,"dataGaLocation":688},"continuous integration & delivery",{"text":826,"config":827},"Value stream management",{"href":366,"dataGaName":828,"dataGaLocation":688},"value stream management",{"text":772,"config":830},{"href":831,"dataGaName":775,"dataGaLocation":688},"/solutions/gitops/",{"text":376,"config":833},{"href":379,"dataGaName":380,"dataGaLocation":688},{"text":835,"config":836},"Small business",{"href":385,"dataGaName":386,"dataGaLocation":688},{"text":838,"config":839},"Public sector",{"href":391,"dataGaName":392,"dataGaLocation":688},{"text":841,"config":842},"Education",{"href":843,"dataGaName":844,"dataGaLocation":688},"/solutions/education/","education",{"text":846,"config":847},"Financial services",{"href":848,"dataGaName":849,"dataGaLocation":688},"/solutions/finance/","financial services",{"title":399,"links":851},[852,854,856,858,861,863,866,868,870,872,874,876,878,880],{"text":412,"config":853},{"href":414,"dataGaName":415,"dataGaLocation":688},{"text":417,"config":855},{"href":419,"dataGaName":420,"dataGaLocation":688},{"text":422,"config":857},{"href":424,"dataGaName":425,"dataGaLocation":688},{"text":427,"config":859},{"href":429,"dataGaName":860,"dataGaLocation":688},"docs",{"text":450,"config":862},{"href":452,"dataGaName":453,"dataGaLocation":688},{"text":864,"config":865},"What's new",{"href":510,"dataGaName":511,"dataGaLocation":688},{"text":445,"config":867},{"href":447,"dataGaName":448,"dataGaLocation":688},{"text":464,"config":869},{"href":466,"dataGaName":467,"dataGaLocation":688},{"text":472,"config":871},{"href":474,"dataGaName":475,"dataGaLocation":688},{"text":477,"config":873},{"href":479,"dataGaName":480,"dataGaLocation":688},{"text":482,"config":875},{"href":484,"dataGaName":485,"dataGaLocation":688},{"text":487,"config":877},{"href":489,"dataGaName":490,"dataGaLocation":688},{"text":492,"config":879},{"href":494,"dataGaName":495,"dataGaLocation":688},{"text":497,"config":881},{"href":499,"dataGaName":500,"dataGaLocation":688},{"title":513,"links":883},[884,886,888,890,892,894,898,903,905,907,909],{"text":521,"config":885},{"href":523,"dataGaName":515,"dataGaLocation":688},{"text":526,"config":887},{"href":528,"dataGaName":529,"dataGaLocation":688},{"text":534,"config":889},{"href":536,"dataGaName":537,"dataGaLocation":688},{"text":539,"config":891},{"href":541,"dataGaName":542,"dataGaLocation":688},{"text":544,"config":893},{"href":546,"dataGaName":547,"dataGaLocation":688},{"text":895,"config":896},"Sustainability",{"href":897,"dataGaName":895,"dataGaLocation":688},"/sustainability/",{"text":899,"config":900},"Diversity, inclusion and belonging (DIB)",{"href":901,"dataGaName":902,"dataGaLocation":688},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":549,"config":904},{"href":551,"dataGaName":552,"dataGaLocation":688},{"text":559,"config":906},{"href":561,"dataGaName":562,"dataGaLocation":688},{"text":564,"config":908},{"href":566,"dataGaName":567,"dataGaLocation":688},{"text":910,"config":911},"Modern Slavery Transparency Statement",{"href":912,"dataGaName":913,"dataGaLocation":688},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":915},[916,919,922],{"text":917,"config":918},"Terms",{"href":740,"dataGaName":741,"dataGaLocation":688},{"text":920,"config":921},"Cookies",{"dataGaName":750,"dataGaLocation":688,"id":751,"isOneTrustButton":228},{"text":923,"config":924},"Privacy",{"href":745,"dataGaName":746,"dataGaLocation":688},[926],{"id":927,"title":928,"body":224,"config":929,"content":931,"description":224,"extension":934,"meta":935,"navigation":228,"path":936,"seo":937,"stem":938,"__hash__":939},"blogAuthors/en-us/blog/authors/ronald-van-zon.yml","Ronald Van Zon",{"template":930},"BlogAuthor",{"name":7,"config":932},{"headshot":216,"ctfId":933},"Eagllus","yml",{},"/en-us/blog/authors/ronald-van-zon",{},"en-us/blog/authors/ronald-van-zon","Wk95wlmtXlY6l4tChCzK5twZdSb5UQ22Kk9YfFj8rjo",[941,950,958],{"title":942,"description":943,"heroImage":944,"category":220,"date":945,"authors":946,"slug":949,"externalUrl":224},"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",[947,948],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":951,"description":952,"heroImage":953,"category":220,"date":954,"authors":955,"slug":957,"externalUrl":224},"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",[956],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":959,"description":960,"heroImage":961,"category":220,"date":962,"authors":963,"slug":965,"externalUrl":224},"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",[964],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":967},[968,982,994,1006],{"id":969,"categories":970,"header":972,"text":973,"button":974,"image":979},"ai-modernization",[971],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":975,"config":976},"Get your AI maturity score",{"href":977,"dataGaName":978,"dataGaLocation":453},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":980},{"src":981},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":983,"categories":984,"header":986,"text":973,"button":987,"image":991},"devops-modernization",[985,790],"product","Are you just managing tools or shipping innovation?",{"text":988,"config":989},"Get your DevOps maturity score",{"href":990,"dataGaName":978,"dataGaLocation":453},"/assessments/devops-modernization-assessment/",{"config":992},{"src":993},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":995,"categories":996,"header":998,"text":973,"button":999,"image":1003},"security-modernization",[997],"security","Are you trading speed for security?",{"text":1000,"config":1001},"Get your security maturity score",{"href":1002,"dataGaName":978,"dataGaLocation":453},"/assessments/security-modernization-assessment/",{"config":1004},{"src":1005},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1007,"paths":1008,"header":1011,"text":1012,"button":1013,"image":1018},"github-azure-migration",[1009,1010],"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":1014,"config":1015},"See how GitLab compares to GitHub",{"href":1016,"dataGaName":1017,"dataGaLocation":453},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1019},{"src":993},{"header":1021,"blurb":1022,"button":1023,"secondaryButton":1028},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1024,"config":1025},"Get your free trial",{"href":1026,"dataGaName":252,"dataGaLocation":1027},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":726,"config":1029},{"href":578,"dataGaName":257,"dataGaLocation":1027},1786803754965]