[{"data":1,"prerenderedAt":2521},["ShallowReactive",2],{"/blog/git-tips-and-tricks":3,"navigation-en-us":1734,"banner-en-us":2161,"footer-en-us":2171,"blog-post-authors-en-us-Achilleas Pipinellis":2416,"blog-related-posts-en-us-git-tips-and-tricks":2431,"blog-promotions-en-us":2457,"next-steps-en-us":2511},{"id":4,"title":5,"authors":6,"body":8,"category":1705,"date":1706,"description":1707,"extension":1708,"externalUrl":1709,"faq":1709,"featured":1710,"heroImage":1711,"meta":1712,"navigation":1269,"path":1725,"seo":1726,"slug":1730,"stem":1731,"tags":1709,"template":1732,"updatedDate":1709,"__hash__":1733},"blogPosts/en-us/blog/git-tips-and-tricks.md","Git tips and tricks",[7],"Achilleas Pipinellis",{"type":9,"value":10,"toc":1664},"minimark",[11,19,25,28,35,40,52,55,59,66,71,78,82,89,93,100,110,125,129,152,155,162,173,177,196,212,218,231,237,241,244,252,282,288,294,312,315,338,346,353,365,381,390,393,400,414,417,430,433,453,460,483,492,495,504,508,511,530,534,552,554,562,566,573,591,595,612,620,622,639,643,650,668,672,689,691,699,703,706,732,742,755,774,778,795,797,805,809,815,818,861,864,883,887,905,912,930,934,950,952,960,964,967,994,1004,1010,1014,1020,1069,1080,1084,1087,1092,1098,1105,1125,1138,1142,1156,1183,1187,1190,1197,1207,1225,1229,1242,1330,1334,1341,1412,1415,1433,1437,1443,1461,1468,1487,1496,1500,1503,1518,1542,1548,1566,1569,1588,1592,1623,1627,1630,1636,1638,1660],[12,13,14,18],"p",{},[15,16,17],"span",{},"Git"," comes with a ton of commands, and that's probably an understatement.",[12,20,21,24],{},[15,22,23],{},"The internet"," is full of Git tips and it's hard if not impossible to know\nthem all, but sometimes you stumble upon an aha! moment that changes your\nwhole workflow.",[12,26,27],{},"In this post, we gathered some Git tips and tricks we use at GitLab everyday.\nHopefully they will add up to your aha! moment.",[29,30,31],"ul",{},[32,33,34],"li",{},"TOC",[36,37,39],"h2",{"id":38},"intro","Intro",[12,41,42,43,46,47,51],{},"Almost everybody at GitLab will need to use Git at some point. For newcomers\nwho know nothing about Git that can be a fearsome experience. We have a\n",[15,44,45],{},"Git cheatsheet"," and a ",[48,49,50],"code",{},"#git-help"," chat channel where we ask questions and\nprovide help if some of us get stuck. That's a quick way to provide help, and\nif something is complicated or someone has messed up their local repository and\nneeds immediate help, there's always a person to jump on a quick call.",[12,53,54],{},"Here's a pack of Git tricks that will leverage your Git-fu and you'll hopefully\nfind useful. Remember, the list is far from exhaustive :)",[36,56,58],{"id":57},"gits-built-in-help","Git's built-in help",[12,60,61,62,65],{},"The majority of users rely on sites like ",[15,63,64],{},"StackOverflow"," to find answers to their\nGit problems, but how often do you use Git's built-in help to find more about a\ncommand you are struggling with?",[67,68,70],"h3",{"id":69},"the-most-common-commands","The most common commands",[12,72,73,74,77],{},"Run ",[48,75,76],{},"git help"," to print a list of the most common commands. You'll probably\nnotice you've used most of them, but how well do you really know them?\nThankfully, there is a help page for every command!",[67,79,81],{"id":80},"a-help-page-for-every-command","A help page for every command",[12,83,84,85,88],{},"Git's documentation is comprehensive and is automatically installed with Git.\nRun ",[48,86,87],{},"git help \u003Ccommand>"," to find out all about a command's behavior and what\noptions it can take.",[67,90,92],{"id":91},"git-guides","Git guides",[12,94,95,96,99],{},"Git comes with a handful of guides ready for you to explore. Run ",[48,97,98],{},"git help -g","\nto see what's available:",[101,102,108],"pre",{"className":103,"code":105,"language":106,"meta":107},[104],"language-text","The common Git guides are:\n\n   attributes   Defining attributes per path\n   everyday     Everyday Git With 20 Commands Or So\n   glossary     A Git glossary\n   ignore       Specifies intentionally untracked files to ignore\n   modules      Defining submodule properties\n   revisions    Specifying revisions and ranges for Git\n   tutorial     A tutorial introduction to Git (for version 1.5.1 or newer)\n   workflows    An overview of recommended workflows with Git\n\n","text","",[48,109,105],{"__ignoreMap":107},[12,111,112,113,116,117,120,121,124],{},"Jump to a Git tutorial with ",[48,114,115],{},"git help tutorial",", go through the glossary with\n",[48,118,119],{},"git help glossary"," or learn about the most common commands with\n",[48,122,123],{},"git help everyday",".",[36,126,128],{"id":127},"see-the-repository-status-in-your-terminals-prompt","See the repository status in your terminal's prompt",[12,130,131,132,138,139,142,143,148,149,124],{},"It's very useful to be able to visualize the status of your repository at any\ngiven time. While there are 3rd party tools that include this information\n(",[133,134,137],"a",{"href":135,"rel":136},"http://ohmyz.sh/",[],"oh-my-zsh"," anyone?), Git itself provides a script named ",[48,140,141],{},"git-prompt.sh","\nthat does exactly that. You can ",[133,144,147],{"href":145,"rel":146},"https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh",[],"download it"," and follow the\ninstructions in it to install and use it in your system. If you're using Linux\nand have installed Git with your package manager, it may already be\npresent on your system, usually under ",[48,150,151],{},"/etc/bash_completion.d/",[12,153,154],{},"Go ahead and replace your boring shell prompt with something like this:",[12,156,157],{},[158,159],"img",{"alt":160,"src":161},"Git shell prompt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398323/blog/Content%20Images/git-tricks/git-shell-info.png",[12,163,164],{},[165,166,167,168],"em",{},"Taken from oh-my-zsh's ",[133,169,172],{"href":170,"rel":171},"https://github.com/robbyrussell/oh-my-zsh/wiki/Themes#kafeitu",[],"themes wiki",[36,174,176],{"id":175},"autocompletion-for-git-commands","Autocompletion for Git commands",[12,178,179,180,183,184,187,188,191,192,195],{},"You may also find it useful to use the ",[15,181,182],{},"completion scripts"," that provide Git\ncommand completion for ",[48,185,186],{},"bash",", ",[48,189,190],{},"tcsh"," and ",[48,193,194],{},"zsh",". Again, follow the instructions\ninside the scripts to learn how to install them. Once done, you can try out\ntyping a command.",[12,197,198,199,202,203,206,207,211],{},"Let's say you want to type ",[48,200,201],{},"git pull",". If Git completion is enabled, typing\njust the first letter with ",[48,204,205],{},"git p"," followed by ",[208,209,210],"kbd",{},"Tab"," will show the\nfollowing:",[101,213,216],{"className":214,"code":215,"language":106,"meta":107},[104],"pack-objects   -- create packed archive of objects\npack-redundant -- find redundant pack files\npack-refs      -- pack heads and tags for efficient repository access\nparse-remote   -- routines to help parsing remote repository access parameters\npatch-id       -- compute unique ID for a patch\nprune          -- prune all unreachable objects from the object database\nprune-packed   -- remove extra objects that are already in pack files\npull           -- fetch from and merge with another repository or local branch\npush           -- update remote refs along with associated objects\n",[48,217,215],{"__ignoreMap":107},[12,219,220,221,224,225,227,228,230],{},"To show all available commands, type ",[48,222,223],{},"git"," in your terminal followed by\n",[208,226,210],{},"+ ",[208,229,210],{},", and see the magic happening.",[12,232,233],{},[158,234],{"alt":235,"src":236},"It's a kind of magic","https://media.giphy.com/media/12NUbkX6p4xOO4/giphy.gif",[36,238,240],{"id":239},"git-plugins","Git plugins",[12,242,243],{},"Since Git is free software, it's easy for people to write scripts that extend\nits functionality. Let's see some of the most common ones.",[67,245,247,248,251],{"id":246},"the-git-extras-plugin","The ",[48,249,250],{},"git-extras"," plugin",[12,253,254,255,261,262,265,266,269,270,275,276,281],{},"If you want to enhance Git with more commands, you'll want to try out the\n",[133,256,259,251],{"href":257,"rel":258},"https://github.com/tj/git-extras",[],[48,260,250],{},". It includes commands like ",[48,263,264],{},"git info"," (show\ninformation about the repository), ",[48,267,268],{},"git effort"," (number of commits per file),\nand the list goes on. After you ",[133,271,274],{"href":272,"rel":273},"https://github.com/tj/git-extras/blob/master/Installation.md",[],"install"," it, make sure to visit\nthe ",[133,277,280],{"href":278,"rel":279},"https://github.com/tj/git-extras/blob/master/Commands.md",[],"documentation on the provided commands"," in order to understand\nwhat each one does before using it.",[67,283,247,285,251],{"id":284},"the-git-open-plugin",[48,286,287],{},"git-open",[12,289,290,291,293],{},"If you want to quickly visit the website on which the repository you're on is\nhosted, ",[48,292,287],{}," is for you. All major providers are supported (GitLab, GitHub,\nBitbucket) and you can even use them all at the same time if you set\nthem as different remotes.",[12,295,296,301,302,307,308,311],{},[133,297,300],{"href":298,"rel":299},"https://github.com/paulirish/git-open#installation",[],"Install it",", and try it out by cloning a repository from\n",[133,303,306],{"href":304,"rel":305},"https://gitlab.com/explore",[],"GitLab.com",". From your terminal navigate to that\nrepository and run ",[48,309,310],{},"git open"," to be transferred to the project's page on\nGitLab.com.",[12,313,314],{},"It works by default for projects hosted on GitLab.com, but you can also use it\nwith your own GitLab instances. In that case, make sure to set up the domain\nname with:",[101,316,319],{"className":317,"code":318,"language":186,"meta":107,"style":107},"language-bash shiki shiki-themes github-light","git config gitopen.gitlab.domain git.example.com\n",[48,320,321],{"__ignoreMap":107},[15,322,325,328,332,335],{"class":323,"line":324},"line",1,[15,326,223],{"class":327},"s7eDp",[15,329,331],{"class":330},"sYBdl"," config",[15,333,334],{"class":330}," gitopen.gitlab.domain",[15,336,337],{"class":330}," git.example.com\n",[12,339,340,341,124],{},"You can even open different remotes and branches if they have been set up.\nRead more in the ",[133,342,345],{"href":343,"rel":344},"https://github.com/paulirish/git-open#examples",[],"examples section",[36,347,349,352],{"id":348},"gitconfig-on-steroids",[48,350,351],{},".gitconfig"," on steroids",[12,354,247,355,357,358,360,361,364],{},[48,356,351],{}," file contains information on how you want Git to behave on\ncertain circumstances. There are options you can set at a repository level,\nbut you can also set them in a global ",[48,359,351],{}," so that all local config\nwill inherit its values. This file usually resides in your home directory.\nIf not, either you'll have to create it manually or it will be automatically\nbe created when you issue a command starting with ",[48,362,363],{},"git config --global"," as\nwe'll see below.",[12,366,367,368,370,371,373,374,124],{},"The very first encounter with ",[48,369,351],{}," was probably when you set your\nname and email address for Git to know who you are.\nTo know more about the options ",[48,372,351],{}," can take, see the ",[133,375,378,379],{"href":376,"rel":377},"https://git-scm.com/docs/git-config",[],"Git documentation\non ",[48,380,351],{},[12,382,383,384,386,387,124],{},"If you are using macOS or Linux, ",[48,385,351],{}," will probably be hidden if you are\ntrying to open it from a file manager. Either make sure the hidden files are\nshown or open it using a command in the terminal: ",[48,388,389],{},"atom ~/.gitconfig",[12,391,392],{},"Let's explore some of the most useful config options.",[67,394,396,397],{"id":395},"set-a-global-gitignore","Set a global ",[48,398,399],{},".gitignore",[12,401,402,403,406,407,410,411,413],{},"If you want to avoid committing files like ",[48,404,405],{},".DS_Store",", Vim ",[48,408,409],{},"swp"," files, etc.,\nyou can set up a global ",[48,412,399],{}," file.",[12,415,416],{},"First create the file:",[101,418,420],{"className":317,"code":419,"language":186,"meta":107,"style":107},"touch ~/.gitignore\n",[48,421,422],{"__ignoreMap":107},[15,423,424,427],{"class":323,"line":324},[15,425,426],{"class":327},"touch",[15,428,429],{"class":330}," ~/.gitignore\n",[12,431,432],{},"Then run:",[101,434,436],{"className":317,"code":435,"language":186,"meta":107,"style":107},"git config --global core.excludesFile ~/.gitignore\n",[48,437,438],{"__ignoreMap":107},[15,439,440,442,444,448,451],{"class":323,"line":324},[15,441,223],{"class":327},[15,443,331],{"class":330},[15,445,447],{"class":446},"sYu0t"," --global",[15,449,450],{"class":330}," core.excludesFile",[15,452,429],{"class":330},[12,454,455,456,459],{},"Or manually add the following to your ",[48,457,458],{},"~/.gitconfig",":",[101,461,465],{"className":462,"code":463,"language":464,"meta":107,"style":107},"language-ini shiki shiki-themes github-light","[core]\n  excludesFile = ~/.gitignore\n\n","ini",[48,466,467,472],{"__ignoreMap":107},[15,468,469],{"class":323,"line":324},[15,470,471],{"class":327},"[core]\n",[15,473,475,479],{"class":323,"line":474},2,[15,476,478],{"class":477},"sD7c4","  excludesFile",[15,480,482],{"class":481},"sgsFI"," = ~/.gitignore\n",[12,484,485,486,491],{},"Gradually build up your own useful list of things you want Git to ignore. Read\nthe ",[133,487,490],{"href":488,"rel":489},"https://git-scm.com/docs/gitignore",[],"gitignore documentation"," to find out\nmore.",[493,494],"hr",{},[12,496,497],{},[165,498,499],{},[133,500,503],{"href":501,"rel":502},"https://git-scm.com/docs/git-config#git-config-coreexcludesFile",[],"Git docs source",[67,505,507],{"id":506},"delete-local-branches-that-have-been-removed-from-remote-on-fetchpull","Delete local branches that have been removed from remote on fetch/pull",[12,509,510],{},"You might already have a bunch of stale branches in your local repository that\nno longer exist in the remote one. To delete them in each fetch/pull, run:",[101,512,514],{"className":317,"code":513,"language":186,"meta":107,"style":107},"git config --global fetch.prune true\n",[48,515,516],{"__ignoreMap":107},[15,517,518,520,522,524,527],{"class":323,"line":324},[15,519,223],{"class":327},[15,521,331],{"class":330},[15,523,447],{"class":446},[15,525,526],{"class":330}," fetch.prune",[15,528,529],{"class":446}," true\n",[12,531,455,532,459],{},[48,533,458],{},[101,535,537],{"className":462,"code":536,"language":464,"meta":107,"style":107},"[fetch]\n  prune = true\n\n",[48,538,539,544],{"__ignoreMap":107},[15,540,541],{"class":323,"line":324},[15,542,543],{"class":327},"[fetch]\n",[15,545,546,549],{"class":323,"line":474},[15,547,548],{"class":477},"  prune",[15,550,551],{"class":481}," = true\n",[493,553],{},[12,555,556],{},[165,557,558],{},[133,559,503],{"href":560,"rel":561},"https://git-scm.com/docs/git-config#git-config-fetchprune",[],[67,563,565],{"id":564},"enable-gits-autosquash-feature-by-default","Enable Git's autosquash feature by default",[12,567,568,569,572],{},"Autosquash makes it quicker and easier to squash or fixup commits during an\ninteractive rebase. It can be enabled for each rebase using\n",[48,570,571],{},"git rebase -i --autosquash",", but it's easier to turn it on by default.",[101,574,576],{"className":317,"code":575,"language":186,"meta":107,"style":107},"git config --global rebase.autosquash true\n",[48,577,578],{"__ignoreMap":107},[15,579,580,582,584,586,589],{"class":323,"line":324},[15,581,223],{"class":327},[15,583,331],{"class":330},[15,585,447],{"class":446},[15,587,588],{"class":330}," rebase.autosquash",[15,590,529],{"class":446},[12,592,455,593,459],{},[48,594,458],{},[101,596,598],{"className":462,"code":597,"language":464,"meta":107,"style":107},"[rebase]\n  autosquash = true\n\n",[48,599,600,605],{"__ignoreMap":107},[15,601,602],{"class":323,"line":324},[15,603,604],{"class":327},"[rebase]\n",[15,606,607,610],{"class":323,"line":474},[15,608,609],{"class":477},"  autosquash",[15,611,551],{"class":481},[12,613,614,615,124],{},"At this point, let us remind you of ",[133,616,619],{"href":617,"rel":618},"https://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing",[],"the perils of rebasing",[493,621],{},[12,623,624,630],{},[165,625,626],{},[133,627,503],{"href":628,"rel":629},"https://git-scm.com/docs/git-config#git-config-rebaseautoSquash",[],[165,631,632,633,638],{},"(",[133,634,637],{"href":635,"rel":636},"https://github.com/thoughtbot/dotfiles/pull/377",[],"tip taken from thoughbot",")",[67,640,642],{"id":641},"extra-info-when-using-git-submodules","Extra info when using Git submodules",[12,644,645,646,649],{},"If you are using ",[15,647,648],{},"submodules",", it might be useful to turn on the submodule summary.\nFrom your terminal run:",[101,651,653],{"className":317,"code":652,"language":186,"meta":107,"style":107},"git config --global status.submoduleSummary true\n",[48,654,655],{"__ignoreMap":107},[15,656,657,659,661,663,666],{"class":323,"line":324},[15,658,223],{"class":327},[15,660,331],{"class":330},[15,662,447],{"class":446},[15,664,665],{"class":330}," status.submoduleSummary",[15,667,529],{"class":446},[12,669,455,670,459],{},[48,671,458],{},[101,673,675],{"className":462,"code":674,"language":464,"meta":107,"style":107},"[status]\n  submoduleSummary = true\n\n",[48,676,677,682],{"__ignoreMap":107},[15,678,679],{"class":323,"line":324},[15,680,681],{"class":327},"[status]\n",[15,683,684,687],{"class":323,"line":474},[15,685,686],{"class":477},"  submoduleSummary",[15,688,551],{"class":481},[493,690],{},[12,692,693],{},[165,694,695],{},[133,696,503],{"href":697,"rel":698},"https://git-scm.com/docs/git-config#git-config-statussubmoduleSummary",[],[67,700,702],{"id":701},"change-the-editor-of-gits-messages","Change the editor of Git's messages",[12,704,705],{},"You can change the default text editor for use by Git commands.",[12,707,708,709,712,713,716,717,720,721,724,725,728,729,124],{},"From ",[48,710,711],{},"git help var",":\nthe order of preference is the ",[48,714,715],{},"$GIT_EDITOR"," environment variable, then\n",[48,718,719],{},"core.editor"," configuration, then ",[48,722,723],{},"$VISUAL",", then ",[48,726,727],{},"$EDITOR",", and then the\ndefault chosen at compile time, which is usually ",[48,730,731],{},"vi",[12,733,734,735,738,739,741],{},"Running ",[48,736,737],{},"git config --show-origin core.editor"," will tell you if ",[48,740,719],{},"\nis set and from which file. This needs at least Git 2.8.",[12,743,744,745,187,748,187,751,754],{},"To change it to your favor editor (",[48,746,747],{},"vim",[48,749,750],{},"emacs",[48,752,753],{},"atom",", etc.), run:",[101,756,758],{"className":317,"code":757,"language":186,"meta":107,"style":107},"git config --global core.editor vim\n",[48,759,760],{"__ignoreMap":107},[15,761,762,764,766,768,771],{"class":323,"line":324},[15,763,223],{"class":327},[15,765,331],{"class":330},[15,767,447],{"class":446},[15,769,770],{"class":330}," core.editor",[15,772,773],{"class":330}," vim\n",[12,775,455,776,459],{},[48,777,458],{},[101,779,781],{"className":462,"code":780,"language":464,"meta":107,"style":107},"[core]\n  editor = vim\n\n",[48,782,783,787],{"__ignoreMap":107},[15,784,785],{"class":323,"line":324},[15,786,471],{"class":327},[15,788,789,792],{"class":323,"line":474},[15,790,791],{"class":477},"  editor",[15,793,794],{"class":481}," = vim\n",[493,796],{},[12,798,799],{},[165,800,801],{},[133,802,503],{"href":803,"rel":804},"https://git-scm.com/docs/git-config.html#git-config-coreeditor",[],[67,806,808],{"id":807},"change-the-tool-with-which-diffs-are-shown","Change the tool with which diffs are shown",[12,810,811,814],{},[48,812,813],{},"git diff"," is useful as it shows the changes that are not currently staged.\nWhen running this command Git usually uses its internal tool and displays\nthe changes in your terminal.",[12,816,817],{},"If you don't like the default difftool there are a couple of others to choose\nfrom:",[29,819,820,831,841,851],{},[32,821,822,825,826],{},[48,823,824],{},"vimdiff"," - ",[133,827,830],{"href":828,"rel":829},"http://vimdoc.sourceforge.net/htmldoc/diff.html",[],"Vim's built-in vimdiff",[32,832,833,825,836],{},[48,834,835],{},"magit",[133,837,840],{"href":838,"rel":839},"https://www.emacswiki.org/emacs/Magit",[],"Emacs most popular tool is Magit",[32,842,843,825,846],{},[48,844,845],{},"meld",[133,847,850],{"href":848,"rel":849},"http://meldmerge.org/",[],"A visual diff and merge tool written in Python",[32,852,853,825,856],{},[48,854,855],{},"kdiff3",[133,857,860],{"href":858,"rel":859},"http://kdiff3.sourceforge.net/",[],"A diff and merge program written in Qt",[12,862,863],{},"To change the default tool for watching diffs run the following:",[101,865,867],{"className":317,"code":866,"language":186,"meta":107,"style":107},"git config --global diff.tool vimdiff\n",[48,868,869],{"__ignoreMap":107},[15,870,871,873,875,877,880],{"class":323,"line":324},[15,872,223],{"class":327},[15,874,331],{"class":330},[15,876,447],{"class":446},[15,878,879],{"class":330}," diff.tool",[15,881,882],{"class":330}," vimdiff\n",[12,884,455,885,459],{},[48,886,458],{},[101,888,890],{"className":462,"code":889,"language":464,"meta":107,"style":107},"[diff]\n  tool = vimdiff\n\n",[48,891,892,897],{"__ignoreMap":107},[15,893,894],{"class":323,"line":324},[15,895,896],{"class":327},"[diff]\n",[15,898,899,902],{"class":323,"line":474},[15,900,901],{"class":477},"  tool",[15,903,904],{"class":481}," = vimdiff\n",[12,906,907,908,911],{},"Also related is the ",[48,909,910],{},"merge.tool"," setting which can be set to a tool to be used\nas the merge resolution program. Similarly:",[101,913,915],{"className":317,"code":914,"language":186,"meta":107,"style":107},"git config --global merge.tool vimdiff\n",[48,916,917],{"__ignoreMap":107},[15,918,919,921,923,925,928],{"class":323,"line":324},[15,920,223],{"class":327},[15,922,331],{"class":330},[15,924,447],{"class":446},[15,926,927],{"class":330}," merge.tool",[15,929,882],{"class":330},[12,931,455,932,459],{},[48,933,458],{},[101,935,937],{"className":462,"code":936,"language":464,"meta":107,"style":107},"[merge]\n  tool = vimdiff\n\n",[48,938,939,944],{"__ignoreMap":107},[15,940,941],{"class":323,"line":324},[15,942,943],{"class":327},"[merge]\n",[15,945,946,948],{"class":323,"line":474},[15,947,901],{"class":477},[15,949,904],{"class":481},[493,951],{},[12,953,954],{},[165,955,956],{},[133,957,503],{"href":958,"rel":959},"https://git-scm.com/docs/git-difftool",[],[36,961,963],{"id":962},"aliases","Aliases",[12,965,966],{},"Git commands can take a lot of flags at a time. For example, for a log graph\nyou can use the following command:",[101,968,970],{"className":317,"code":969,"language":186,"meta":107,"style":107},"git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative\n",[48,971,972],{"__ignoreMap":107},[15,973,974,976,979,982,985,988,991],{"class":323,"line":324},[15,975,223],{"class":327},[15,977,978],{"class":330}," log",[15,980,981],{"class":446}," --graph",[15,983,984],{"class":446}," --pretty=format:",[15,986,987],{"class":330},"'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'",[15,989,990],{"class":446}," --abbrev-commit",[15,992,993],{"class":446}," --date=relative\n",[12,995,996,997,999,1000,1003],{},"You sure don't want to type this every time you need to run it. For that purpose,\nGit supports aliases, which are custom user-defined commands that build on top\nof the core ones. They are defined in ",[48,998,458],{}," under the ",[48,1001,1002],{},"[alias]"," group.",[12,1005,1006,1007,1009],{},"Open ",[48,1008,458],{}," with your editor and start adding stuff.",[67,1011,1013],{"id":1012},"add-an-alias-to-pretty-log-graphs","Add an alias to pretty log graphs",[12,1015,1016,1017,1019],{},"In your ",[48,1018,458],{}," add:",[101,1021,1023],{"className":462,"code":1022,"language":464,"meta":107,"style":107},"[alias]\n  lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative\n  lol = log --graph --decorate --pretty=oneline --abbrev-commit\n\n",[48,1024,1025,1030,1055],{"__ignoreMap":107},[15,1026,1027],{"class":323,"line":324},[15,1028,1029],{"class":327},"[alias]\n",[15,1031,1032,1035,1038,1041,1044,1046,1049,1052],{"class":323,"line":474},[15,1033,1034],{"class":477},"  lg",[15,1036,1037],{"class":481}," = log --graph --",[15,1039,1040],{"class":477},"pretty",[15,1042,1043],{"class":481},"=format:",[15,1045,987],{"class":330},[15,1047,1048],{"class":481}," --abbrev-commit --",[15,1050,1051],{"class":477},"date",[15,1053,1054],{"class":481},"=relative\n",[15,1056,1058,1061,1064,1066],{"class":323,"line":1057},3,[15,1059,1060],{"class":477},"  lol",[15,1062,1063],{"class":481}," = log --graph --decorate --",[15,1065,1040],{"class":477},[15,1067,1068],{"class":481},"=oneline --abbrev-commit\n",[12,1070,1071,1072,1075,1076,1079],{},"Next time you want the pretty log to appear, run: ",[48,1073,1074],{},"git lg"," or ",[48,1077,1078],{},"git lol"," for\nsome pretty log graphs.",[67,1081,1083],{"id":1082},"add-an-alias-to-checkout-merge-requests-locally","Add an alias to checkout merge requests locally",[12,1085,1086],{},"A merge request contains all the history from a repository, plus the additional\ncommits added to the branch associated with the merge request. Note that you\ncan checkout a public merge request locally even if the source project is a fork\n(even a private fork) of the target project.",[12,1088,1089,1090,459],{},"To checkout a merge request locally, add the following alias to your ",[48,1091,458],{},[101,1093,1096],{"className":1094,"code":1095,"language":106,"meta":107},[104],"[alias]\n  mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -\n\n",[48,1097,1095],{"__ignoreMap":107},[12,1099,1100,1101,1104],{},"Now you can check out a particular merge request from any repository and any\nremote. For example, to check out the merge request with ID 5 as shown in GitLab\nfrom the ",[48,1102,1103],{},"upstream"," remote, run:",[101,1106,1110],{"className":1107,"code":1108,"language":1109,"meta":107,"style":107},"language-shell shiki shiki-themes github-light","git mr upstream 5\n","shell",[48,1111,1112],{"__ignoreMap":107},[15,1113,1114,1116,1119,1122],{"class":323,"line":324},[15,1115,223],{"class":327},[15,1117,1118],{"class":330}," mr",[15,1120,1121],{"class":330}," upstream",[15,1123,1124],{"class":446}," 5\n",[12,1126,1127,1128,1131,1132,1134,1135,124],{},"This will fetch the merge request into a local ",[48,1129,1130],{},"mr-upstream-5"," branch and check\nit out. In the above example, ",[48,1133,1103],{}," is the remote that points to GitLab\nwhich you can find out by running ",[48,1136,1137],{},"git remote -v",[67,1139,1141],{"id":1140},"the-oh-my-zsh-git-aliases-plugin","The Oh-my-zsh Git aliases plugin",[12,1143,1144,1145,1149,1150,1155],{},"If you are an ",[133,1146,1148],{"href":135,"rel":1147},[],"Oh My Zsh"," user you'll probably know this already.\nLearn how you can ",[133,1151,1154],{"href":1152,"rel":1153},"https://github.com/robbyrussell/oh-my-zsh/wiki/Plugin:git",[],"enable the Git plugin"," provided with Oh My Zsh and\nstart using the short commands to save time. Some examples are:",[29,1157,1158,1166,1174],{},[32,1159,1160,1163,1164],{},[48,1161,1162],{},"gl","  instead of ",[48,1165,201],{},[32,1167,1168,1163,1171],{},[48,1169,1170],{},"gp",[48,1172,1173],{},"git push",[32,1175,1176,1179,1180],{},[48,1177,1178],{},"gco"," instead of ",[48,1181,1182],{},"git checkout",[36,1184,1186],{"id":1185},"git-command-line-tips","Git command line tips",[12,1188,1189],{},"Here's a list of Git tips we gathered.",[67,1191,1193,1194],{"id":1192},"an-alias-of-head","An alias of ",[48,1195,1196],{},"HEAD",[12,1198,1199,1200,1203,1204,1206],{},"Did you know ",[48,1201,1202],{},"@"," is the same as ",[48,1205,1196],{},"? Using it during a rebase is a life saver:",[101,1208,1210],{"className":317,"code":1209,"language":186,"meta":107,"style":107},"git rebase -i @~2\n",[48,1211,1212],{"__ignoreMap":107},[15,1213,1214,1216,1219,1222],{"class":323,"line":324},[15,1215,223],{"class":327},[15,1217,1218],{"class":330}," rebase",[15,1220,1221],{"class":446}," -i",[15,1223,1224],{"class":330}," @~2\n",[67,1226,1228],{"id":1227},"quickly-checkout-the-previous-branch-you-were-on","Quickly checkout the previous branch you were on",[12,1230,1231,1232,1235,1236,1241],{},"A dash (",[48,1233,1234],{},"-",") refers to the branch you were on before the current one.\nUse it to checkout the previous branch (",[133,1237,1240],{"href":1238,"rel":1239},"https://twitter.com/holman/status/530490167522779137",[],"source","):",[101,1243,1247],{"className":1244,"code":1245,"language":1246,"meta":107,"style":107},"language-sh shiki shiki-themes github-light","# Checkout master\ngit checkout master\n\n# Create and checkout to a new branch\ngit checkout -b git-tips\n\n# Checkout master\ngit checkout master\n\n# Checkout to the previous branch (git-tips)\ngit checkout -\n","sh",[48,1248,1249,1255,1265,1271,1277,1290,1295,1300,1309,1314,1320],{"__ignoreMap":107},[15,1250,1251],{"class":323,"line":324},[15,1252,1254],{"class":1253},"sAwPA","# Checkout master\n",[15,1256,1257,1259,1262],{"class":323,"line":474},[15,1258,223],{"class":327},[15,1260,1261],{"class":330}," checkout",[15,1263,1264],{"class":330}," master\n",[15,1266,1267],{"class":323,"line":1057},[15,1268,1270],{"emptyLinePlaceholder":1269},true,"\n",[15,1272,1274],{"class":323,"line":1273},4,[15,1275,1276],{"class":1253},"# Create and checkout to a new branch\n",[15,1278,1280,1282,1284,1287],{"class":323,"line":1279},5,[15,1281,223],{"class":327},[15,1283,1261],{"class":330},[15,1285,1286],{"class":446}," -b",[15,1288,1289],{"class":330}," git-tips\n",[15,1291,1293],{"class":323,"line":1292},6,[15,1294,1270],{"emptyLinePlaceholder":1269},[15,1296,1298],{"class":323,"line":1297},7,[15,1299,1254],{"class":1253},[15,1301,1303,1305,1307],{"class":323,"line":1302},8,[15,1304,223],{"class":327},[15,1306,1261],{"class":330},[15,1308,1264],{"class":330},[15,1310,1312],{"class":323,"line":1311},9,[15,1313,1270],{"emptyLinePlaceholder":1269},[15,1315,1317],{"class":323,"line":1316},10,[15,1318,1319],{"class":1253},"# Checkout to the previous branch (git-tips)\n",[15,1321,1323,1325,1327],{"class":323,"line":1322},11,[15,1324,223],{"class":327},[15,1326,1261],{"class":330},[15,1328,1329],{"class":330}," -\n",[67,1331,1333],{"id":1332},"delete-local-branches-which-have-already-been-merged-into-master","Delete local branches which have already been merged into master",[12,1335,1336,1337,1241],{},"If you are working everyday on a project that gets contributions all the time,\nthe local branches number increases without noticing it. Run the following\ncommand to delete all local branches that are already merged into master\n(",[133,1338,1240],{"href":1339,"rel":1340},"http://stevenharman.net/git-clean-delete-already-merged-branches",[],[101,1342,1344],{"className":317,"code":1343,"language":186,"meta":107,"style":107},"# Make sure you have checked out master first\ngit checkout master\n\n# Delete merged branches to master except master\ngit branch --merged master | grep -v \"master\" | xargs -n 1 git branch -d\n",[48,1345,1346,1351,1359,1363,1368],{"__ignoreMap":107},[15,1347,1348],{"class":323,"line":324},[15,1349,1350],{"class":1253},"# Make sure you have checked out master first\n",[15,1352,1353,1355,1357],{"class":323,"line":474},[15,1354,223],{"class":327},[15,1356,1261],{"class":330},[15,1358,1264],{"class":330},[15,1360,1361],{"class":323,"line":1057},[15,1362,1270],{"emptyLinePlaceholder":1269},[15,1364,1365],{"class":323,"line":1273},[15,1366,1367],{"class":1253},"# Delete merged branches to master except master\n",[15,1369,1370,1372,1375,1378,1381,1384,1387,1390,1393,1395,1398,1401,1404,1407,1409],{"class":323,"line":1279},[15,1371,223],{"class":327},[15,1373,1374],{"class":330}," branch",[15,1376,1377],{"class":446}," --merged",[15,1379,1380],{"class":330}," master",[15,1382,1383],{"class":477}," |",[15,1385,1386],{"class":327}," grep",[15,1388,1389],{"class":446}," -v",[15,1391,1392],{"class":330}," \"master\"",[15,1394,1383],{"class":477},[15,1396,1397],{"class":327}," xargs",[15,1399,1400],{"class":446}," -n",[15,1402,1403],{"class":446}," 1",[15,1405,1406],{"class":330}," git",[15,1408,1374],{"class":330},[15,1410,1411],{"class":446}," -d\n",[12,1413,1414],{},"In the event that you accidentally delete master (💩 happens),  get it back with:",[101,1416,1418],{"className":317,"code":1417,"language":186,"meta":107,"style":107},"git checkout -b master origin/master\n",[48,1419,1420],{"__ignoreMap":107},[15,1421,1422,1424,1426,1428,1430],{"class":323,"line":324},[15,1423,223],{"class":327},[15,1425,1261],{"class":330},[15,1427,1286],{"class":446},[15,1429,1380],{"class":330},[15,1431,1432],{"class":330}," origin/master\n",[67,1434,1436],{"id":1435},"delete-local-branches-that-no-longer-exist-in-the-remote-repo","Delete local branches that no longer exist in the remote repo",[12,1438,1439,1440,1241],{},"To remove all tracking branches that you have locally but are no more present in\nthe remote repository (",[48,1441,1442],{},"origin",[101,1444,1446],{"className":317,"code":1445,"language":186,"meta":107,"style":107},"git remote prune origin\n",[48,1447,1448],{"__ignoreMap":107},[15,1449,1450,1452,1455,1458],{"class":323,"line":324},[15,1451,223],{"class":327},[15,1453,1454],{"class":330}," remote",[15,1456,1457],{"class":330}," prune",[15,1459,1460],{"class":330}," origin\n",[12,1462,1463,1464,1467],{},"Use the ",[48,1465,1466],{},"--dry-run"," flag to only see what branches will be pruned, but not\nactually prune them:",[101,1469,1471],{"className":317,"code":1470,"language":186,"meta":107,"style":107},"git remote prune origin --dry-run\n",[48,1472,1473],{"__ignoreMap":107},[15,1474,1475,1477,1479,1481,1484],{"class":323,"line":324},[15,1476,223],{"class":327},[15,1478,1454],{"class":330},[15,1480,1457],{"class":330},[15,1482,1483],{"class":330}," origin",[15,1485,1486],{"class":446}," --dry-run\n",[12,1488,1489,1490,124],{},"If you want this to be run automatically every time you fetch/pull, see\n",[133,1491,1493,1494],{"href":1492},"#delete-local-branches-that-have-been-removed-from-remote-on-fetchpull","how to add it to your ",[48,1495,351],{},[67,1497,1499],{"id":1498},"checking-out-a-new-branch-from-a-base-branch","Checking out a new branch from a base branch",[12,1501,1502],{},"You can checkout a new branch from a base branch without first checking out\nthe base branch. Confusing? Here's an example.",[12,1504,1505,1506,1509,1510,1513,1514,1517],{},"If you are on a branch named ",[48,1507,1508],{},"old-branch"," and you want to\ncheckout ",[48,1511,1512],{},"new-branch"," based off ",[48,1515,1516],{},"master",", you'd normally do:",[101,1519,1521],{"className":317,"code":1520,"language":186,"meta":107,"style":107},"git checkout master\ngit checkout -b new-branch\n",[48,1522,1523,1531],{"__ignoreMap":107},[15,1524,1525,1527,1529],{"class":323,"line":324},[15,1526,223],{"class":327},[15,1528,1261],{"class":330},[15,1530,1264],{"class":330},[15,1532,1533,1535,1537,1539],{"class":323,"line":474},[15,1534,223],{"class":327},[15,1536,1261],{"class":330},[15,1538,1286],{"class":446},[15,1540,1541],{"class":330}," new-branch\n",[12,1543,1544,1545,1547],{},"There's a quicker way though. While still on the ",[48,1546,1508],{},", run:",[101,1549,1551],{"className":317,"code":1550,"language":186,"meta":107,"style":107},"git checkout -b new-branch master\n",[48,1552,1553],{"__ignoreMap":107},[15,1554,1555,1557,1559,1561,1564],{"class":323,"line":324},[15,1556,223],{"class":327},[15,1558,1261],{"class":330},[15,1560,1286],{"class":446},[15,1562,1563],{"class":330}," new-branch",[15,1565,1264],{"class":330},[12,1567,1568],{},"The pattern is the following:",[101,1570,1572],{"className":317,"code":1571,"language":186,"meta":107,"style":107},"git checkout -b new_branch base_branch\n",[48,1573,1574],{"__ignoreMap":107},[15,1575,1576,1578,1580,1582,1585],{"class":323,"line":324},[15,1577,223],{"class":327},[15,1579,1261],{"class":330},[15,1581,1286],{"class":446},[15,1583,1584],{"class":330}," new_branch",[15,1586,1587],{"class":330}," base_branch\n",[36,1589,1591],{"id":1590},"references","References",[29,1593,1594,1602,1609,1616],{},[32,1595,1596,1601],{},[133,1597,1600],{"href":1598,"rel":1599},"https://github.com/thoughtbot/dotfiles/blob/master/gitconfig",[],"Thoughbot's gitconfig file","\ncontains useful tips some of which are also present in this post",[32,1603,1604],{},[133,1605,1608],{"href":1606,"rel":1607},"https://github.com/git-tips/tips/blob/master/README.md",[],"A collection of Git tips",[32,1610,1611],{},[133,1612,1615],{"href":1613,"rel":1614},"http://usevim.com/2012/03/21/git-and-vimdiff/",[],"Git and Vimdiff",[32,1617,1618],{},[133,1619,1622],{"href":1620,"rel":1621},"https://git-scm.com/",[],"Git's official site",[36,1624,1626],{"id":1625},"conclusion","Conclusion",[12,1628,1629],{},"As always, writing something about Git, only scratches the surface. While some\nof the tips included in this post might come in handy, there are sure a lot\nof other stuff we're not familiar with.",[12,1631,1632],{},[158,1633],{"alt":1634,"src":1635},"Uncle Sam wants you to tell your trick","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398324/blog/Content%20Images/git-tricks/uncle-sam-wants-git.jpg",[493,1637],{},[12,1639,1640],{},[165,1641,1642,1643,1648,1649,1654,1655],{},"Image: \"",[133,1644,1647],{"href":1645,"rel":1646},"https://github.com/git/git-scm.com/blob/master/public/images/branching-illustration%402x.png",[],"Branching illustration","\" by ",[133,1650,1653],{"href":1651,"rel":1652},"https://twitter.com/jasonlong",[],"Jason Long"," is licensed under ",[133,1656,1659],{"href":1657,"rel":1658},"https://creativecommons.org/licenses/by/3.0/",[],"CC BY 3.0",[1661,1662,1663],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":107,"searchDepth":474,"depth":474,"links":1665},[1666,1667,1672,1673,1674,1680,1690,1695,1703,1704],{"id":38,"depth":474,"text":39},{"id":57,"depth":474,"text":58,"children":1668},[1669,1670,1671],{"id":69,"depth":1057,"text":70},{"id":80,"depth":1057,"text":81},{"id":91,"depth":1057,"text":92},{"id":127,"depth":474,"text":128},{"id":175,"depth":474,"text":176},{"id":239,"depth":474,"text":240,"children":1675},[1676,1678],{"id":246,"depth":1057,"text":1677},"The git-extras plugin",{"id":284,"depth":1057,"text":1679},"The git-open plugin",{"id":348,"depth":474,"text":1681,"children":1682},".gitconfig on steroids",[1683,1685,1686,1687,1688,1689],{"id":395,"depth":1057,"text":1684},"Set a global .gitignore",{"id":506,"depth":1057,"text":507},{"id":564,"depth":1057,"text":565},{"id":641,"depth":1057,"text":642},{"id":701,"depth":1057,"text":702},{"id":807,"depth":1057,"text":808},{"id":962,"depth":474,"text":963,"children":1691},[1692,1693,1694],{"id":1012,"depth":1057,"text":1013},{"id":1082,"depth":1057,"text":1083},{"id":1140,"depth":1057,"text":1141},{"id":1185,"depth":474,"text":1186,"children":1696},[1697,1699,1700,1701,1702],{"id":1192,"depth":1057,"text":1698},"An alias of HEAD",{"id":1227,"depth":1057,"text":1228},{"id":1332,"depth":1057,"text":1333},{"id":1435,"depth":1057,"text":1436},{"id":1498,"depth":1057,"text":1499},{"id":1590,"depth":474,"text":1591},{"id":1625,"depth":474,"text":1626},"engineering","2016-12-08","Handy Git commands for everyday use","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749672243/Blog/Hero%20Images/git-tricks-cover-image.png",{"excerpt":1713},{"type":9,"value":1714},[1715,1719,1723],[12,1716,1717,18],{},[15,1718,17],{},[12,1720,1721,24],{},[15,1722,23],{},[12,1724,27],{},"/en-us/blog/git-tips-and-tricks",{"title":5,"description":1707,"ogTitle":5,"ogDescription":1707,"noIndex":1710,"ogImage":1711,"ogUrl":1727,"ogSiteName":1728,"ogType":1729,"canonicalUrls":1727},"https://about.gitlab.com/blog/git-tips-and-tricks","https://about.gitlab.com","article","git-tips-and-tricks","en-us/blog/git-tips-and-tricks","BlogPost","Ry-CCv1svG9yaVsZEMX5qDfgse6JlSJhqXSZKRDlnHI",{"logo":1735,"freeTrial":1740,"sales":1745,"login":1750,"items":1755,"search":2081,"minimal":2112,"duo":2131,"switchNav":2140,"pricingDeployment":2151},{"config":1736},{"href":1737,"dataGaName":1738,"dataGaLocation":1739},"/","gitlab logo","header",{"text":1741,"config":1742},"Get free trial",{"href":1743,"dataGaName":1744,"dataGaLocation":1739},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1746,"config":1747},"Request a demo",{"href":1748,"dataGaName":1749,"dataGaLocation":1739},"/sales/?contact-topic=request-demo","sales",{"text":1751,"config":1752},"Sign in",{"href":1753,"dataGaName":1754,"dataGaLocation":1739},"https://gitlab.com/users/sign_in/","sign in",[1756,1785,1885,1890,2003,2059],{"text":1757,"config":1758,"menu":1760},"Platform",{"dataNavLevelOne":1759},"platform",{"type":1761,"columns":1762},"cards",[1763,1769,1777],{"title":1757,"description":1764,"link":1765},"The intelligent orchestration platform for DevSecOps",{"text":1766,"config":1767},"Explore our Platform",{"href":1768,"dataGaName":1759,"dataGaLocation":1739},"/platform/",{"title":1770,"description":1771,"link":1772},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1773,"config":1774},"Meet GitLab Duo",{"href":1775,"dataGaName":1776,"dataGaLocation":1739},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1778,"description":1779,"link":1780},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1781,"config":1782},"Learn more",{"href":1783,"dataGaName":1784,"dataGaLocation":1739},"/why-gitlab/","why gitlab",{"text":1786,"left":1269,"config":1787,"menu":1789},"Product",{"dataNavLevelOne":1788},"solutions",{"type":1790,"link":1791,"columns":1795,"feature":1864},"lists",{"text":1792,"config":1793},"View all Solutions",{"href":1794,"dataGaName":1788,"dataGaLocation":1739},"/solutions/",[1796,1820,1843],{"title":1797,"description":1798,"link":1799,"items":1804},"Automation","CI/CD and automation to accelerate deployment",{"config":1800},{"icon":1801,"href":1802,"dataGaName":1803,"dataGaLocation":1739},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1805,1809,1812,1816],{"text":1806,"config":1807},"CI/CD",{"href":1808,"dataGaLocation":1739,"dataGaName":1806},"/solutions/continuous-integration/",{"text":1770,"config":1810},{"href":1775,"dataGaLocation":1739,"dataGaName":1811},"gitlab duo agent platform - product menu",{"text":1813,"config":1814},"Source Code Management",{"href":1815,"dataGaLocation":1739,"dataGaName":1813},"/solutions/source-code-management/",{"text":1817,"config":1818},"Automated Software Delivery",{"href":1802,"dataGaLocation":1739,"dataGaName":1819},"Automated software delivery",{"title":1821,"description":1822,"link":1823,"items":1828},"Security","Deliver code faster without compromising security",{"config":1824},{"href":1825,"dataGaName":1826,"dataGaLocation":1739,"icon":1827},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1829,1833,1838],{"text":1830,"config":1831},"Application Security Testing",{"href":1825,"dataGaName":1832,"dataGaLocation":1739},"Application security testing",{"text":1834,"config":1835},"Software Supply Chain Security",{"href":1836,"dataGaLocation":1739,"dataGaName":1837},"/solutions/supply-chain/","Software supply chain security",{"text":1839,"config":1840},"Software Compliance",{"href":1841,"dataGaName":1842,"dataGaLocation":1739},"/solutions/software-compliance/","software compliance",{"title":1844,"link":1845,"items":1850},"Measurement",{"config":1846},{"icon":1847,"href":1848,"dataGaName":1849,"dataGaLocation":1739},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1851,1855,1859],{"text":1852,"config":1853},"Visibility & Measurement",{"href":1848,"dataGaLocation":1739,"dataGaName":1854},"Visibility and Measurement",{"text":1856,"config":1857},"Value Stream Management",{"href":1858,"dataGaLocation":1739,"dataGaName":1856},"/solutions/value-stream-management/",{"text":1860,"config":1861},"Analytics & Insights",{"href":1862,"dataGaLocation":1739,"dataGaName":1863},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1865,"type":1790,"items":1866},"GitLab for",[1867,1873,1879],{"text":1868,"config":1869},"Enterprise",{"icon":1870,"href":1871,"dataGaLocation":1739,"dataGaName":1872},"Building","/enterprise/","enterprise",{"text":1874,"config":1875},"Small Business",{"icon":1876,"href":1877,"dataGaLocation":1739,"dataGaName":1878},"Work","/small-business/","small business",{"text":1880,"config":1881},"Public Sector",{"icon":1882,"href":1883,"dataGaLocation":1739,"dataGaName":1884},"Organization","/solutions/public-sector/","public sector",{"text":1886,"config":1887},"Pricing",{"href":1888,"dataGaName":1889,"dataGaLocation":1739,"dataNavLevelOne":1889},"/pricing/","pricing",{"text":1891,"config":1892,"menu":1894},"Resources",{"dataNavLevelOne":1893},"resources",{"type":1790,"link":1895,"columns":1899,"feature":1992},{"text":1896,"config":1897},"View all resources",{"href":1898,"dataGaName":1893,"dataGaLocation":1739},"/resources/",[1900,1932,1959],{"title":1901,"items":1902},"Getting started",[1903,1907,1912,1917,1922,1927],{"text":1904,"config":1905},"Install",{"href":1906,"dataGaName":274,"dataGaLocation":1739},"/install/",{"text":1908,"config":1909},"Quick start guides",{"href":1910,"dataGaName":1911,"dataGaLocation":1739},"/get-started/","quick setup checklists",{"text":1913,"config":1914},"Learn",{"href":1915,"dataGaLocation":1739,"dataGaName":1916},"https://university.gitlab.com/","learn",{"text":1918,"config":1919},"Product documentation",{"href":1920,"dataGaName":1921,"dataGaLocation":1739},"https://docs.gitlab.com/","product documentation",{"text":1923,"config":1924},"Best practice videos",{"href":1925,"dataGaName":1926,"dataGaLocation":1739},"/getting-started-videos/","best practice videos",{"text":1928,"config":1929},"Integrations",{"href":1930,"dataGaName":1931,"dataGaLocation":1739},"/integrations/","integrations",{"title":1933,"items":1934},"Discover",[1935,1940,1945,1950,1954],{"text":1936,"config":1937},"Customer success stories",{"href":1938,"dataGaName":1939,"dataGaLocation":1739},"/customers/","customer success stories",{"text":1941,"config":1942},"Blog",{"href":1943,"dataGaName":1944,"dataGaLocation":1739},"/blog/","blog",{"text":1946,"config":1947},"Demo Hub",{"href":1948,"dataGaName":1949,"dataGaLocation":1739},"/demo-hub/","demo hub",{"text":1951,"config":1952},"The Source",{"href":1953,"dataGaName":1944,"dataGaLocation":1739},"/the-source/",{"text":1955,"config":1956},"Remote",{"href":1957,"dataGaName":1958,"dataGaLocation":1739},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1960,"items":1961},"Connect",[1962,1967,1972,1977,1982,1987],{"text":1963,"config":1964},"GitLab Services",{"href":1965,"dataGaName":1966,"dataGaLocation":1739},"/services/","services",{"text":1968,"config":1969},"Contribute",{"href":1970,"dataGaName":1971,"dataGaLocation":1739},"https://contributors.gitlab.com","contribute",{"text":1973,"config":1974},"Community",{"href":1975,"dataGaName":1976,"dataGaLocation":1739},"/community/","community",{"text":1978,"config":1979},"Forum",{"href":1980,"dataGaName":1981,"dataGaLocation":1739},"https://forum.gitlab.com/","forum",{"text":1983,"config":1984},"Events",{"href":1985,"dataGaName":1986,"dataGaLocation":1739},"/events/","events",{"text":1988,"config":1989},"Partners",{"href":1990,"dataGaName":1991,"dataGaLocation":1739},"/partners/","partners",{"config":1993,"title":1996,"text":1997,"link":1998},{"background":1994,"textColor":1995},"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":1999,"config":2000},"Read the latest",{"href":2001,"dataGaName":2002,"dataGaLocation":1739},"/whats-new/","whats new",{"text":2004,"config":2005,"menu":2007},"Company",{"dataNavLevelOne":2006},"company",{"type":1790,"columns":2008},[2009],{"items":2010},[2011,2016,2022,2024,2029,2034,2039,2044,2049,2054],{"text":2012,"config":2013},"About",{"href":2014,"dataGaName":2015,"dataGaLocation":1739},"/company/","about",{"text":2017,"config":2018,"footerGa":2021},"Jobs",{"href":2019,"dataGaName":2020,"dataGaLocation":1739},"/jobs/","jobs",{"dataGaName":2020},{"text":1983,"config":2023},{"href":1985,"dataGaName":1986,"dataGaLocation":1739},{"text":2025,"config":2026},"Leadership",{"href":2027,"dataGaName":2028,"dataGaLocation":1739},"/company/team/e-group/","leadership",{"text":2030,"config":2031},"Handbook",{"href":2032,"dataGaName":2033,"dataGaLocation":1739},"https://handbook.gitlab.com/","handbook",{"text":2035,"config":2036},"Investor relations",{"href":2037,"dataGaName":2038,"dataGaLocation":1739},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2040,"config":2041},"Trust Center",{"href":2042,"dataGaName":2043,"dataGaLocation":1739},"/security/","trust center",{"text":2045,"config":2046},"AI Transparency Center",{"href":2047,"dataGaName":2048,"dataGaLocation":1739},"/ai-transparency-center/","ai transparency center",{"text":2050,"config":2051},"Newsletter",{"href":2052,"dataGaName":2053,"dataGaLocation":1739},"/company/contact/#contact-forms","newsletter",{"text":2055,"config":2056},"Press",{"href":2057,"dataGaName":2058,"dataGaLocation":1739},"/press/","press",{"text":2060,"config":2061,"menu":2062},"Contact us",{"dataNavLevelOne":2006},{"type":1790,"columns":2063},[2064],{"items":2065},[2066,2071,2076],{"text":2067,"config":2068},"Talk to sales",{"href":2069,"dataGaName":2070,"dataGaLocation":1739},"/sales/","talk to sales",{"text":2072,"config":2073},"Support portal",{"href":2074,"dataGaName":2075,"dataGaLocation":1739},"https://support.gitlab.com/hc/en-us","support portal",{"text":2077,"config":2078},"Customer portal",{"href":2079,"dataGaName":2080,"dataGaLocation":1739},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2082,"login":2083,"suggestions":2090},"Close",{"text":2084,"link":2085},"To search repositories and projects, login to",{"text":2086,"config":2087},"gitlab.com",{"href":1753,"dataGaName":2088,"dataGaLocation":2089},"search login","search",{"text":2091,"default":2092},"Suggestions",[2093,2095,2099,2101,2105,2109],{"text":1770,"config":2094},{"href":1775,"dataGaName":1770,"dataGaLocation":2089},{"text":2096,"config":2097},"Code Suggestions (AI)",{"href":2098,"dataGaName":2096,"dataGaLocation":2089},"/solutions/code-suggestions/",{"text":1806,"config":2100},{"href":1808,"dataGaName":1806,"dataGaLocation":2089},{"text":2102,"config":2103},"GitLab on AWS",{"href":2104,"dataGaName":2102,"dataGaLocation":2089},"/partners/technology-partners/aws/",{"text":2106,"config":2107},"GitLab on Google Cloud",{"href":2108,"dataGaName":2106,"dataGaLocation":2089},"/partners/technology-partners/google-cloud-platform/",{"text":2110,"config":2111},"Why GitLab?",{"href":1783,"dataGaName":2110,"dataGaLocation":2089},{"freeTrial":2113,"mobileIcon":2118,"desktopIcon":2123,"secondaryButton":2126},{"text":2114,"config":2115},"Start free trial",{"href":2116,"dataGaName":1744,"dataGaLocation":2117},"https://gitlab.com/-/trials/new/","nav",{"altText":2119,"config":2120},"Gitlab Icon",{"src":2121,"dataGaName":2122,"dataGaLocation":2117},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2119,"config":2124},{"src":2125,"dataGaName":2122,"dataGaLocation":2117},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2127,"config":2128},"Get Started",{"href":2129,"dataGaName":2130,"dataGaLocation":2117},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":2132,"mobileIcon":2136,"desktopIcon":2138},{"text":2133,"config":2134},"Learn more about GitLab Duo",{"href":1775,"dataGaName":2135,"dataGaLocation":2117},"gitlab duo",{"altText":2119,"config":2137},{"src":2121,"dataGaName":2122,"dataGaLocation":2117},{"altText":2119,"config":2139},{"src":2125,"dataGaName":2122,"dataGaLocation":2117},{"button":2141,"mobileIcon":2146,"desktopIcon":2148},{"text":2142,"config":2143},"/switch",{"href":2144,"dataGaName":2145,"dataGaLocation":2117},"#contact","switch",{"altText":2119,"config":2147},{"src":2121,"dataGaName":2122,"dataGaLocation":2117},{"altText":2119,"config":2149},{"src":2150,"dataGaName":2122,"dataGaLocation":2117},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2152,"mobileIcon":2157,"desktopIcon":2159},{"text":2153,"config":2154},"Back to pricing",{"href":1888,"dataGaName":2155,"dataGaLocation":2117,"icon":2156},"back to pricing","GoBack",{"altText":2119,"config":2158},{"src":2121,"dataGaName":2122,"dataGaLocation":2117},{"altText":2119,"config":2160},{"src":2125,"dataGaName":2122,"dataGaLocation":2117},{"title":2162,"titleMobile":2163,"button":2164,"config":2169},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1781,"config":2165},{"href":2166,"dataGaName":2167,"dataGaLocation":2168},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":2170,"disabled":1710},"release",{"data":2172},{"text":2173,"source":2174,"edit":2180,"contribute":2185,"config":2190,"items":2195,"minimal":2405},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":2175,"config":2176},"View page source",{"href":2177,"dataGaName":2178,"dataGaLocation":2179},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2181,"config":2182},"Edit this page",{"href":2183,"dataGaName":2184,"dataGaLocation":2179},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2186,"config":2187},"Please contribute",{"href":2188,"dataGaName":2189,"dataGaLocation":2179},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2191,"facebook":2192,"youtube":2193,"linkedin":2194},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2196,2243,2297,2341,2373],{"title":1886,"links":2197,"subMenu":2212},[2198,2202,2207],{"text":2199,"config":2200},"View plans",{"href":1888,"dataGaName":2201,"dataGaLocation":2179},"view plans",{"text":2203,"config":2204},"Why Premium?",{"href":2205,"dataGaName":2206,"dataGaLocation":2179},"/pricing/premium/","why premium",{"text":2208,"config":2209},"Why Ultimate?",{"href":2210,"dataGaName":2211,"dataGaLocation":2179},"/pricing/ultimate/","why ultimate",[2213],{"title":2214,"links":2215},"Contact Us",[2216,2219,2221,2223,2228,2233,2238],{"text":2217,"config":2218},"Contact sales",{"href":2069,"dataGaName":1749,"dataGaLocation":2179},{"text":2072,"config":2220},{"href":2074,"dataGaName":2075,"dataGaLocation":2179},{"text":2077,"config":2222},{"href":2079,"dataGaName":2080,"dataGaLocation":2179},{"text":2224,"config":2225},"Status",{"href":2226,"dataGaName":2227,"dataGaLocation":2179},"https://status.gitlab.com/","status",{"text":2229,"config":2230},"Terms of use",{"href":2231,"dataGaName":2232,"dataGaLocation":2179},"/terms/","terms of use",{"text":2234,"config":2235},"Privacy statement",{"href":2236,"dataGaName":2237,"dataGaLocation":2179},"/privacy/","privacy statement",{"text":2239,"config":2240},"Cookie preferences",{"dataGaName":2241,"dataGaLocation":2179,"id":2242,"isOneTrustButton":1269},"cookie preferences","ot-sdk-btn",{"title":1786,"links":2244,"subMenu":2253},[2245,2249],{"text":2246,"config":2247},"DevSecOps platform",{"href":1768,"dataGaName":2248,"dataGaLocation":2179},"devsecops platform",{"text":2250,"config":2251},"AI-Assisted Development",{"href":1775,"dataGaName":2252,"dataGaLocation":2179},"ai-assisted development",[2254],{"title":2255,"links":2256},"Topics",[2257,2262,2267,2272,2277,2282,2287,2292],{"text":2258,"config":2259},"CICD",{"href":2260,"dataGaName":2261,"dataGaLocation":2179},"/topics/ci-cd/","cicd",{"text":2263,"config":2264},"GitOps",{"href":2265,"dataGaName":2266,"dataGaLocation":2179},"/topics/gitops/","gitops",{"text":2268,"config":2269},"DevOps",{"href":2270,"dataGaName":2271,"dataGaLocation":2179},"/topics/devops/","devops",{"text":2273,"config":2274},"Version Control",{"href":2275,"dataGaName":2276,"dataGaLocation":2179},"/topics/version-control/","version control",{"text":2278,"config":2279},"DevSecOps",{"href":2280,"dataGaName":2281,"dataGaLocation":2179},"/topics/devsecops/","devsecops",{"text":2283,"config":2284},"Cloud Native",{"href":2285,"dataGaName":2286,"dataGaLocation":2179},"/topics/cloud-native/","cloud native",{"text":2288,"config":2289},"AI for Coding",{"href":2290,"dataGaName":2291,"dataGaLocation":2179},"/topics/devops/ai-for-coding/","ai for coding",{"text":2293,"config":2294},"Agentic AI",{"href":2295,"dataGaName":2296,"dataGaLocation":2179},"/topics/agentic-ai/","agentic ai",{"title":2298,"links":2299},"Solutions",[2300,2302,2304,2309,2313,2316,2320,2323,2325,2328,2331,2336],{"text":1830,"config":2301},{"href":1825,"dataGaName":1830,"dataGaLocation":2179},{"text":1819,"config":2303},{"href":1802,"dataGaName":1803,"dataGaLocation":2179},{"text":2305,"config":2306},"Agile development",{"href":2307,"dataGaName":2308,"dataGaLocation":2179},"/solutions/agile-delivery/","agile delivery",{"text":2310,"config":2311},"SCM",{"href":1815,"dataGaName":2312,"dataGaLocation":2179},"source code management",{"text":2258,"config":2314},{"href":1808,"dataGaName":2315,"dataGaLocation":2179},"continuous integration & delivery",{"text":2317,"config":2318},"Value stream management",{"href":1858,"dataGaName":2319,"dataGaLocation":2179},"value stream management",{"text":2263,"config":2321},{"href":2322,"dataGaName":2266,"dataGaLocation":2179},"/solutions/gitops/",{"text":1868,"config":2324},{"href":1871,"dataGaName":1872,"dataGaLocation":2179},{"text":2326,"config":2327},"Small business",{"href":1877,"dataGaName":1878,"dataGaLocation":2179},{"text":2329,"config":2330},"Public sector",{"href":1883,"dataGaName":1884,"dataGaLocation":2179},{"text":2332,"config":2333},"Education",{"href":2334,"dataGaName":2335,"dataGaLocation":2179},"/solutions/education/","education",{"text":2337,"config":2338},"Financial services",{"href":2339,"dataGaName":2340,"dataGaLocation":2179},"/solutions/finance/","financial services",{"title":1891,"links":2342},[2343,2345,2347,2349,2352,2354,2357,2359,2361,2363,2365,2367,2369,2371],{"text":1904,"config":2344},{"href":1906,"dataGaName":274,"dataGaLocation":2179},{"text":1908,"config":2346},{"href":1910,"dataGaName":1911,"dataGaLocation":2179},{"text":1913,"config":2348},{"href":1915,"dataGaName":1916,"dataGaLocation":2179},{"text":1918,"config":2350},{"href":1920,"dataGaName":2351,"dataGaLocation":2179},"docs",{"text":1941,"config":2353},{"href":1943,"dataGaName":1944,"dataGaLocation":2179},{"text":2355,"config":2356},"What's new",{"href":2001,"dataGaName":2002,"dataGaLocation":2179},{"text":1936,"config":2358},{"href":1938,"dataGaName":1939,"dataGaLocation":2179},{"text":1955,"config":2360},{"href":1957,"dataGaName":1958,"dataGaLocation":2179},{"text":1963,"config":2362},{"href":1965,"dataGaName":1966,"dataGaLocation":2179},{"text":1968,"config":2364},{"href":1970,"dataGaName":1971,"dataGaLocation":2179},{"text":1973,"config":2366},{"href":1975,"dataGaName":1976,"dataGaLocation":2179},{"text":1978,"config":2368},{"href":1980,"dataGaName":1981,"dataGaLocation":2179},{"text":1983,"config":2370},{"href":1985,"dataGaName":1986,"dataGaLocation":2179},{"text":1988,"config":2372},{"href":1990,"dataGaName":1991,"dataGaLocation":2179},{"title":2004,"links":2374},[2375,2377,2379,2381,2383,2385,2389,2394,2396,2398,2400],{"text":2012,"config":2376},{"href":2014,"dataGaName":2006,"dataGaLocation":2179},{"text":2017,"config":2378},{"href":2019,"dataGaName":2020,"dataGaLocation":2179},{"text":2025,"config":2380},{"href":2027,"dataGaName":2028,"dataGaLocation":2179},{"text":2030,"config":2382},{"href":2032,"dataGaName":2033,"dataGaLocation":2179},{"text":2035,"config":2384},{"href":2037,"dataGaName":2038,"dataGaLocation":2179},{"text":2386,"config":2387},"Sustainability",{"href":2388,"dataGaName":2386,"dataGaLocation":2179},"/sustainability/",{"text":2390,"config":2391},"Diversity, inclusion and belonging (DIB)",{"href":2392,"dataGaName":2393,"dataGaLocation":2179},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2040,"config":2395},{"href":2042,"dataGaName":2043,"dataGaLocation":2179},{"text":2050,"config":2397},{"href":2052,"dataGaName":2053,"dataGaLocation":2179},{"text":2055,"config":2399},{"href":2057,"dataGaName":2058,"dataGaLocation":2179},{"text":2401,"config":2402},"Modern Slavery Transparency Statement",{"href":2403,"dataGaName":2404,"dataGaLocation":2179},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2406},[2407,2410,2413],{"text":2408,"config":2409},"Terms",{"href":2231,"dataGaName":2232,"dataGaLocation":2179},{"text":2411,"config":2412},"Cookies",{"dataGaName":2241,"dataGaLocation":2179,"id":2242,"isOneTrustButton":1269},{"text":2414,"config":2415},"Privacy",{"href":2236,"dataGaName":2237,"dataGaLocation":2179},[2417],{"id":2418,"title":7,"body":1709,"config":2419,"content":2421,"description":1709,"extension":2425,"meta":2426,"navigation":1269,"path":2427,"seo":2428,"stem":2429,"__hash__":2430},"blogAuthors/en-us/blog/authors/achilleas-pipinellis.yml",{"template":2420},"BlogAuthor",{"name":7,"config":2422},{"headshot":2423,"ctfId":2424},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749671703/Blog/Author%20Headshots/axil-headshot.jpg","Achilleas-Pipinellis","yml",{},"/en-us/blog/authors/achilleas-pipinellis",{},"en-us/blog/authors/achilleas-pipinellis","vSsnKACisBQ6cIWVfVkuQ4WeAp0ylxXfqK5oJMhxEEg",[2432,2441,2449],{"title":2433,"description":2434,"heroImage":2435,"category":1705,"date":2436,"authors":2437,"slug":2440,"externalUrl":1709},"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",[2438,2439],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":2442,"description":2443,"heroImage":2444,"category":1705,"date":2445,"authors":2446,"slug":2448,"externalUrl":1709},"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",[2447],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2450,"description":2451,"heroImage":2452,"category":1705,"date":2453,"authors":2454,"slug":2456,"externalUrl":1709},"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",[2455],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":2458},[2459,2473,2485,2497],{"id":2460,"categories":2461,"header":2463,"text":2464,"button":2465,"image":2470},"ai-modernization",[2462],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":2466,"config":2467},"Get your AI maturity score",{"href":2468,"dataGaName":2469,"dataGaLocation":1944},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":2471},{"src":2472},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2474,"categories":2475,"header":2477,"text":2464,"button":2478,"image":2482},"devops-modernization",[2476,2281],"product","Are you just managing tools or shipping innovation?",{"text":2479,"config":2480},"Get your DevOps maturity score",{"href":2481,"dataGaName":2469,"dataGaLocation":1944},"/assessments/devops-modernization-assessment/",{"config":2483},{"src":2484},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2486,"categories":2487,"header":2489,"text":2464,"button":2490,"image":2494},"security-modernization",[2488],"security","Are you trading speed for security?",{"text":2491,"config":2492},"Get your security maturity score",{"href":2493,"dataGaName":2469,"dataGaLocation":1944},"/assessments/security-modernization-assessment/",{"config":2495},{"src":2496},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2498,"paths":2499,"header":2502,"text":2503,"button":2504,"image":2509},"github-azure-migration",[2500,2501],"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":2505,"config":2506},"See how GitLab compares to GitHub",{"href":2507,"dataGaName":2508,"dataGaLocation":1944},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2510},{"src":2484},{"header":2512,"blurb":2513,"button":2514,"secondaryButton":2519},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2515,"config":2516},"Get your free trial",{"href":2517,"dataGaName":1744,"dataGaLocation":2518},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":2217,"config":2520},{"href":2069,"dataGaName":1749,"dataGaLocation":2518},1786803747491]