[{"data":1,"prerenderedAt":703},["ShallowReactive",2],{"/en-us/blog/resolving-merge-conflicts-from-the-gitlab-ui/":3,"navigation-en-us":32,"banner-en-us":448,"footer-en-us":463,"Sean McGivern":674,"next-steps-en-us":688},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":22,"_id":25,"_type":26,"title":27,"_source":28,"_file":29,"_stem":30,"_extension":31},"/en-us/blog/resolving-merge-conflicts-from-the-gitlab-ui","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Resolving Merge Conflicts from the GitLab UI","Learn how GitLab's merge conflict resolution feature works and why we introduced it.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666760/Blog/Hero%20Images/merge-conflicts.png","https://about.gitlab.com/blog/resolving-merge-conflicts-from-the-gitlab-ui","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Resolving Merge Conflicts from the GitLab UI\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Sean McGivern\"}],\n        \"datePublished\": \"2016-09-06\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21},[18],"Sean McGivern","2016-09-06","\nMerge conflicts can be very annoying for both merge request authors and\nreviewers. As an author, I just want my merge request to be merged. But the\nreviewer might not be in the same time zone as me and by the time they review\nmy changes, I have a merge conflict. I then need to fix it and pass the merge\nrequest back to them, which is a lot of busy work for something that could be\nfairly trivial to fix.\n\nSimilarly, as a reviewer, I want merge requests to be accepted when they're\nready. I don't want to spend my time checking out the author's branch, fixing\nthe conflicts, and pushing back; and I don't particularly like waiting around\nfor them to fix it. As an author or a reviewer, I just want to be able to have\nthe merge request accepted, and move on to the next thing. That's why understanding the methods of resolving conflicts is crucial. Fortunately, GitLab has a few ways of resolving conflicts from the GitLab UI.\n\nIn GitLab 8.11, we\n[introduced the ability to resolve merge conflicts in the UI][release-post]. This\npost describes the background for the feature, how it works, and what we're\nplanning to do next with it.\n\n\u003C!-- more -->\n\n## What is a merge conflict?\n\nA merge conflict is when a merge can't be performed cleanly between two versions\nof the same file. An error message\nmay appear, indicating the conflict is too complex.\n\n### Wait, what's a merge?\n\nA merge is a way of combining two sets of changes made in different branches. In\nGitLab, we handle this with [Merge Requests][mr], which are requests to merge\nthe changes we've made to a file (or a group of files), from a [feature\nbranch][fb] into another branch, for example, `master`.\n\nWhen the merge request is merged, the changes from `new-feature` are added to\n`master`. This happens by looking at all of the changes made in the `master` branch since\nthe `new-feature` branch was created, and all the changes made in `new-feature`,\nand applying them to the files changed.\n\nMost of the time, Git can do this automatically, but sometimes it can't. For\ninstance, if we changed a line of code in our `new-feature` branch, but that line was\nalso changed in `master`, Git doesn't know which line to accept. When this happens, someone needs to manually tell Git which line\nto use, which creates a **merge conflict**.\n\n**Note:** for this post, we will just concentrate on conflicts within a file. However,\nrenames and deletions can also cause conflicts, and we\n[plan on supporting those][20665] in the future.\n{: .note}\n\n## Why are merge conflicts a problem?\n\nThey're really annoying!\n\nWhen there's a conflict in a [version control](/topics/version-control/) system, a merge request can't be merged without manual\nintervention.\n\nIf you can't resolve complex merge conflicts within GitLab, that means that any merge\nrequest with a conflict needs to be checked out locally, resolved locally,\npushed back, and merged. That's a hassle and can't be done without having some\nGit tools installed locally. At GitLab, we want\n[everyone to be able to collaborate on all digital content][vision], and that\nmeans not having to install special tools whenever possible.\n\n### Types of conflict resolution\n\nThere are several methods of resolving conflicts:\n\n1. Just pick one version, and use that. This is often the case with generated\n   files. One example is the [`schema.rb`][schema-rb] file in a Rails app.\n   Conflicts on the schema version line are common, but we (almost) always want\n   the latest version.\n\n2. Keep the lines of code from both versions. A great example of this is the\n   [GitLab CE CHANGELOG file][changelog], which is a\n   [frequent source of merge conflicts][changelog-crisis]. We're working on\n   [tooling to help with this][automated-changelogs], but that's specific to\n   GitLab rather than applicable to every project.\n\n3. Write our own resolution. For instance, if we started with the sentence:\n\n    > There are two versions of GitLab: CE and EE\n\n    I might think that those acronyms should be spelled out:\n\n    > There are two versions of GitLab: Community Edition (CE) and Enterprise Edition (EE)\n\n    And you might think that the sentence needs some closing punctuation:\n\n    > There are two versions of GitLab: CE and EE.\n\n    Because conflicts are based on lines, there's no way to automatically pick\n    both of those changes. We can do so manually, though:\n\n    > There are two versions of GitLab: Community Edition (CE) and Enterprise Edition (EE).\n\nAt present, the conflict resolution support in GitLab is only really useful for\nresolving the first type of conflict. The [merge conflict resolution editor](https://gitlab.pavlovia.org/help/user/project/merge_requests/resolve_conflicts.md) allows for more complex [conflicts](https://docs.gitlab.com/ee/user/project/merge_requests/conflicts.html) to be resolved by manually modifying a file from the GitLab interface. \n\n## How do we resolve them?\n\nWhen a merge request can have its conflicts resolved within GitLab, it will have\na link within the merge box to 'resolve these conflicts':\n\n![The 'resolve these conflicts' link on a merge request](https://about.gitlab.com/images/blogimages/resolving-merge-conflicts-from-the-gitlab-ui/mr-widget.png){: .shadow}\n\nClicking that link will show a list of files with conflicts, with conflict sections\nhighlighted as 'our changes' (the changes in the merge request's source branch)\nand 'their changes' (the changes in the merge request's target branch):\n\n![Some example merge conflicts](https://about.gitlab.com/images/blogimages/resolving-merge-conflicts-from-the-gitlab-ui/merge-conflicts.png){: .shadow}\n\nHere's an example of a more complex merge conflict in a `schema.rb` that I resolved on the GitLab CE\nproject:\n\n![Resolving a merge conflict](https://about.gitlab.com/images/8_11/resolve_mc.gif){: .shadow}\n\n### How does that work?\n\nThe current implementation, at a high level, works like this:\n\n1. If a merge request has conflicts, GitLab gets a list of the\n   [files with merge conflicts][rugged-conflicts].\n2. For each file, it then\n   [generates a merged file with conflict markers][rugged-merge-file].\n3. GitLab parses those conflict markers out and presents them to the UI as\n   sections: context, our side of the conflict, their side of the conflict,\n   context, etc.\n4. When the UI passes the section IDs back, we do the same thing. This time,\n   GitLab only keeps the sections the user selected, along with all context\n   sections.\n5. GitLab joins the resolved lines together to create a resolved file, and\n   [adds it to the Git index][rugged-add].\n6. Finally, we write that index as a merge commit to the source branch.\n\nIf the source branch is `new-feature` and the target branch is `master`, then\nthis does basically the same thing as running:\n\n```\ngit checkout new-feature\ngit merge master\n```\n\n### Why can't some conflicts be resolved in GitLab?\n\nThe implementation above produces a number of constraints (for the most\nup-to-date list, please see the\n[merge conflict resolution documentation](https://docs.gitlab.com/ee/user/project/merge_requests/conflicts.html):\n\n1. If the file contains conflict markers that mean we can't parse the file contents\n   unambiguously, we can't show the sections. We will, however, be able to allow\n   [resolving those conflicts in an editor](#an-editor).\n2. If the file is a binary file, we can't parse the file for conflict markers\n   because they are only added to text files. Again, we plan to\n   [allow resolving conflicts in binary files](#binary-files) in the future.\n3. If the file [isn't in a UTF-8 compatible encoding][21247], we can't allow\n   resolving it because we pass data back and forth as JSON.\n4. If the file is too large (over 200 KB), we avoid parsing it.\n\nBecause all conflicts must be resolved at once, if any of the conflicts for a\nmerge request can't be resolved in the GitLab UI, then the conflicts must be\nresolved manually.\n\n## What's next?\n\nThere are plenty of places for improving our current implementation, and we'd\nlove to hear of ones we haven't thought of. Here are three obvious ones already\nin our [issue tracker][ce-issues].\n\n### An inline editor!\n\nThe most obvious improvement is to allow\n[editing the conflict resolution][20344]. This is closer to the experience on\nthe command line, with the conflict markers present in the file. It will also\ncover most of the problem cases listed above with the current approach.\n\n### Binary files!\n\nIn addition to this, as binary files are typically not manually mergeable, we\ncould just [show both file versions][20664], and ask which one to use. This will work\nbest for images, but can support all binary files.\n\n### Renames!\n\nIncompatible renames are detected as conflicts by the `git` command line tool,\nbut not by the library we use at GitLab. We can [detect rename conflicts][20345]\nourselves, it's just more work.\n\n**For the latest information on how to resolve merge conflicts in GitLab, check out our [documentation](https://docs.gitlab.com/ee/user/project/merge_requests/conflicts.html).**\n\n[20344]: https://gitlab.com/gitlab-org/gitlab-ce/issues/20344\n[20345]: https://gitlab.com/gitlab-org/gitlab-ce/issues/20345\n[20664]: https://gitlab.com/gitlab-org/gitlab-ce/issues/20664\n[20665]: https://gitlab.com/gitlab-org/gitlab-ce/issues/20665\n[21247]: https://gitlab.com/gitlab-org/gitlab-ce/issues/21247\n[automated-changelogs]: https://gitlab.com/gitlab-org/release-tools/merge_requests/29\n[ce-issues]: https://gitlab.com/gitlab-org/gitlab-ce/issues\n[changelog-crisis]: https://gitlab.com/gitlab-org/gitlab-ce/issues/17826\n[changelog]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG.md\n[conflict-docs]: https://docs.gitlab.com/ee/user/project/merge_requests/resolve_conflicts.html\n[release-post]: /releases/2016/08/22/gitlab-8-11-released/#merge-conflict-resolution\n[rugged-add]: http://www.rubydoc.info/github/libgit2/rugged/Rugged/Index#add-instance_method\n[rugged-conflicts]: http://www.rubydoc.info/github/libgit2/rugged/Rugged/Index#conflicts-instance_method\n[rugged-merge-file]: http://www.rubydoc.info/github/libgit2/rugged/Rugged/Index#merge_file-instance_method\n[schema-rb]: http://guides.rubyonrails.org/active_record_migrations.html#what-are-schema-files-for-questionmark\n[vision]: /direction/#vision\n[fb]: https://docs.gitlab.com/ee/gitlab-basics/feature_branch_workflow.html\n[mr]: http://doc.gitlab.com/ce/user/project/merge_requests.html\n","company",{"slug":23,"featured":6,"template":24},"resolving-merge-conflicts-from-the-gitlab-ui","BlogPost","content:en-us:blog:resolving-merge-conflicts-from-the-gitlab-ui.yml","yaml","Resolving Merge Conflicts From The Gitlab Ui","content","en-us/blog/resolving-merge-conflicts-from-the-gitlab-ui.yml","en-us/blog/resolving-merge-conflicts-from-the-gitlab-ui","yml",{"_path":33,"_dir":34,"_draft":6,"_partial":6,"_locale":7,"data":35,"_id":444,"_type":26,"title":445,"_source":28,"_file":446,"_stem":447,"_extension":31},"/shared/en-us/main-navigation","en-us",{"logo":36,"freeTrial":41,"sales":46,"login":51,"items":56,"search":385,"minimal":416,"duo":435},{"config":37},{"href":38,"dataGaName":39,"dataGaLocation":40},"/","gitlab logo","header",{"text":42,"config":43},"Get free trial",{"href":44,"dataGaName":45,"dataGaLocation":40},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":47,"config":48},"Talk to sales",{"href":49,"dataGaName":50,"dataGaLocation":40},"/sales/","sales",{"text":52,"config":53},"Sign in",{"href":54,"dataGaName":55,"dataGaLocation":40},"https://gitlab.com/users/sign_in/","sign in",[57,101,197,202,307,366],{"text":58,"config":59,"cards":61,"footer":84},"Platform",{"dataNavLevelOne":60},"platform",[62,68,76],{"title":58,"description":63,"link":64},"The most comprehensive AI-powered DevSecOps Platform",{"text":65,"config":66},"Explore our Platform",{"href":67,"dataGaName":60,"dataGaLocation":40},"/platform/",{"title":69,"description":70,"link":71},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":72,"config":73},"Meet GitLab Duo",{"href":74,"dataGaName":75,"dataGaLocation":40},"/gitlab-duo/","gitlab duo ai",{"title":77,"description":78,"link":79},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":80,"config":81},"Learn more",{"href":82,"dataGaName":83,"dataGaLocation":40},"/why-gitlab/","why gitlab",{"title":85,"items":86},"Get started with",[87,92,97],{"text":88,"config":89},"Platform Engineering",{"href":90,"dataGaName":91,"dataGaLocation":40},"/solutions/platform-engineering/","platform engineering",{"text":93,"config":94},"Developer Experience",{"href":95,"dataGaName":96,"dataGaLocation":40},"/developer-experience/","Developer experience",{"text":98,"config":99},"MLOps",{"href":100,"dataGaName":98,"dataGaLocation":40},"/topics/devops/the-role-of-ai-in-devops/",{"text":102,"left":103,"config":104,"link":106,"lists":110,"footer":179},"Product",true,{"dataNavLevelOne":105},"solutions",{"text":107,"config":108},"View all Solutions",{"href":109,"dataGaName":105,"dataGaLocation":40},"/solutions/",[111,136,158],{"title":112,"description":113,"link":114,"items":119},"Automation","CI/CD and automation to accelerate deployment",{"config":115},{"icon":116,"href":117,"dataGaName":118,"dataGaLocation":40},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[120,124,128,132],{"text":121,"config":122},"CI/CD",{"href":123,"dataGaLocation":40,"dataGaName":121},"/solutions/continuous-integration/",{"text":125,"config":126},"AI-Assisted Development",{"href":74,"dataGaLocation":40,"dataGaName":127},"AI assisted development",{"text":129,"config":130},"Source Code Management",{"href":131,"dataGaLocation":40,"dataGaName":129},"/solutions/source-code-management/",{"text":133,"config":134},"Automated Software Delivery",{"href":117,"dataGaLocation":40,"dataGaName":135},"Automated software delivery",{"title":137,"description":138,"link":139,"items":144},"Security","Deliver code faster without compromising security",{"config":140},{"href":141,"dataGaName":142,"dataGaLocation":40,"icon":143},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[145,148,153],{"text":146,"config":147},"Security & Compliance",{"href":141,"dataGaLocation":40,"dataGaName":146},{"text":149,"config":150},"Software Supply Chain Security",{"href":151,"dataGaLocation":40,"dataGaName":152},"/solutions/supply-chain/","Software supply chain security",{"text":154,"config":155},"Compliance & Governance",{"href":156,"dataGaLocation":40,"dataGaName":157},"/solutions/continuous-software-compliance/","Compliance and governance",{"title":159,"link":160,"items":165},"Measurement",{"config":161},{"icon":162,"href":163,"dataGaName":164,"dataGaLocation":40},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[166,170,174],{"text":167,"config":168},"Visibility & Measurement",{"href":163,"dataGaLocation":40,"dataGaName":169},"Visibility and Measurement",{"text":171,"config":172},"Value Stream Management",{"href":173,"dataGaLocation":40,"dataGaName":171},"/solutions/value-stream-management/",{"text":175,"config":176},"Analytics & Insights",{"href":177,"dataGaLocation":40,"dataGaName":178},"/solutions/analytics-and-insights/","Analytics and insights",{"title":180,"items":181},"GitLab for",[182,187,192],{"text":183,"config":184},"Enterprise",{"href":185,"dataGaLocation":40,"dataGaName":186},"/enterprise/","enterprise",{"text":188,"config":189},"Small Business",{"href":190,"dataGaLocation":40,"dataGaName":191},"/small-business/","small business",{"text":193,"config":194},"Public Sector",{"href":195,"dataGaLocation":40,"dataGaName":196},"/solutions/public-sector/","public sector",{"text":198,"config":199},"Pricing",{"href":200,"dataGaName":201,"dataGaLocation":40,"dataNavLevelOne":201},"/pricing/","pricing",{"text":203,"config":204,"link":206,"lists":210,"feature":294},"Resources",{"dataNavLevelOne":205},"resources",{"text":207,"config":208},"View all resources",{"href":209,"dataGaName":205,"dataGaLocation":40},"/resources/",[211,244,266],{"title":212,"items":213},"Getting started",[214,219,224,229,234,239],{"text":215,"config":216},"Install",{"href":217,"dataGaName":218,"dataGaLocation":40},"/install/","install",{"text":220,"config":221},"Quick start guides",{"href":222,"dataGaName":223,"dataGaLocation":40},"/get-started/","quick setup checklists",{"text":225,"config":226},"Learn",{"href":227,"dataGaLocation":40,"dataGaName":228},"https://university.gitlab.com/","learn",{"text":230,"config":231},"Product documentation",{"href":232,"dataGaName":233,"dataGaLocation":40},"https://docs.gitlab.com/","product documentation",{"text":235,"config":236},"Best practice videos",{"href":237,"dataGaName":238,"dataGaLocation":40},"/getting-started-videos/","best practice videos",{"text":240,"config":241},"Integrations",{"href":242,"dataGaName":243,"dataGaLocation":40},"/integrations/","integrations",{"title":245,"items":246},"Discover",[247,252,256,261],{"text":248,"config":249},"Customer success stories",{"href":250,"dataGaName":251,"dataGaLocation":40},"/customers/","customer success stories",{"text":253,"config":254},"Blog",{"href":255,"dataGaName":5,"dataGaLocation":40},"/blog/",{"text":257,"config":258},"Remote",{"href":259,"dataGaName":260,"dataGaLocation":40},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":262,"config":263},"TeamOps",{"href":264,"dataGaName":265,"dataGaLocation":40},"/teamops/","teamops",{"title":267,"items":268},"Connect",[269,274,279,284,289],{"text":270,"config":271},"GitLab Services",{"href":272,"dataGaName":273,"dataGaLocation":40},"/services/","services",{"text":275,"config":276},"Community",{"href":277,"dataGaName":278,"dataGaLocation":40},"/community/","community",{"text":280,"config":281},"Forum",{"href":282,"dataGaName":283,"dataGaLocation":40},"https://forum.gitlab.com/","forum",{"text":285,"config":286},"Events",{"href":287,"dataGaName":288,"dataGaLocation":40},"/events/","events",{"text":290,"config":291},"Partners",{"href":292,"dataGaName":293,"dataGaLocation":40},"/partners/","partners",{"backgroundColor":295,"textColor":296,"text":297,"image":298,"link":302},"#2f2a6b","#fff","Insights for the future of software development",{"altText":299,"config":300},"the source promo card",{"src":301},"/images/navigation/the-source-promo-card.svg",{"text":303,"config":304},"Read the latest",{"href":305,"dataGaName":306,"dataGaLocation":40},"/the-source/","the source",{"text":308,"config":309,"lists":310},"Company",{"dataNavLevelOne":21},[311],{"items":312},[313,318,324,326,331,336,341,346,351,356,361],{"text":314,"config":315},"About",{"href":316,"dataGaName":317,"dataGaLocation":40},"/company/","about",{"text":319,"config":320,"footerGa":323},"Jobs",{"href":321,"dataGaName":322,"dataGaLocation":40},"/jobs/","jobs",{"dataGaName":322},{"text":285,"config":325},{"href":287,"dataGaName":288,"dataGaLocation":40},{"text":327,"config":328},"Leadership",{"href":329,"dataGaName":330,"dataGaLocation":40},"/company/team/e-group/","leadership",{"text":332,"config":333},"Team",{"href":334,"dataGaName":335,"dataGaLocation":40},"/company/team/","team",{"text":337,"config":338},"Handbook",{"href":339,"dataGaName":340,"dataGaLocation":40},"https://handbook.gitlab.com/","handbook",{"text":342,"config":343},"Investor relations",{"href":344,"dataGaName":345,"dataGaLocation":40},"https://ir.gitlab.com/","investor relations",{"text":347,"config":348},"Trust Center",{"href":349,"dataGaName":350,"dataGaLocation":40},"/security/","trust center",{"text":352,"config":353},"AI Transparency Center",{"href":354,"dataGaName":355,"dataGaLocation":40},"/ai-transparency-center/","ai transparency center",{"text":357,"config":358},"Newsletter",{"href":359,"dataGaName":360,"dataGaLocation":40},"/company/contact/","newsletter",{"text":362,"config":363},"Press",{"href":364,"dataGaName":365,"dataGaLocation":40},"/press/","press",{"text":367,"config":368,"lists":369},"Contact us",{"dataNavLevelOne":21},[370],{"items":371},[372,375,380],{"text":47,"config":373},{"href":49,"dataGaName":374,"dataGaLocation":40},"talk to sales",{"text":376,"config":377},"Get help",{"href":378,"dataGaName":379,"dataGaLocation":40},"/support/","get help",{"text":381,"config":382},"Customer portal",{"href":383,"dataGaName":384,"dataGaLocation":40},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":386,"login":387,"suggestions":394},"Close",{"text":388,"link":389},"To search repositories and projects, login to",{"text":390,"config":391},"gitlab.com",{"href":54,"dataGaName":392,"dataGaLocation":393},"search login","search",{"text":395,"default":396},"Suggestions",[397,399,403,405,409,413],{"text":69,"config":398},{"href":74,"dataGaName":69,"dataGaLocation":393},{"text":400,"config":401},"Code Suggestions (AI)",{"href":402,"dataGaName":400,"dataGaLocation":393},"/solutions/code-suggestions/",{"text":121,"config":404},{"href":123,"dataGaName":121,"dataGaLocation":393},{"text":406,"config":407},"GitLab on AWS",{"href":408,"dataGaName":406,"dataGaLocation":393},"/partners/technology-partners/aws/",{"text":410,"config":411},"GitLab on Google Cloud",{"href":412,"dataGaName":410,"dataGaLocation":393},"/partners/technology-partners/google-cloud-platform/",{"text":414,"config":415},"Why GitLab?",{"href":82,"dataGaName":414,"dataGaLocation":393},{"freeTrial":417,"mobileIcon":422,"desktopIcon":427,"secondaryButton":430},{"text":418,"config":419},"Start free trial",{"href":420,"dataGaName":45,"dataGaLocation":421},"https://gitlab.com/-/trials/new/","nav",{"altText":423,"config":424},"Gitlab Icon",{"src":425,"dataGaName":426,"dataGaLocation":421},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":423,"config":428},{"src":429,"dataGaName":426,"dataGaLocation":421},"/images/brand/gitlab-logo-type.svg",{"text":431,"config":432},"Get Started",{"href":433,"dataGaName":434,"dataGaLocation":421},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":436,"mobileIcon":440,"desktopIcon":442},{"text":437,"config":438},"Learn more about GitLab Duo",{"href":74,"dataGaName":439,"dataGaLocation":421},"gitlab duo",{"altText":423,"config":441},{"src":425,"dataGaName":426,"dataGaLocation":421},{"altText":423,"config":443},{"src":429,"dataGaName":426,"dataGaLocation":421},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":449,"_dir":34,"_draft":6,"_partial":6,"_locale":7,"title":450,"button":451,"image":455,"config":458,"_id":460,"_type":26,"_source":28,"_file":461,"_stem":462,"_extension":31},"/shared/en-us/banner","is now in public beta!",{"text":80,"config":452},{"href":453,"dataGaName":454,"dataGaLocation":40},"/gitlab-duo/agent-platform/","duo banner",{"config":456},{"src":457},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":459},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":464,"_dir":34,"_draft":6,"_partial":6,"_locale":7,"data":465,"_id":670,"_type":26,"title":671,"_source":28,"_file":672,"_stem":673,"_extension":31},"/shared/en-us/main-footer",{"text":466,"source":467,"edit":473,"contribute":478,"config":483,"items":488,"minimal":662},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":468,"config":469},"View page source",{"href":470,"dataGaName":471,"dataGaLocation":472},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":474,"config":475},"Edit this page",{"href":476,"dataGaName":477,"dataGaLocation":472},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":479,"config":480},"Please contribute",{"href":481,"dataGaName":482,"dataGaLocation":472},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":484,"facebook":485,"youtube":486,"linkedin":487},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[489,512,569,598,632],{"title":58,"links":490,"subMenu":495},[491],{"text":492,"config":493},"DevSecOps platform",{"href":67,"dataGaName":494,"dataGaLocation":472},"devsecops platform",[496],{"title":198,"links":497},[498,502,507],{"text":499,"config":500},"View plans",{"href":200,"dataGaName":501,"dataGaLocation":472},"view plans",{"text":503,"config":504},"Why Premium?",{"href":505,"dataGaName":506,"dataGaLocation":472},"/pricing/premium/","why premium",{"text":508,"config":509},"Why Ultimate?",{"href":510,"dataGaName":511,"dataGaLocation":472},"/pricing/ultimate/","why ultimate",{"title":513,"links":514},"Solutions",[515,520,523,525,530,535,539,542,546,551,553,556,559,564],{"text":516,"config":517},"Digital transformation",{"href":518,"dataGaName":519,"dataGaLocation":472},"/topics/digital-transformation/","digital transformation",{"text":146,"config":521},{"href":141,"dataGaName":522,"dataGaLocation":472},"security & compliance",{"text":135,"config":524},{"href":117,"dataGaName":118,"dataGaLocation":472},{"text":526,"config":527},"Agile development",{"href":528,"dataGaName":529,"dataGaLocation":472},"/solutions/agile-delivery/","agile delivery",{"text":531,"config":532},"Cloud transformation",{"href":533,"dataGaName":534,"dataGaLocation":472},"/topics/cloud-native/","cloud transformation",{"text":536,"config":537},"SCM",{"href":131,"dataGaName":538,"dataGaLocation":472},"source code management",{"text":121,"config":540},{"href":123,"dataGaName":541,"dataGaLocation":472},"continuous integration & delivery",{"text":543,"config":544},"Value stream management",{"href":173,"dataGaName":545,"dataGaLocation":472},"value stream management",{"text":547,"config":548},"GitOps",{"href":549,"dataGaName":550,"dataGaLocation":472},"/solutions/gitops/","gitops",{"text":183,"config":552},{"href":185,"dataGaName":186,"dataGaLocation":472},{"text":554,"config":555},"Small business",{"href":190,"dataGaName":191,"dataGaLocation":472},{"text":557,"config":558},"Public sector",{"href":195,"dataGaName":196,"dataGaLocation":472},{"text":560,"config":561},"Education",{"href":562,"dataGaName":563,"dataGaLocation":472},"/solutions/education/","education",{"text":565,"config":566},"Financial services",{"href":567,"dataGaName":568,"dataGaLocation":472},"/solutions/finance/","financial services",{"title":203,"links":570},[571,573,575,577,580,582,584,586,588,590,592,594,596],{"text":215,"config":572},{"href":217,"dataGaName":218,"dataGaLocation":472},{"text":220,"config":574},{"href":222,"dataGaName":223,"dataGaLocation":472},{"text":225,"config":576},{"href":227,"dataGaName":228,"dataGaLocation":472},{"text":230,"config":578},{"href":232,"dataGaName":579,"dataGaLocation":472},"docs",{"text":253,"config":581},{"href":255,"dataGaName":5,"dataGaLocation":472},{"text":248,"config":583},{"href":250,"dataGaName":251,"dataGaLocation":472},{"text":257,"config":585},{"href":259,"dataGaName":260,"dataGaLocation":472},{"text":270,"config":587},{"href":272,"dataGaName":273,"dataGaLocation":472},{"text":262,"config":589},{"href":264,"dataGaName":265,"dataGaLocation":472},{"text":275,"config":591},{"href":277,"dataGaName":278,"dataGaLocation":472},{"text":280,"config":593},{"href":282,"dataGaName":283,"dataGaLocation":472},{"text":285,"config":595},{"href":287,"dataGaName":288,"dataGaLocation":472},{"text":290,"config":597},{"href":292,"dataGaName":293,"dataGaLocation":472},{"title":308,"links":599},[600,602,604,606,608,610,612,616,621,623,625,627],{"text":314,"config":601},{"href":316,"dataGaName":21,"dataGaLocation":472},{"text":319,"config":603},{"href":321,"dataGaName":322,"dataGaLocation":472},{"text":327,"config":605},{"href":329,"dataGaName":330,"dataGaLocation":472},{"text":332,"config":607},{"href":334,"dataGaName":335,"dataGaLocation":472},{"text":337,"config":609},{"href":339,"dataGaName":340,"dataGaLocation":472},{"text":342,"config":611},{"href":344,"dataGaName":345,"dataGaLocation":472},{"text":613,"config":614},"Sustainability",{"href":615,"dataGaName":613,"dataGaLocation":472},"/sustainability/",{"text":617,"config":618},"Diversity, inclusion and belonging (DIB)",{"href":619,"dataGaName":620,"dataGaLocation":472},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":347,"config":622},{"href":349,"dataGaName":350,"dataGaLocation":472},{"text":357,"config":624},{"href":359,"dataGaName":360,"dataGaLocation":472},{"text":362,"config":626},{"href":364,"dataGaName":365,"dataGaLocation":472},{"text":628,"config":629},"Modern Slavery Transparency Statement",{"href":630,"dataGaName":631,"dataGaLocation":472},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":633,"links":634},"Contact Us",[635,638,640,642,647,652,657],{"text":636,"config":637},"Contact an expert",{"href":49,"dataGaName":50,"dataGaLocation":472},{"text":376,"config":639},{"href":378,"dataGaName":379,"dataGaLocation":472},{"text":381,"config":641},{"href":383,"dataGaName":384,"dataGaLocation":472},{"text":643,"config":644},"Status",{"href":645,"dataGaName":646,"dataGaLocation":472},"https://status.gitlab.com/","status",{"text":648,"config":649},"Terms of use",{"href":650,"dataGaName":651,"dataGaLocation":472},"/terms/","terms of use",{"text":653,"config":654},"Privacy statement",{"href":655,"dataGaName":656,"dataGaLocation":472},"/privacy/","privacy statement",{"text":658,"config":659},"Cookie preferences",{"dataGaName":660,"dataGaLocation":472,"id":661,"isOneTrustButton":103},"cookie preferences","ot-sdk-btn",{"items":663},[664,666,668],{"text":648,"config":665},{"href":650,"dataGaName":651,"dataGaLocation":472},{"text":653,"config":667},{"href":655,"dataGaName":656,"dataGaLocation":472},{"text":658,"config":669},{"dataGaName":660,"dataGaLocation":472,"id":661,"isOneTrustButton":103},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[675],{"_path":676,"_dir":677,"_draft":6,"_partial":6,"_locale":7,"content":678,"config":682,"_id":684,"_type":26,"title":685,"_source":28,"_file":686,"_stem":687,"_extension":31},"/en-us/blog/authors/sean-mcgivern","authors",{"name":18,"config":679},{"headshot":680,"ctfId":681},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Sean-McGivern",{"template":683},"BlogAuthor","content:en-us:blog:authors:sean-mcgivern.yml","Sean Mcgivern","en-us/blog/authors/sean-mcgivern.yml","en-us/blog/authors/sean-mcgivern",{"_path":689,"_dir":34,"_draft":6,"_partial":6,"_locale":7,"header":690,"eyebrow":691,"blurb":692,"button":693,"secondaryButton":697,"_id":699,"_type":26,"title":700,"_source":28,"_file":701,"_stem":702,"_extension":31},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":42,"config":694},{"href":695,"dataGaName":45,"dataGaLocation":696},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":47,"config":698},{"href":49,"dataGaName":50,"dataGaLocation":696},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1753981639466]