[{"data":1,"prerenderedAt":1135},["ShallowReactive",2],{"/blog/keeping-your-code-protected":3,"navigation-en-us":349,"banner-en-us":775,"footer-en-us":785,"blog-post-authors-en-us-Job van der Voort":1030,"blog-related-posts-en-us-keeping-your-code-protected":1046,"blog-promotions-en-us":1071,"next-steps-en-us":1125},{"id":4,"title":5,"authors":6,"body":8,"category":304,"date":305,"description":306,"extension":307,"externalUrl":308,"faq":308,"featured":309,"heroImage":310,"meta":311,"navigation":339,"path":340,"seo":341,"slug":345,"stem":346,"tags":308,"template":347,"updatedDate":308,"__hash__":348},"blogPosts/en-us/blog/keeping-your-code-protected.md","How GitLab Permissions and Protected Branches Keep Your Code Safe",[7],"Job van der Voort",{"type":9,"value":10,"toc":297},"minimark",[11,20,31,41,52,60,65,75,78,97,104,111,117,120,124,131,148,151,161,174,181,188,193,196,200,208,218,228,244,250,253,259,266,270,283,290],[12,13,14,15,19],"p",{},"Git is very easy to use and abuse.\nA single ",[16,17,18],"code",{},"git push --force"," command can easily ruin the day for a lot of people:",[21,22,23],"blockquote",{},[12,24,25,26,30],{},"As a result, these ",[27,28,29],"span",{},"186 Jenkins'"," repositories have their branch heads rewinded to point to older commits, and in effect the newer commits were misplaced after the bad git-push.",[12,32,33,34,40],{},"On November 10, 2013, a Jenkins developer had ",[35,36,39],"a",{"href":37,"rel":38},"http://jenkins-ci.org/content/summary-report-git-repository-disruption-incident-nov-10th",[],"accidentally forced pushed"," to 186 repositories,\nbringing them back two months in time.",[12,42,43,44,46,47,51],{},"The power that Git gives you to change history is great when you're working alone,\nbut potentially disrupting if you're working with others, as shown by a poor Jenkins developer.\nWhen you're working with others, not only do you not want to allow ",[16,45,18],{},",\nbut before anything is committed to the main repository or branch, the ",[48,49,50],"strong",{},"code should be reviewed",".",[12,53,54,55,59],{},"At GitLab we believe that by preventing force pushes and by stimulating ",[35,56,58],{"href":57},"/solutions/source-code-management/","code review"," practices,\nmistakes can be easily avoided and code quality will improve.\nTo make it easier to work together with code and Git we have created a surprisingly simple permission system,\nbuilt on top of an elegant authorization method.",[61,62,64],"h2",{"id":63},"read-write","Read, Write",[12,66,67,68,51],{},"Permissions in GitLab are fundamentally defined around the idea of having read or write permission to the repository and branches.\nNot only is this an easy-to-grasp concept, it doesn't add any unnecessary complexity to permission management while still offering granular access control.\nBy naming our permissions after their role within a project, it immediately becomes clear what each permission is intended for. ",[48,69,70,71],{},"In GitLab, developers are called ",[72,73,74],"em",{},"Developer",[12,76,77],{},"In our experience, this covers almost all cases and can be fitted to any organisation easily.",[79,80,81,85,88,91,94],"ul",{},[82,83,84],"li",{},"Guest     - No access to code",[82,86,87],{},"Reporter  - Read the repository",[82,89,90],{},"Developer - Read/Write to the repository",[82,92,93],{},"Maintainer - Read/Write to the repository + partial administrative capabilities",[82,95,96],{},"Owner     - Read/Write to the repository + full administrative capabilities",[12,98,99,100,103],{},"The permissions are named to reflect their purpose. A user with the lowest private permission ",[72,101,102],{},"Guest","\nis only able to make use of the issues in a project and does not have read access to the code;\na guest of the project.",[12,105,106,107,110],{},"The ",[72,108,109],{},"Reporter"," permission has the same abilities, but also has read access to the code,\nmeaning they can fork the project.\nThis is ideal for those that you do not want to be pushing to your repository,\nbut still want to give access to the code and give the option to fork off.",[12,112,113,114,116],{},"As the name implies, developers on a project should get the role ",[72,115,74],{},".\nAny developer has write permission to the repository, meaning they can branch off,\nwork in and push their own branch back to the repository.",[12,118,119],{},"By defining permission on a read/write basis with clear names,\nit quickly becomes clear which permission or access level should be used to secure a project.\nHowever, they do not solve the issues with modifying history,\nnor do they help with collaboration: anyone can (force) push to any branch (such as the master or default branch).",[61,121,123],{"id":122},"protecting-your-code-with-protected-branches","Protecting your code with protected branches",[12,125,126,127,130],{},"To stop people from messing with history or pushing code without review, we've created ",[48,128,129],{},"protected branches"," to add a layer of branch protection. A protected branch does three simple things:",[79,132,133,136,143],{},[82,134,135],{},"it prevents pushes from everybody except users with Maintainer permission",[82,137,138,139,142],{},"it prevents ",[72,140,141],{},"anyone"," from force pushing to the branch",[82,144,138,145,147],{},[72,146,141],{}," from deleting the branch",[12,149,150],{},"You can make any branch a protected branch. We make the master branch a protected branch by default, but you can turn that off.",[12,152,153],{},[35,154,156],{"href":155},"/images/protected_branches.png",[157,158],"img",{"alt":159,"src":160},"protected branches in GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404892/site/Content%20Images/protected_branches.png",[12,162,163],{},[72,164,165],{},[48,166,167,168,173],{},"We use protected branches on the ",[35,169,172],{"href":170,"rel":171},"https://gitlab.com/gitlab-org/gitlab-ce",[],"GitLab repository"," to protect our release branches",[12,175,176,177,180],{},"Now, if you want to contribute code to a protected branch as a developer, you can simply push your feature branch and ",[48,178,179],{},"create a merge request"," towards the protected branch. History is protected and the code gets reviewed before it's merged.",[12,182,183,184,187],{},"Note that even ",[72,185,186],{},"Maintainer"," is not able to force push to or delete a protected branch. We believe in a simple solution:",[21,189,190],{},[12,191,192],{},"Do not let anyone change the history of a shared branch. Revert changes in the present.",[12,194,195],{},"You can easily add a commit on top of history to revert earlier changes.\nThis is much easier to work with than changes in history on top of which people already committed.\nIn addition, you probably do not want to delete such an important branch, hence the inability to remove it.",[61,197,199],{"id":198},"how-we-define-permissions","How we define permissions",[12,201,202,203,51],{},"By basing permissions on simple principles and adding protected branches,\nGitLab allows you to set up any type of workflow, while protecting your code from easily made mistakes.\nUnderlying this elegant scheme is a surprisingly simple authorization gem,\n",[35,204,207],{"href":205,"rel":206},"https://gitlab.com/dzaporozhets/six",[],"Six",[12,209,210,211,214,215,217],{},"In a single class ",[16,212,213],{},"Ability",", we have defined a number of class methods to set the permissions.\nFor instance, for ",[72,216,74],{},":",[219,220,226],"pre",{"className":221,"code":223,"language":224,"meta":225},[222],"language-text","# app/models/ability.rb:139\ndef project_dev_rules\n  project_report_rules + [\n    :write_merge_request,\n    :write_wiki,\n    :modify_issue,\n    :admin_issue,\n    :admin_label,\n    :push_code\n  ]\nend\n","text","",[16,227,223],{"__ignoreMap":225},[12,229,230,231,234,235,237,238,243],{},"Six has defined an ",[16,232,233],{},"allowed?"," method that check whether a permission exists for a certain object,\nbased on the abilities that you've defined for that class (such as above for ",[72,236,74],{},").\nTo make use of a similar syntax as the often-used ",[35,239,242],{"href":240,"rel":241},"https://github.com/ryanb/cancan",[],"Cancan"," authorization gem, you can define a similar method with Six:",[219,245,248],{"className":246,"code":247,"language":224,"meta":225},[222],"# app/models/user.rb:351\ndef can?(object, action, subject)\n  abilities.allowed?(object, action, subject)\nend\n",[16,249,247],{"__ignoreMap":225},[12,251,252],{},"Then all we have to do is check the permission wherever we need it.\nFor instance to check whether someone is allowed to destroy a snippet:",[219,254,257],{"className":255,"code":256,"language":224,"meta":225},[222],"def destroy\n  return access_denied! unless can?(current_user, :admin_personal_snippet, @snippet)\n  @snippet.destroy\n  redirect_to snippets_path\nend\n",[16,258,256],{"__ignoreMap":225},[12,260,261,262,265],{},"By using the plain-ruby approach of ",[35,263,207],{"href":205,"rel":264},[]," you get a very flexible\nand expendable authorization solution.\nIn GitLab we leverage this to create easy to understand permissions\nthat reflect how most organisations use GitLab.",[61,267,269],{"id":268},"about-gitlab","About GitLab",[12,271,272,273,277,278,51],{},"Interested in trying GitLab's protected branches?\nYou can try GitLab by ",[35,274,276],{"href":275},"/install/","downloading"," the Community Edition and installing it on your own server or by signing up to our free, unlimited GitLab instance ",[35,279,282],{"href":280,"rel":281},"https://gitlab.com/users/sign_up",[],"GitLab.com",[12,284,285,286,51],{},"For support, deep LDAP integration, git hooks, Jenkins integration and more enterprise features, check out ",[35,287,289],{"href":288},"/pricing/feature-comparison/","GitLab Enterprise Edition",[12,291,292,293,51],{},"For more on Git workflows, read our article on ",[35,294,296],{"href":295},"/topics/version-control/what-is-gitlab-flow/","GitLab Flow",{"title":225,"searchDepth":298,"depth":298,"links":299},2,[300,301,302,303],{"id":63,"depth":298,"text":64},{"id":122,"depth":298,"text":123},{"id":198,"depth":298,"text":199},{"id":268,"depth":298,"text":269},"insights","2014-11-26","At GitLab we believe that by preventing force pushes and by stimulating code review practices, mistakes can be easily avoided and code quality will improve.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749684249/Blog/Hero%20Images/how-permissions-and-protected-branches-keep-your-code-safe.jpg",{"excerpt":312},{"type":9,"value":313},[314,318,324,329,335],[12,315,14,316,19],{},[16,317,18],{},[21,319,320],{},[12,321,25,322,30],{},[27,323,29],{},[12,325,33,326,40],{},[35,327,39],{"href":37,"rel":328},[],[12,330,43,331,46,333,51],{},[16,332,18],{},[48,334,50],{},[12,336,54,337,59],{},[35,338,58],{"href":57},true,"/en-us/blog/keeping-your-code-protected",{"title":5,"description":306,"ogTitle":5,"ogDescription":306,"noIndex":309,"ogImage":310,"ogUrl":342,"ogSiteName":343,"ogType":344,"canonicalUrls":342},"https://about.gitlab.com/blog/keeping-your-code-protected","https://about.gitlab.com","article","keeping-your-code-protected","en-us/blog/keeping-your-code-protected","BlogPost","muIoKLCPB7wUvquKsLw3ui8hIOZ7du-HtSgukQgfgLk",{"logo":350,"freeTrial":355,"sales":360,"login":365,"items":370,"search":695,"minimal":726,"duo":745,"switchNav":754,"pricingDeployment":765},{"config":351},{"href":352,"dataGaName":353,"dataGaLocation":354},"/","gitlab logo","header",{"text":356,"config":357},"Get free trial",{"href":358,"dataGaName":359,"dataGaLocation":354},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":361,"config":362},"Request a demo",{"href":363,"dataGaName":364,"dataGaLocation":354},"/sales/?contact-topic=request-demo","sales",{"text":366,"config":367},"Sign in",{"href":368,"dataGaName":369,"dataGaLocation":354},"https://gitlab.com/users/sign_in/","sign in",[371,400,499,504,617,673],{"text":372,"config":373,"menu":375},"Platform",{"dataNavLevelOne":374},"platform",{"type":376,"columns":377},"cards",[378,384,392],{"title":372,"description":379,"link":380},"The intelligent orchestration platform for DevSecOps",{"text":381,"config":382},"Explore our Platform",{"href":383,"dataGaName":374,"dataGaLocation":354},"/platform/",{"title":385,"description":386,"link":387},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":388,"config":389},"Meet GitLab Duo",{"href":390,"dataGaName":391,"dataGaLocation":354},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":393,"description":394,"link":395},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":396,"config":397},"Learn more",{"href":398,"dataGaName":399,"dataGaLocation":354},"/why-gitlab/","why gitlab",{"text":401,"left":339,"config":402,"menu":404},"Product",{"dataNavLevelOne":403},"solutions",{"type":405,"link":406,"columns":410,"feature":478},"lists",{"text":407,"config":408},"View all Solutions",{"href":409,"dataGaName":403,"dataGaLocation":354},"/solutions/",[411,434,457],{"title":412,"description":413,"link":414,"items":419},"Automation","CI/CD and automation to accelerate deployment",{"config":415},{"icon":416,"href":417,"dataGaName":418,"dataGaLocation":354},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[420,424,427,430],{"text":421,"config":422},"CI/CD",{"href":423,"dataGaLocation":354,"dataGaName":421},"/solutions/continuous-integration/",{"text":385,"config":425},{"href":390,"dataGaLocation":354,"dataGaName":426},"gitlab duo agent platform - product menu",{"text":428,"config":429},"Source Code Management",{"href":57,"dataGaLocation":354,"dataGaName":428},{"text":431,"config":432},"Automated Software Delivery",{"href":417,"dataGaLocation":354,"dataGaName":433},"Automated software delivery",{"title":435,"description":436,"link":437,"items":442},"Security","Deliver code faster without compromising security",{"config":438},{"href":439,"dataGaName":440,"dataGaLocation":354,"icon":441},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[443,447,452],{"text":444,"config":445},"Application Security Testing",{"href":439,"dataGaName":446,"dataGaLocation":354},"Application security testing",{"text":448,"config":449},"Software Supply Chain Security",{"href":450,"dataGaLocation":354,"dataGaName":451},"/solutions/supply-chain/","Software supply chain security",{"text":453,"config":454},"Software Compliance",{"href":455,"dataGaName":456,"dataGaLocation":354},"/solutions/software-compliance/","software compliance",{"title":458,"link":459,"items":464},"Measurement",{"config":460},{"icon":461,"href":462,"dataGaName":463,"dataGaLocation":354},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[465,469,473],{"text":466,"config":467},"Visibility & Measurement",{"href":462,"dataGaLocation":354,"dataGaName":468},"Visibility and Measurement",{"text":470,"config":471},"Value Stream Management",{"href":472,"dataGaLocation":354,"dataGaName":470},"/solutions/value-stream-management/",{"text":474,"config":475},"Analytics & Insights",{"href":476,"dataGaLocation":354,"dataGaName":477},"/solutions/analytics-and-insights/","Analytics and insights",{"title":479,"type":405,"items":480},"GitLab for",[481,487,493],{"text":482,"config":483},"Enterprise",{"icon":484,"href":485,"dataGaLocation":354,"dataGaName":486},"Building","/enterprise/","enterprise",{"text":488,"config":489},"Small Business",{"icon":490,"href":491,"dataGaLocation":354,"dataGaName":492},"Work","/small-business/","small business",{"text":494,"config":495},"Public Sector",{"icon":496,"href":497,"dataGaLocation":354,"dataGaName":498},"Organization","/solutions/public-sector/","public sector",{"text":500,"config":501},"Pricing",{"href":502,"dataGaName":503,"dataGaLocation":354,"dataNavLevelOne":503},"/pricing/","pricing",{"text":505,"config":506,"menu":508},"Resources",{"dataNavLevelOne":507},"resources",{"type":405,"link":509,"columns":513,"feature":606},{"text":510,"config":511},"View all resources",{"href":512,"dataGaName":507,"dataGaLocation":354},"/resources/",[514,546,573],{"title":515,"items":516},"Getting started",[517,521,526,531,536,541],{"text":518,"config":519},"Install",{"href":275,"dataGaName":520,"dataGaLocation":354},"install",{"text":522,"config":523},"Quick start guides",{"href":524,"dataGaName":525,"dataGaLocation":354},"/get-started/","quick setup checklists",{"text":527,"config":528},"Learn",{"href":529,"dataGaLocation":354,"dataGaName":530},"https://university.gitlab.com/","learn",{"text":532,"config":533},"Product documentation",{"href":534,"dataGaName":535,"dataGaLocation":354},"https://docs.gitlab.com/","product documentation",{"text":537,"config":538},"Best practice videos",{"href":539,"dataGaName":540,"dataGaLocation":354},"/getting-started-videos/","best practice videos",{"text":542,"config":543},"Integrations",{"href":544,"dataGaName":545,"dataGaLocation":354},"/integrations/","integrations",{"title":547,"items":548},"Discover",[549,554,559,564,568],{"text":550,"config":551},"Customer success stories",{"href":552,"dataGaName":553,"dataGaLocation":354},"/customers/","customer success stories",{"text":555,"config":556},"Blog",{"href":557,"dataGaName":558,"dataGaLocation":354},"/blog/","blog",{"text":560,"config":561},"Demo Hub",{"href":562,"dataGaName":563,"dataGaLocation":354},"/demo-hub/","demo hub",{"text":565,"config":566},"The Source",{"href":567,"dataGaName":558,"dataGaLocation":354},"/the-source/",{"text":569,"config":570},"Remote",{"href":571,"dataGaName":572,"dataGaLocation":354},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":574,"items":575},"Connect",[576,581,586,591,596,601],{"text":577,"config":578},"GitLab Services",{"href":579,"dataGaName":580,"dataGaLocation":354},"/services/","services",{"text":582,"config":583},"Contribute",{"href":584,"dataGaName":585,"dataGaLocation":354},"https://contributors.gitlab.com","contribute",{"text":587,"config":588},"Community",{"href":589,"dataGaName":590,"dataGaLocation":354},"/community/","community",{"text":592,"config":593},"Forum",{"href":594,"dataGaName":595,"dataGaLocation":354},"https://forum.gitlab.com/","forum",{"text":597,"config":598},"Events",{"href":599,"dataGaName":600,"dataGaLocation":354},"/events/","events",{"text":602,"config":603},"Partners",{"href":604,"dataGaName":605,"dataGaLocation":354},"/partners/","partners",{"config":607,"title":610,"text":611,"link":612},{"background":608,"textColor":609},"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":613,"config":614},"Read the latest",{"href":615,"dataGaName":616,"dataGaLocation":354},"/whats-new/","whats new",{"text":618,"config":619,"menu":621},"Company",{"dataNavLevelOne":620},"company",{"type":405,"columns":622},[623],{"items":624},[625,630,636,638,643,648,653,658,663,668],{"text":626,"config":627},"About",{"href":628,"dataGaName":629,"dataGaLocation":354},"/company/","about",{"text":631,"config":632,"footerGa":635},"Jobs",{"href":633,"dataGaName":634,"dataGaLocation":354},"/jobs/","jobs",{"dataGaName":634},{"text":597,"config":637},{"href":599,"dataGaName":600,"dataGaLocation":354},{"text":639,"config":640},"Leadership",{"href":641,"dataGaName":642,"dataGaLocation":354},"/company/team/e-group/","leadership",{"text":644,"config":645},"Handbook",{"href":646,"dataGaName":647,"dataGaLocation":354},"https://handbook.gitlab.com/","handbook",{"text":649,"config":650},"Investor relations",{"href":651,"dataGaName":652,"dataGaLocation":354},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":654,"config":655},"Trust Center",{"href":656,"dataGaName":657,"dataGaLocation":354},"/security/","trust center",{"text":659,"config":660},"AI Transparency Center",{"href":661,"dataGaName":662,"dataGaLocation":354},"/ai-transparency-center/","ai transparency center",{"text":664,"config":665},"Newsletter",{"href":666,"dataGaName":667,"dataGaLocation":354},"/company/contact/#contact-forms","newsletter",{"text":669,"config":670},"Press",{"href":671,"dataGaName":672,"dataGaLocation":354},"/press/","press",{"text":674,"config":675,"menu":676},"Contact us",{"dataNavLevelOne":620},{"type":405,"columns":677},[678],{"items":679},[680,685,690],{"text":681,"config":682},"Talk to sales",{"href":683,"dataGaName":684,"dataGaLocation":354},"/sales/","talk to sales",{"text":686,"config":687},"Support portal",{"href":688,"dataGaName":689,"dataGaLocation":354},"https://support.gitlab.com/hc/en-us","support portal",{"text":691,"config":692},"Customer portal",{"href":693,"dataGaName":694,"dataGaLocation":354},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":696,"login":697,"suggestions":704},"Close",{"text":698,"link":699},"To search repositories and projects, login to",{"text":700,"config":701},"gitlab.com",{"href":368,"dataGaName":702,"dataGaLocation":703},"search login","search",{"text":705,"default":706},"Suggestions",[707,709,713,715,719,723],{"text":385,"config":708},{"href":390,"dataGaName":385,"dataGaLocation":703},{"text":710,"config":711},"Code Suggestions (AI)",{"href":712,"dataGaName":710,"dataGaLocation":703},"/solutions/code-suggestions/",{"text":421,"config":714},{"href":423,"dataGaName":421,"dataGaLocation":703},{"text":716,"config":717},"GitLab on AWS",{"href":718,"dataGaName":716,"dataGaLocation":703},"/partners/technology-partners/aws/",{"text":720,"config":721},"GitLab on Google Cloud",{"href":722,"dataGaName":720,"dataGaLocation":703},"/partners/technology-partners/google-cloud-platform/",{"text":724,"config":725},"Why GitLab?",{"href":398,"dataGaName":724,"dataGaLocation":703},{"freeTrial":727,"mobileIcon":732,"desktopIcon":737,"secondaryButton":740},{"text":728,"config":729},"Start free trial",{"href":730,"dataGaName":359,"dataGaLocation":731},"https://gitlab.com/-/trials/new/","nav",{"altText":733,"config":734},"Gitlab Icon",{"src":735,"dataGaName":736,"dataGaLocation":731},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":733,"config":738},{"src":739,"dataGaName":736,"dataGaLocation":731},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":741,"config":742},"Get Started",{"href":743,"dataGaName":744,"dataGaLocation":731},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":746,"mobileIcon":750,"desktopIcon":752},{"text":747,"config":748},"Learn more about GitLab Duo",{"href":390,"dataGaName":749,"dataGaLocation":731},"gitlab duo",{"altText":733,"config":751},{"src":735,"dataGaName":736,"dataGaLocation":731},{"altText":733,"config":753},{"src":739,"dataGaName":736,"dataGaLocation":731},{"button":755,"mobileIcon":760,"desktopIcon":762},{"text":756,"config":757},"/switch",{"href":758,"dataGaName":759,"dataGaLocation":731},"#contact","switch",{"altText":733,"config":761},{"src":735,"dataGaName":736,"dataGaLocation":731},{"altText":733,"config":763},{"src":764,"dataGaName":736,"dataGaLocation":731},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":766,"mobileIcon":771,"desktopIcon":773},{"text":767,"config":768},"Back to pricing",{"href":502,"dataGaName":769,"dataGaLocation":731,"icon":770},"back to pricing","GoBack",{"altText":733,"config":772},{"src":735,"dataGaName":736,"dataGaLocation":731},{"altText":733,"config":774},{"src":739,"dataGaName":736,"dataGaLocation":731},{"title":776,"titleMobile":777,"button":778,"config":783},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":396,"config":779},{"href":780,"dataGaName":781,"dataGaLocation":782},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":784,"disabled":309},"release",{"data":786},{"text":787,"source":788,"edit":794,"contribute":799,"config":804,"items":809,"minimal":1019},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":789,"config":790},"View page source",{"href":791,"dataGaName":792,"dataGaLocation":793},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":795,"config":796},"Edit this page",{"href":797,"dataGaName":798,"dataGaLocation":793},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":800,"config":801},"Please contribute",{"href":802,"dataGaName":803,"dataGaLocation":793},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":805,"facebook":806,"youtube":807,"linkedin":808},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[810,857,911,955,987],{"title":500,"links":811,"subMenu":826},[812,816,821],{"text":813,"config":814},"View plans",{"href":502,"dataGaName":815,"dataGaLocation":793},"view plans",{"text":817,"config":818},"Why Premium?",{"href":819,"dataGaName":820,"dataGaLocation":793},"/pricing/premium/","why premium",{"text":822,"config":823},"Why Ultimate?",{"href":824,"dataGaName":825,"dataGaLocation":793},"/pricing/ultimate/","why ultimate",[827],{"title":828,"links":829},"Contact Us",[830,833,835,837,842,847,852],{"text":831,"config":832},"Contact sales",{"href":683,"dataGaName":364,"dataGaLocation":793},{"text":686,"config":834},{"href":688,"dataGaName":689,"dataGaLocation":793},{"text":691,"config":836},{"href":693,"dataGaName":694,"dataGaLocation":793},{"text":838,"config":839},"Status",{"href":840,"dataGaName":841,"dataGaLocation":793},"https://status.gitlab.com/","status",{"text":843,"config":844},"Terms of use",{"href":845,"dataGaName":846,"dataGaLocation":793},"/terms/","terms of use",{"text":848,"config":849},"Privacy statement",{"href":850,"dataGaName":851,"dataGaLocation":793},"/privacy/","privacy statement",{"text":853,"config":854},"Cookie preferences",{"dataGaName":855,"dataGaLocation":793,"id":856,"isOneTrustButton":339},"cookie preferences","ot-sdk-btn",{"title":401,"links":858,"subMenu":867},[859,863],{"text":860,"config":861},"DevSecOps platform",{"href":383,"dataGaName":862,"dataGaLocation":793},"devsecops platform",{"text":864,"config":865},"AI-Assisted Development",{"href":390,"dataGaName":866,"dataGaLocation":793},"ai-assisted development",[868],{"title":869,"links":870},"Topics",[871,876,881,886,891,896,901,906],{"text":872,"config":873},"CICD",{"href":874,"dataGaName":875,"dataGaLocation":793},"/topics/ci-cd/","cicd",{"text":877,"config":878},"GitOps",{"href":879,"dataGaName":880,"dataGaLocation":793},"/topics/gitops/","gitops",{"text":882,"config":883},"DevOps",{"href":884,"dataGaName":885,"dataGaLocation":793},"/topics/devops/","devops",{"text":887,"config":888},"Version Control",{"href":889,"dataGaName":890,"dataGaLocation":793},"/topics/version-control/","version control",{"text":892,"config":893},"DevSecOps",{"href":894,"dataGaName":895,"dataGaLocation":793},"/topics/devsecops/","devsecops",{"text":897,"config":898},"Cloud Native",{"href":899,"dataGaName":900,"dataGaLocation":793},"/topics/cloud-native/","cloud native",{"text":902,"config":903},"AI for Coding",{"href":904,"dataGaName":905,"dataGaLocation":793},"/topics/devops/ai-for-coding/","ai for coding",{"text":907,"config":908},"Agentic AI",{"href":909,"dataGaName":910,"dataGaLocation":793},"/topics/agentic-ai/","agentic ai",{"title":912,"links":913},"Solutions",[914,916,918,923,927,930,934,937,939,942,945,950],{"text":444,"config":915},{"href":439,"dataGaName":444,"dataGaLocation":793},{"text":433,"config":917},{"href":417,"dataGaName":418,"dataGaLocation":793},{"text":919,"config":920},"Agile development",{"href":921,"dataGaName":922,"dataGaLocation":793},"/solutions/agile-delivery/","agile delivery",{"text":924,"config":925},"SCM",{"href":57,"dataGaName":926,"dataGaLocation":793},"source code management",{"text":872,"config":928},{"href":423,"dataGaName":929,"dataGaLocation":793},"continuous integration & delivery",{"text":931,"config":932},"Value stream management",{"href":472,"dataGaName":933,"dataGaLocation":793},"value stream management",{"text":877,"config":935},{"href":936,"dataGaName":880,"dataGaLocation":793},"/solutions/gitops/",{"text":482,"config":938},{"href":485,"dataGaName":486,"dataGaLocation":793},{"text":940,"config":941},"Small business",{"href":491,"dataGaName":492,"dataGaLocation":793},{"text":943,"config":944},"Public sector",{"href":497,"dataGaName":498,"dataGaLocation":793},{"text":946,"config":947},"Education",{"href":948,"dataGaName":949,"dataGaLocation":793},"/solutions/education/","education",{"text":951,"config":952},"Financial services",{"href":953,"dataGaName":954,"dataGaLocation":793},"/solutions/finance/","financial services",{"title":505,"links":956},[957,959,961,963,966,968,971,973,975,977,979,981,983,985],{"text":518,"config":958},{"href":275,"dataGaName":520,"dataGaLocation":793},{"text":522,"config":960},{"href":524,"dataGaName":525,"dataGaLocation":793},{"text":527,"config":962},{"href":529,"dataGaName":530,"dataGaLocation":793},{"text":532,"config":964},{"href":534,"dataGaName":965,"dataGaLocation":793},"docs",{"text":555,"config":967},{"href":557,"dataGaName":558,"dataGaLocation":793},{"text":969,"config":970},"What's new",{"href":615,"dataGaName":616,"dataGaLocation":793},{"text":550,"config":972},{"href":552,"dataGaName":553,"dataGaLocation":793},{"text":569,"config":974},{"href":571,"dataGaName":572,"dataGaLocation":793},{"text":577,"config":976},{"href":579,"dataGaName":580,"dataGaLocation":793},{"text":582,"config":978},{"href":584,"dataGaName":585,"dataGaLocation":793},{"text":587,"config":980},{"href":589,"dataGaName":590,"dataGaLocation":793},{"text":592,"config":982},{"href":594,"dataGaName":595,"dataGaLocation":793},{"text":597,"config":984},{"href":599,"dataGaName":600,"dataGaLocation":793},{"text":602,"config":986},{"href":604,"dataGaName":605,"dataGaLocation":793},{"title":618,"links":988},[989,991,993,995,997,999,1003,1008,1010,1012,1014],{"text":626,"config":990},{"href":628,"dataGaName":620,"dataGaLocation":793},{"text":631,"config":992},{"href":633,"dataGaName":634,"dataGaLocation":793},{"text":639,"config":994},{"href":641,"dataGaName":642,"dataGaLocation":793},{"text":644,"config":996},{"href":646,"dataGaName":647,"dataGaLocation":793},{"text":649,"config":998},{"href":651,"dataGaName":652,"dataGaLocation":793},{"text":1000,"config":1001},"Sustainability",{"href":1002,"dataGaName":1000,"dataGaLocation":793},"/sustainability/",{"text":1004,"config":1005},"Diversity, inclusion and belonging (DIB)",{"href":1006,"dataGaName":1007,"dataGaLocation":793},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":654,"config":1009},{"href":656,"dataGaName":657,"dataGaLocation":793},{"text":664,"config":1011},{"href":666,"dataGaName":667,"dataGaLocation":793},{"text":669,"config":1013},{"href":671,"dataGaName":672,"dataGaLocation":793},{"text":1015,"config":1016},"Modern Slavery Transparency Statement",{"href":1017,"dataGaName":1018,"dataGaLocation":793},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1020},[1021,1024,1027],{"text":1022,"config":1023},"Terms",{"href":845,"dataGaName":846,"dataGaLocation":793},{"text":1025,"config":1026},"Cookies",{"dataGaName":855,"dataGaLocation":793,"id":856,"isOneTrustButton":339},{"text":1028,"config":1029},"Privacy",{"href":850,"dataGaName":851,"dataGaLocation":793},[1031],{"id":1032,"title":1033,"body":308,"config":1034,"content":1036,"description":308,"extension":1040,"meta":1041,"navigation":339,"path":1042,"seo":1043,"stem":1044,"__hash__":1045},"blogAuthors/en-us/blog/authors/job-van-der-voort.yml","Job Van Der Voort",{"template":1035},"BlogAuthor",{"name":7,"config":1037},{"headshot":1038,"ctfId":1039},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Job-van-der-Voort","yml",{},"/en-us/blog/authors/job-van-der-voort",{},"en-us/blog/authors/job-van-der-voort","w8TOn_hGFgQQOv35VnObjxoMM-hviRbwtijFETooJCM",[1047,1055,1063],{"title":1048,"description":1049,"heroImage":1050,"category":304,"date":1051,"authors":1052,"slug":1054,"externalUrl":308},"How we overhauled GitLab navigation","Users weren't getting what they needed from our navigation. Here are the steps we took to turn that experience around.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682884/Blog/Hero%20Images/navigation.jpg","2023-08-15",[1053],"Ashley Knobloch","navigation-research-blog-post",{"title":1056,"description":1057,"heroImage":1058,"category":304,"date":1059,"authors":1060,"slug":1062,"externalUrl":308},"Beautifying our UI: Giving GitLab build features a fresh look","Get an inside look at how we are improving the usability of GitLab build features with multiple visual design improvements.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682807/Blog/Hero%20Images/beautify.jpg","2023-07-05",[1061],"Veethika Mishra","beautifying-of-our-ui",{"title":1064,"description":1065,"heroImage":1066,"category":304,"date":1067,"authors":1068,"slug":1070,"externalUrl":308},"4 best practices leading orgs to release software faster","GitLab's 2023 Global DevSecOps Survey illuminates the strategies that organizations deploying more frequently have in common.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663908/Blog/Hero%20Images/2023-devsecops-report-blog-banner2.png","2023-06-08",[1069],"Kristina Weis","best-practices-leading-orgs-to-release-software-faster",{"promotions":1072},[1073,1087,1099,1111],{"id":1074,"categories":1075,"header":1077,"text":1078,"button":1079,"image":1084},"ai-modernization",[1076],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1080,"config":1081},"Get your AI maturity score",{"href":1082,"dataGaName":1083,"dataGaLocation":558},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1085},{"src":1086},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1088,"categories":1089,"header":1091,"text":1078,"button":1092,"image":1096},"devops-modernization",[1090,895],"product","Are you just managing tools or shipping innovation?",{"text":1093,"config":1094},"Get your DevOps maturity score",{"href":1095,"dataGaName":1083,"dataGaLocation":558},"/assessments/devops-modernization-assessment/",{"config":1097},{"src":1098},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1100,"categories":1101,"header":1103,"text":1078,"button":1104,"image":1108},"security-modernization",[1102],"security","Are you trading speed for security?",{"text":1105,"config":1106},"Get your security maturity score",{"href":1107,"dataGaName":1083,"dataGaLocation":558},"/assessments/security-modernization-assessment/",{"config":1109},{"src":1110},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1112,"paths":1113,"header":1116,"text":1117,"button":1118,"image":1123},"github-azure-migration",[1114,1115],"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":1119,"config":1120},"See how GitLab compares to GitHub",{"href":1121,"dataGaName":1122,"dataGaLocation":558},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1124},{"src":1098},{"header":1126,"blurb":1127,"button":1128,"secondaryButton":1133},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1129,"config":1130},"Get your free trial",{"href":1131,"dataGaName":359,"dataGaLocation":1132},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":831,"config":1134},{"href":683,"dataGaName":364,"dataGaLocation":1132},1786803750771]