[{"data":1,"prerenderedAt":1846},["ShallowReactive",2],{"/blog/15-git-tips-improve-workflow":3,"navigation-en-us":1059,"banner-en-us":1487,"footer-en-us":1497,"blog-post-authors-en-us-Suri Patel":1742,"blog-related-posts-en-us-15-git-tips-improve-workflow":1757,"blog-promotions-en-us":1782,"next-steps-en-us":1836},{"id":4,"title":5,"authors":6,"body":8,"category":1038,"date":1039,"description":1040,"extension":1041,"externalUrl":1042,"faq":1042,"featured":1043,"heroImage":1044,"meta":1045,"navigation":1046,"path":1047,"seo":1048,"slug":1052,"stem":1053,"tags":1054,"template":1057,"updatedDate":1042,"__hash__":1058},"blogPosts/en-us/blog/15-git-tips-improve-workflow.md","15 Git tips to improve your workflow",[7],"Suri Patel",{"type":9,"value":10,"toc":1016},"minimark",[11,37,40,45,48,63,125,135,142,150,154,170,173,180,191,195,202,205,237,240,260,273,276,297,300,344,348,351,365,368,371,388,391,394,410,414,422,426,458,464,475,482,496,499,513,516,534,540,561,569,573,580,599,603,621,625,628,646,650,667,671,674,722,726,735,740,746,753,771,784,791,801,819,823,826,846,849,871,874,893,901,906,924,927,944,952,959,977,982,985,998,1012],[12,13,14,15,21,22,26,27,31,32,36],"p",{},"This year, ",[16,17,20],"a",{"href":18,"rel":19},"https://git-scm.com/",[],"Git"," celebrates its 15th anniversary, and we’ve been excitedly posting some thoughts about its creation and impact — from sharing our experience at ",[16,23,25],{"href":24},"/blog/git-merge-fifteen-year-git-party/","Git Merge 2020",", discussing ",[16,28,30],{"href":29},"/blog/what-is-gitlab-flow/","the problem with Git flow",", or highlighting the newest Git feature ",[16,33,35],{"href":34},"/blog/partial-clone-for-massive-repositories/","Partial Clone",".",[12,38,39],{},"Whether you’re just getting started with Git, or you know your way around a command line, it’s always nice to brush up on your skills, which is why we’ve gathered 15 methods to improve your Git-based workflow.",[41,42,44],"h3",{"id":43},"_1-git-aliases","1. Git aliases",[12,46,47],{},"One of the most impactful ways to improve your daily workflow is to create aliases for common commands to save you some time in the terminal.",[12,49,50,51,55,56,59,60,36],{},"You can use the following commands to create aliases for the most-used Git commands, ",[52,53,54],"code",{},"checkout",", ",[52,57,58],{},"commit"," and ",[52,61,62],{},"branch",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-shell shiki shiki-themes github-light","git config --global alias.co checkout\ngit config --global alias.ci commit\ngit config --global alias.br branch\n","shell","",[52,71,72,95,110],{"__ignoreMap":69},[73,74,77,81,85,89,92],"span",{"class":75,"line":76},"line",1,[73,78,80],{"class":79},"s7eDp","git",[73,82,84],{"class":83},"sYBdl"," config",[73,86,88],{"class":87},"sYu0t"," --global",[73,90,91],{"class":83}," alias.co",[73,93,94],{"class":83}," checkout\n",[73,96,98,100,102,104,107],{"class":75,"line":97},2,[73,99,80],{"class":79},[73,101,84],{"class":83},[73,103,88],{"class":87},[73,105,106],{"class":83}," alias.ci",[73,108,109],{"class":83}," commit\n",[73,111,113,115,117,119,122],{"class":75,"line":112},3,[73,114,80],{"class":79},[73,116,84],{"class":83},[73,118,88],{"class":87},[73,120,121],{"class":83}," alias.br",[73,123,124],{"class":83}," branch\n",[12,126,127,128,131,132,36],{},"Instead of typing ",[52,129,130],{},"git checkout master",", you only need to type ",[52,133,134],{},"git co master",[12,136,137,138,141],{},"You could also edit these commands or add more by modifying the ",[52,139,140],{},"~/.gitconfig"," file directly:",[64,143,148],{"className":144,"code":146,"language":147,"meta":69},[145],"language-text","[alias]\n    co = checkout\n    ci = commit\n    br = branch\n\n","text",[52,149,146],{"__ignoreMap":69},[41,151,153],{"id":152},"_2-see-the-repository-status-in-your-terminals-prompt","2. See the repository status in your terminal’s prompt",[12,155,156,157,160,161,166,167,36],{},"If you’d like to visualize the status of your repository, you can run ",[52,158,159],{},"git-prompt.sh","\n(you can ",[16,162,165],{"href":163,"rel":164},"https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh",[],"download it"," and follow the\ninstructions to 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, likely under ",[52,168,169],{},"/etc/bash_completion.d/",[12,171,172],{},"You can replace your standard shell prompt with something a bit more exciting:",[12,174,175],{},[176,177],"img",{"alt":178,"src":179},"Git shell prompt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398323/blog/Content%20Images/git-tricks/git-shell-info.png",[12,181,182],{},[183,184,185,186,36],"em",{},"Taken from oh-my-zsh's ",[16,187,190],{"href":188,"rel":189},"https://github.com/robbyrussell/oh-my-zsh/wiki/Themes#kafeitu",[],"themes wiki",[41,192,194],{"id":193},"_3-compare-commits-from-the-command-line","3. Compare commits from the command line",[12,196,197,198,201],{},"A simple way to compare the differences between commits or versions of the same file is to use the ",[52,199,200],{},"git diff"," command.",[12,203,204],{},"If you want to compare the same file between different commits, you run the following:",[64,206,208],{"className":66,"code":207,"language":68,"meta":69,"style":69},"$ git diff $start_commit..$end_commit -- path/to/file\n",[52,209,210],{"__ignoreMap":69},[73,211,212,215,218,221,225,228,231,234],{"class":75,"line":76},[73,213,214],{"class":79},"$",[73,216,217],{"class":83}," git",[73,219,220],{"class":83}," diff",[73,222,224],{"class":223},"sgsFI"," $start_commit",[73,226,227],{"class":83},"..",[73,229,230],{"class":223},"$end_commit ",[73,232,233],{"class":87},"--",[73,235,236],{"class":83}," path/to/file\n",[12,238,239],{},"If you want to compare the changes between two commits:",[64,241,243],{"className":66,"code":242,"language":68,"meta":69,"style":69},"$ git diff $start_commit..$end_commit\n",[52,244,245],{"__ignoreMap":69},[73,246,247,249,251,253,255,257],{"class":75,"line":76},[73,248,214],{"class":79},[73,250,217],{"class":83},[73,252,220],{"class":83},[73,254,224],{"class":223},[73,256,227],{"class":83},[73,258,259],{"class":223},"$end_commit\n",[12,261,262,263,266,267,272],{},"These commands will open the diff view inside the terminal, but if you prefer to use a more visual tool to compare your diffs, you can use ",[52,264,265],{},"git difftool",". ",[16,268,271],{"href":269,"rel":270},"https://meldmerge.org/",[],"Meld"," is a useful viewer/editor to visually compare diffs.",[12,274,275],{},"To configure Meld:",[64,277,279],{"className":66,"code":278,"language":68,"meta":69,"style":69},"$ git config --global diff.tool git-meld\n",[52,280,281],{"__ignoreMap":69},[73,282,283,285,287,289,291,294],{"class":75,"line":76},[73,284,214],{"class":79},[73,286,217],{"class":83},[73,288,84],{"class":83},[73,290,88],{"class":87},[73,292,293],{"class":83}," diff.tool",[73,295,296],{"class":83}," git-meld\n",[12,298,299],{},"To start viewing the diffs:",[64,301,303],{"className":66,"code":302,"language":68,"meta":69,"style":69},"$ git difftool $start_commit..$end_commit -- path/to/file\n# or\n$ git difftool $start_commit..$end_commit\n",[52,304,305,324,330],{"__ignoreMap":69},[73,306,307,309,311,314,316,318,320,322],{"class":75,"line":76},[73,308,214],{"class":79},[73,310,217],{"class":83},[73,312,313],{"class":83}," difftool",[73,315,224],{"class":223},[73,317,227],{"class":83},[73,319,230],{"class":223},[73,321,233],{"class":87},[73,323,236],{"class":83},[73,325,326],{"class":75,"line":97},[73,327,329],{"class":328},"sAwPA","# or\n",[73,331,332,334,336,338,340,342],{"class":75,"line":112},[73,333,214],{"class":79},[73,335,217],{"class":83},[73,337,313],{"class":83},[73,339,224],{"class":223},[73,341,227],{"class":83},[73,343,259],{"class":223},[41,345,347],{"id":346},"_4-stashing-uncommitted-changes","4. Stashing uncommitted changes",[12,349,350],{},"If you’re ever working on a feature and need to do an emergency fix on the project, you could run into a problem. You don’t want to commit an unfinished feature, and you also don’t want to lose current changes. The solution is to temporarily remove these changes with the Git stash command:",[64,352,354],{"className":66,"code":353,"language":68,"meta":69,"style":69},"$ git stash\n",[52,355,356],{"__ignoreMap":69},[73,357,358,360,362],{"class":75,"line":76},[73,359,214],{"class":79},[73,361,217],{"class":83},[73,363,364],{"class":83}," stash\n",[12,366,367],{},"The git stash command hides changes, giving you a clean working directory and the ability to switch to a new branch to make updates, without having to commit a meaningless snapshot in order to save the current state.",[12,369,370],{},"Once you’re done working on a fix and want to revisit your previous changes, you can run:",[64,372,374],{"className":66,"code":373,"language":68,"meta":69,"style":69},"$ git stash pop\n",[52,375,376],{"__ignoreMap":69},[73,377,378,380,382,385],{"class":75,"line":76},[73,379,214],{"class":79},[73,381,217],{"class":83},[73,383,384],{"class":83}," stash",[73,386,387],{"class":83}," pop\n",[12,389,390],{},"And your changes will be recovered. 🎉",[12,392,393],{},"If you no longer need those changes and want to clear the stash stack, you can do so with:",[64,395,397],{"className":66,"code":396,"language":68,"meta":69,"style":69},"$ git stash drop\n",[52,398,399],{"__ignoreMap":69},[73,400,401,403,405,407],{"class":75,"line":76},[73,402,214],{"class":79},[73,404,217],{"class":83},[73,406,384],{"class":83},[73,408,409],{"class":83}," drop\n",[41,411,413],{"id":412},"_5-pull-frequently","5. Pull frequently",[12,415,416,417,421],{},"If you’re using ",[16,418,420],{"href":419},"/topics/version-control/what-are-gitlab-flow-best-practices/","GitLab Flow",", then you’re working\non feature branches. Depending on how long your feature takes to implement, there might be several changes made to the master branch. In order to avoid major conflicts, you should frequently pull the changes from the master branch to your branch to resolve any conflicts as soon as possible and to make merging your branch to master easier.",[41,423,425],{"id":424},"_6-autocomplete-commands","6. Autocomplete commands",[12,427,428,429,434,435,55,438,59,441,444,445,448,449,452,453,457],{},"Using ",[16,430,433],{"href":431,"rel":432},"https://github.com/git/git/tree/master/contrib/completion",[],"completion scripts",", you can quickly create the commands for ",[52,436,437],{},"bash",[52,439,440],{},"tcsh",[52,442,443],{},"zsh",". If you want to type ",[52,446,447],{},"git pull",", you can type just the first letter with ",[52,450,451],{},"git p"," followed by ",[454,455,456],"kbd",{},"Tab"," will show the following:",[64,459,462],{"className":460,"code":461,"language":147,"meta":69},[145],"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",[52,463,461],{"__ignoreMap":69},[12,465,466,467,469,470,472,473,36],{},"To show all available commands, type ",[52,468,80],{}," in your terminal followed by\n",[454,471,456],{},"+ ",[454,474,456],{},[41,476,478,479],{"id":477},"_7-set-a-global-gitignore","7. Set a global ",[52,480,481],{},".gitignore",[12,483,484,485,488,489,492,493,495],{},"If you want to avoid committing files like ",[52,486,487],{},".DS_Store"," or Vim ",[52,490,491],{},"swp"," files,\nyou can set up a global ",[52,494,481],{}," file.",[12,497,498],{},"Create the file:",[64,500,503],{"className":501,"code":502,"language":437,"meta":69,"style":69},"language-bash shiki shiki-themes github-light","touch ~/.gitignore\n",[52,504,505],{"__ignoreMap":69},[73,506,507,510],{"class":75,"line":76},[73,508,509],{"class":79},"touch",[73,511,512],{"class":83}," ~/.gitignore\n",[12,514,515],{},"Then run:",[64,517,519],{"className":501,"code":518,"language":437,"meta":69,"style":69},"git config --global core.excludesFile ~/.gitignore\n",[52,520,521],{"__ignoreMap":69},[73,522,523,525,527,529,532],{"class":75,"line":76},[73,524,80],{"class":79},[73,526,84],{"class":83},[73,528,88],{"class":87},[73,530,531],{"class":83}," core.excludesFile",[73,533,512],{"class":83},[12,535,536,537,539],{},"Or manually add the following to your ",[52,538,140],{},":",[64,541,545],{"className":542,"code":543,"language":544,"meta":69,"style":69},"language-ini shiki shiki-themes github-light","[core]\n  excludesFile = ~/.gitignore\n\n","ini",[52,546,547,552],{"__ignoreMap":69},[73,548,549],{"class":75,"line":76},[73,550,551],{"class":79},"[core]\n",[73,553,554,558],{"class":75,"line":97},[73,555,557],{"class":556},"sD7c4","  excludesFile",[73,559,560],{"class":223}," = ~/.gitignore\n",[12,562,563,564,36],{},"You can create a list of the things you want Git to ignore. To learn more, visit the ",[16,565,568],{"href":566,"rel":567},"https://git-scm.com/docs/gitignore",[],"gitignore documentation",[41,570,572],{"id":571},"_8-enable-gits-autosquash-feature-by-default","8. Enable Git’s autosquash feature by default",[12,574,575,576,579],{},"Autosquash makes it easier to squash commits during an interactive rebase. It can be enabled for each rebase using ",[52,577,578],{},"git rebase -i --autosquash",", but it's easier to turn it on by default.",[64,581,583],{"className":501,"code":582,"language":437,"meta":69,"style":69},"git config --global rebase.autosquash true\n",[52,584,585],{"__ignoreMap":69},[73,586,587,589,591,593,596],{"class":75,"line":76},[73,588,80],{"class":79},[73,590,84],{"class":83},[73,592,88],{"class":87},[73,594,595],{"class":83}," rebase.autosquash",[73,597,598],{"class":87}," true\n",[12,600,536,601,539],{},[52,602,140],{},[64,604,606],{"className":542,"code":605,"language":544,"meta":69,"style":69},"[rebase]\n  autosquash = true\n\n",[52,607,608,613],{"__ignoreMap":69},[73,609,610],{"class":75,"line":76},[73,611,612],{"class":79},"[rebase]\n",[73,614,615,618],{"class":75,"line":97},[73,616,617],{"class":556},"  autosquash",[73,619,620],{"class":223}," = true\n",[41,622,624],{"id":623},"_9-delete-local-branches-that-have-been-removed-from-remote-on-fetchpull","9. Delete local branches that have been removed from remote on fetch/pull",[12,626,627],{},"You likely have stale branches in your local repository that no longer exist in the remote one. To delete them in each fetch/pull, run:",[64,629,631],{"className":501,"code":630,"language":437,"meta":69,"style":69},"git config --global fetch.prune true\n",[52,632,633],{"__ignoreMap":69},[73,634,635,637,639,641,644],{"class":75,"line":76},[73,636,80],{"class":79},[73,638,84],{"class":83},[73,640,88],{"class":87},[73,642,643],{"class":83}," fetch.prune",[73,645,598],{"class":87},[12,647,536,648,539],{},[52,649,140],{},[64,651,653],{"className":542,"code":652,"language":544,"meta":69,"style":69},"[fetch]\n  prune = true\n\n",[52,654,655,660],{"__ignoreMap":69},[73,656,657],{"class":75,"line":76},[73,658,659],{"class":79},"[fetch]\n",[73,661,662,665],{"class":75,"line":97},[73,663,664],{"class":556},"  prune",[73,666,620],{"class":223},[41,668,670],{"id":669},"_10-use-git-blame-more-efficiently","10. Use Git blame more efficiently",[12,672,673],{},"Git blame is a handy way to discover who changed a line in a file. Depending on what you want to show, you can pass different flags:",[64,675,677],{"className":66,"code":676,"language":68,"meta":69,"style":69},"$ git blame -w  # ignores white space\n$ git blame -M  # ignores moving text\n$ git blame -C  # ignores moving text into other files\n",[52,678,679,694,708],{"__ignoreMap":69},[73,680,681,683,685,688,691],{"class":75,"line":76},[73,682,214],{"class":79},[73,684,217],{"class":83},[73,686,687],{"class":83}," blame",[73,689,690],{"class":87}," -w",[73,692,693],{"class":328},"  # ignores white space\n",[73,695,696,698,700,702,705],{"class":75,"line":97},[73,697,214],{"class":79},[73,699,217],{"class":83},[73,701,687],{"class":83},[73,703,704],{"class":87}," -M",[73,706,707],{"class":328},"  # ignores moving text\n",[73,709,710,712,714,716,719],{"class":75,"line":112},[73,711,214],{"class":79},[73,713,217],{"class":83},[73,715,687],{"class":83},[73,717,718],{"class":87}," -C",[73,720,721],{"class":328},"  # ignores moving text into other files\n",[41,723,725],{"id":724},"_11-add-an-alias-to-check-out-merge-requests-locally","11. Add an alias to check out merge requests locally",[12,727,728,729,734],{},"A ",[16,730,733],{"href":731,"rel":732},"https://docs.gitlab.com/user/project/merge_requests/",[],"merge request"," contains all the history from a repository, and the additional\ncommits added to the branch associated with the MR. You can check out a public merge request locally even if the source project is a fork (even a private fork) of the target project.",[12,736,737,738,539],{},"To check out a merge request locally, add the following alias to your ",[52,739,140],{},[64,741,744],{"className":742,"code":743,"language":147,"meta":69},[145],"[alias]\n  mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -\n\n",[52,745,743],{"__ignoreMap":69},[12,747,748,749,752],{},"Now you can check out a merge request from any repository and any remote. For example, to check out the merge request with ID 5 as shown in GitLab\nfrom the ",[52,750,751],{},"upstream"," remote, run:",[64,754,756],{"className":66,"code":755,"language":68,"meta":69,"style":69},"git mr upstream 5\n",[52,757,758],{"__ignoreMap":69},[73,759,760,762,765,768],{"class":75,"line":76},[73,761,80],{"class":79},[73,763,764],{"class":83}," mr",[73,766,767],{"class":83}," upstream",[73,769,770],{"class":87}," 5\n",[12,772,773,774,777,778,780,781,36],{},"This will fetch the merge request into a local ",[52,775,776],{},"mr-upstream-5"," branch and check\nit out. In the above example, ",[52,779,751],{}," is the remote that points to GitLab\nwhich you can find out by running ",[52,782,783],{},"git remote -v",[41,785,787,788],{"id":786},"_12-an-alias-of-head","12. An alias of ",[52,789,790],{},"HEAD",[12,792,793,794,797,798,800],{},"Breaking news: ",[52,795,796],{},"@"," is the same as ",[52,799,790],{},". Using it during a rebase is a lifesaver:",[64,802,804],{"className":501,"code":803,"language":437,"meta":69,"style":69},"git rebase -i @~2\n",[52,805,806],{"__ignoreMap":69},[73,807,808,810,813,816],{"class":75,"line":76},[73,809,80],{"class":79},[73,811,812],{"class":83}," rebase",[73,814,815],{"class":87}," -i",[73,817,818],{"class":83}," @~2\n",[41,820,822],{"id":821},"_13-resetting-files","13. Resetting files",[12,824,825],{},"You’re modifying your code when you suddenly realize that the changes you made are not great, and you’d like to reset them. Rather than clicking undo on everything you edited, you can reset your files to the HEAD of the branch:",[64,827,829],{"className":66,"code":828,"language":68,"meta":69,"style":69},"$ git reset --hard HEAD\n",[52,830,831],{"__ignoreMap":69},[73,832,833,835,837,840,843],{"class":75,"line":76},[73,834,214],{"class":79},[73,836,217],{"class":83},[73,838,839],{"class":83}," reset",[73,841,842],{"class":87}," --hard",[73,844,845],{"class":83}," HEAD\n",[12,847,848],{},"Or if you want to reset a single file:",[64,850,852],{"className":66,"code":851,"language":68,"meta":69,"style":69},"$ git checkout HEAD -- path/to/file\n",[52,853,854],{"__ignoreMap":69},[73,855,856,858,860,863,866,869],{"class":75,"line":76},[73,857,214],{"class":79},[73,859,217],{"class":83},[73,861,862],{"class":83}," checkout",[73,864,865],{"class":83}," HEAD",[73,867,868],{"class":87}," --",[73,870,236],{"class":83},[12,872,873],{},"Now, if you already committed your changes, but still want to revert back, you can use:",[64,875,877],{"className":66,"code":876,"language":68,"meta":69,"style":69},"$ git reset --soft HEAD~1\n",[52,878,879],{"__ignoreMap":69},[73,880,881,883,885,887,890],{"class":75,"line":76},[73,882,214],{"class":79},[73,884,217],{"class":83},[73,886,839],{"class":83},[73,888,889],{"class":87}," --soft",[73,891,892],{"class":83}," HEAD~1\n",[41,894,896,897,900],{"id":895},"_14-the-git-open-plugin","14. The ",[52,898,899],{},"git-open"," plugin",[12,902,903,904,36],{},"If you’d like to quickly visit the website that hosts the repository you’re on, you’ll need ",[52,905,899],{},[12,907,908,913,914,919,920,923],{},[16,909,912],{"href":910,"rel":911},"https://github.com/paulirish/git-open#installation",[],"Install it"," and take it for a spin by cloning a repository from\n",[16,915,918],{"href":916,"rel":917},"https://gitlab.com/explore",[],"GitLab.com",". From your terminal, navigate to the\nrepository and run ",[52,921,922],{},"git open"," to be transferred to the project’s page on\nGitLab.com.",[12,925,926],{},"The plugin works by default for projects hosted on GitLab.com, but you can also use it\nwith your own GitLab instances. In that case, set up the domain name with:",[64,928,930],{"className":501,"code":929,"language":437,"meta":69,"style":69},"git config gitopen.gitlab.domain git.example.com\n",[52,931,932],{"__ignoreMap":69},[73,933,934,936,938,941],{"class":75,"line":76},[73,935,80],{"class":79},[73,937,84],{"class":83},[73,939,940],{"class":83}," gitopen.gitlab.domain",[73,942,943],{"class":83}," git.example.com\n",[12,945,946,947,36],{},"You can open different remotes and branches if they have been set up. You can learn more by checking out the ",[16,948,951],{"href":949,"rel":950},"https://github.com/paulirish/git-open#examples",[],"examples section",[41,953,955,956,900],{"id":954},"_15-the-git-extras-plugin","15. The ",[52,957,958],{},"git-extras",[12,960,961,962,968,969,972,973,976],{},"If you want to elevate Git with more commands, try out the\n",[16,963,966,900],{"href":964,"rel":965},"https://github.com/tj/git-extras",[],[52,967,958],{},", which includes ",[52,970,971],{},"git info"," (show\ninformation about the repository) and ",[52,974,975],{},"git effort"," (number of commits per file).",[978,979,981],"h2",{"id":980},"learn-more-about-git","Learn more about Git",[12,983,984],{},"We’re excited to announce that Brendan O’Leary, senior developer evangelist, will create 15 videos to celebrate Git's anniversary over the next several months. He’ll focus on a variety of topics, from rebasing and merging to cherry-picking and branching. Take a look at the first video in the series. 🍿",[986,987,990,991],"figure",{"className":988},[989],"video_container","\n  ",[992,993,997],"iframe",{"src":994,"frameBorder":995,"allowFullScreen":996},"https://www.youtube-nocookie.com/embed/9oDNBuive-g","0","true"," ",[12,999,1000,1001,1006,1007],{},"Cover image by ",[16,1002,1005],{"href":1003,"rel":1004},"https://unsplash.com/@brookelark?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Brooke Lark"," on ",[16,1008,1011],{"href":1009,"rel":1010},"https://unsplash.com/s/photos/birthday?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Unsplash",[1013,1014,1015],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":69,"searchDepth":97,"depth":97,"links":1017},[1018,1019,1020,1021,1022,1023,1024,1026,1027,1028,1029,1030,1032,1033,1035,1037],{"id":43,"depth":112,"text":44},{"id":152,"depth":112,"text":153},{"id":193,"depth":112,"text":194},{"id":346,"depth":112,"text":347},{"id":412,"depth":112,"text":413},{"id":424,"depth":112,"text":425},{"id":477,"depth":112,"text":1025},"7. Set a global .gitignore",{"id":571,"depth":112,"text":572},{"id":623,"depth":112,"text":624},{"id":669,"depth":112,"text":670},{"id":724,"depth":112,"text":725},{"id":786,"depth":112,"text":1031},"12. An alias of HEAD",{"id":821,"depth":112,"text":822},{"id":895,"depth":112,"text":1034},"14. The git-open plugin",{"id":954,"depth":112,"text":1036},"15. The git-extras plugin",{"id":980,"depth":97,"text":981},"open-source","2020-04-07","Learn how to compare commits, delete stale branches, and write aliases to save you some time. It's time to dust off your command line and Git busy!","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681222/Blog/Hero%20Images/git-15th-anniversary-cover.png",{},true,"/en-us/blog/15-git-tips-improve-workflow",{"title":5,"description":1040,"ogTitle":5,"ogDescription":1040,"noIndex":1043,"ogImage":1044,"ogUrl":1049,"ogSiteName":1050,"ogType":1051,"canonicalUrls":1049},"https://about.gitlab.com/blog/15-git-tips-improve-workflow","https://about.gitlab.com","article","15-git-tips-improve-workflow","en-us/blog/15-git-tips-improve-workflow",[80,1055,1056],"workflow","code review","BlogPost","bIAQXlkDIvvxrNYHfE7OcGUlFlRWMhZiz2jReogiwzY",{"logo":1060,"freeTrial":1065,"sales":1070,"login":1075,"items":1080,"search":1407,"minimal":1438,"duo":1457,"switchNav":1466,"pricingDeployment":1477},{"config":1061},{"href":1062,"dataGaName":1063,"dataGaLocation":1064},"/","gitlab logo","header",{"text":1066,"config":1067},"Get free trial",{"href":1068,"dataGaName":1069,"dataGaLocation":1064},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1071,"config":1072},"Request a demo",{"href":1073,"dataGaName":1074,"dataGaLocation":1064},"/sales/?contact-topic=request-demo","sales",{"text":1076,"config":1077},"Sign in",{"href":1078,"dataGaName":1079,"dataGaLocation":1064},"https://gitlab.com/users/sign_in/","sign in",[1081,1110,1210,1215,1329,1385],{"text":1082,"config":1083,"menu":1085},"Platform",{"dataNavLevelOne":1084},"platform",{"type":1086,"columns":1087},"cards",[1088,1094,1102],{"title":1082,"description":1089,"link":1090},"The intelligent orchestration platform for DevSecOps",{"text":1091,"config":1092},"Explore our Platform",{"href":1093,"dataGaName":1084,"dataGaLocation":1064},"/platform/",{"title":1095,"description":1096,"link":1097},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1098,"config":1099},"Meet GitLab Duo",{"href":1100,"dataGaName":1101,"dataGaLocation":1064},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1103,"description":1104,"link":1105},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1106,"config":1107},"Learn more",{"href":1108,"dataGaName":1109,"dataGaLocation":1064},"/why-gitlab/","why gitlab",{"text":1111,"left":1046,"config":1112,"menu":1114},"Product",{"dataNavLevelOne":1113},"solutions",{"type":1115,"link":1116,"columns":1120,"feature":1189},"lists",{"text":1117,"config":1118},"View all Solutions",{"href":1119,"dataGaName":1113,"dataGaLocation":1064},"/solutions/",[1121,1145,1168],{"title":1122,"description":1123,"link":1124,"items":1129},"Automation","CI/CD and automation to accelerate deployment",{"config":1125},{"icon":1126,"href":1127,"dataGaName":1128,"dataGaLocation":1064},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1130,1134,1137,1141],{"text":1131,"config":1132},"CI/CD",{"href":1133,"dataGaLocation":1064,"dataGaName":1131},"/solutions/continuous-integration/",{"text":1095,"config":1135},{"href":1100,"dataGaLocation":1064,"dataGaName":1136},"gitlab duo agent platform - product menu",{"text":1138,"config":1139},"Source Code Management",{"href":1140,"dataGaLocation":1064,"dataGaName":1138},"/solutions/source-code-management/",{"text":1142,"config":1143},"Automated Software Delivery",{"href":1127,"dataGaLocation":1064,"dataGaName":1144},"Automated software delivery",{"title":1146,"description":1147,"link":1148,"items":1153},"Security","Deliver code faster without compromising security",{"config":1149},{"href":1150,"dataGaName":1151,"dataGaLocation":1064,"icon":1152},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1154,1158,1163],{"text":1155,"config":1156},"Application Security Testing",{"href":1150,"dataGaName":1157,"dataGaLocation":1064},"Application security testing",{"text":1159,"config":1160},"Software Supply Chain Security",{"href":1161,"dataGaLocation":1064,"dataGaName":1162},"/solutions/supply-chain/","Software supply chain security",{"text":1164,"config":1165},"Software Compliance",{"href":1166,"dataGaName":1167,"dataGaLocation":1064},"/solutions/software-compliance/","software compliance",{"title":1169,"link":1170,"items":1175},"Measurement",{"config":1171},{"icon":1172,"href":1173,"dataGaName":1174,"dataGaLocation":1064},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1176,1180,1184],{"text":1177,"config":1178},"Visibility & Measurement",{"href":1173,"dataGaLocation":1064,"dataGaName":1179},"Visibility and Measurement",{"text":1181,"config":1182},"Value Stream Management",{"href":1183,"dataGaLocation":1064,"dataGaName":1181},"/solutions/value-stream-management/",{"text":1185,"config":1186},"Analytics & Insights",{"href":1187,"dataGaLocation":1064,"dataGaName":1188},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1190,"type":1115,"items":1191},"GitLab for",[1192,1198,1204],{"text":1193,"config":1194},"Enterprise",{"icon":1195,"href":1196,"dataGaLocation":1064,"dataGaName":1197},"Building","/enterprise/","enterprise",{"text":1199,"config":1200},"Small Business",{"icon":1201,"href":1202,"dataGaLocation":1064,"dataGaName":1203},"Work","/small-business/","small business",{"text":1205,"config":1206},"Public Sector",{"icon":1207,"href":1208,"dataGaLocation":1064,"dataGaName":1209},"Organization","/solutions/public-sector/","public sector",{"text":1211,"config":1212},"Pricing",{"href":1213,"dataGaName":1214,"dataGaLocation":1064,"dataNavLevelOne":1214},"/pricing/","pricing",{"text":1216,"config":1217,"menu":1219},"Resources",{"dataNavLevelOne":1218},"resources",{"type":1115,"link":1220,"columns":1224,"feature":1318},{"text":1221,"config":1222},"View all resources",{"href":1223,"dataGaName":1218,"dataGaLocation":1064},"/resources/",[1225,1258,1285],{"title":1226,"items":1227},"Getting started",[1228,1233,1238,1243,1248,1253],{"text":1229,"config":1230},"Install",{"href":1231,"dataGaName":1232,"dataGaLocation":1064},"/install/","install",{"text":1234,"config":1235},"Quick start guides",{"href":1236,"dataGaName":1237,"dataGaLocation":1064},"/get-started/","quick setup checklists",{"text":1239,"config":1240},"Learn",{"href":1241,"dataGaLocation":1064,"dataGaName":1242},"https://university.gitlab.com/","learn",{"text":1244,"config":1245},"Product documentation",{"href":1246,"dataGaName":1247,"dataGaLocation":1064},"https://docs.gitlab.com/","product documentation",{"text":1249,"config":1250},"Best practice videos",{"href":1251,"dataGaName":1252,"dataGaLocation":1064},"/getting-started-videos/","best practice videos",{"text":1254,"config":1255},"Integrations",{"href":1256,"dataGaName":1257,"dataGaLocation":1064},"/integrations/","integrations",{"title":1259,"items":1260},"Discover",[1261,1266,1271,1276,1280],{"text":1262,"config":1263},"Customer success stories",{"href":1264,"dataGaName":1265,"dataGaLocation":1064},"/customers/","customer success stories",{"text":1267,"config":1268},"Blog",{"href":1269,"dataGaName":1270,"dataGaLocation":1064},"/blog/","blog",{"text":1272,"config":1273},"Demo Hub",{"href":1274,"dataGaName":1275,"dataGaLocation":1064},"/demo-hub/","demo hub",{"text":1277,"config":1278},"The Source",{"href":1279,"dataGaName":1270,"dataGaLocation":1064},"/the-source/",{"text":1281,"config":1282},"Remote",{"href":1283,"dataGaName":1284,"dataGaLocation":1064},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1286,"items":1287},"Connect",[1288,1293,1298,1303,1308,1313],{"text":1289,"config":1290},"GitLab Services",{"href":1291,"dataGaName":1292,"dataGaLocation":1064},"/services/","services",{"text":1294,"config":1295},"Contribute",{"href":1296,"dataGaName":1297,"dataGaLocation":1064},"https://contributors.gitlab.com","contribute",{"text":1299,"config":1300},"Community",{"href":1301,"dataGaName":1302,"dataGaLocation":1064},"/community/","community",{"text":1304,"config":1305},"Forum",{"href":1306,"dataGaName":1307,"dataGaLocation":1064},"https://forum.gitlab.com/","forum",{"text":1309,"config":1310},"Events",{"href":1311,"dataGaName":1312,"dataGaLocation":1064},"/events/","events",{"text":1314,"config":1315},"Partners",{"href":1316,"dataGaName":1317,"dataGaLocation":1064},"/partners/","partners",{"config":1319,"title":1322,"text":1323,"link":1324},{"background":1320,"textColor":1321},"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":1325,"config":1326},"Read the latest",{"href":1327,"dataGaName":1328,"dataGaLocation":1064},"/whats-new/","whats new",{"text":1330,"config":1331,"menu":1333},"Company",{"dataNavLevelOne":1332},"company",{"type":1115,"columns":1334},[1335],{"items":1336},[1337,1342,1348,1350,1355,1360,1365,1370,1375,1380],{"text":1338,"config":1339},"About",{"href":1340,"dataGaName":1341,"dataGaLocation":1064},"/company/","about",{"text":1343,"config":1344,"footerGa":1347},"Jobs",{"href":1345,"dataGaName":1346,"dataGaLocation":1064},"/jobs/","jobs",{"dataGaName":1346},{"text":1309,"config":1349},{"href":1311,"dataGaName":1312,"dataGaLocation":1064},{"text":1351,"config":1352},"Leadership",{"href":1353,"dataGaName":1354,"dataGaLocation":1064},"/company/team/e-group/","leadership",{"text":1356,"config":1357},"Handbook",{"href":1358,"dataGaName":1359,"dataGaLocation":1064},"https://handbook.gitlab.com/","handbook",{"text":1361,"config":1362},"Investor relations",{"href":1363,"dataGaName":1364,"dataGaLocation":1064},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1366,"config":1367},"Trust Center",{"href":1368,"dataGaName":1369,"dataGaLocation":1064},"/security/","trust center",{"text":1371,"config":1372},"AI Transparency Center",{"href":1373,"dataGaName":1374,"dataGaLocation":1064},"/ai-transparency-center/","ai transparency center",{"text":1376,"config":1377},"Newsletter",{"href":1378,"dataGaName":1379,"dataGaLocation":1064},"/company/contact/#contact-forms","newsletter",{"text":1381,"config":1382},"Press",{"href":1383,"dataGaName":1384,"dataGaLocation":1064},"/press/","press",{"text":1386,"config":1387,"menu":1388},"Contact us",{"dataNavLevelOne":1332},{"type":1115,"columns":1389},[1390],{"items":1391},[1392,1397,1402],{"text":1393,"config":1394},"Talk to sales",{"href":1395,"dataGaName":1396,"dataGaLocation":1064},"/sales/","talk to sales",{"text":1398,"config":1399},"Support portal",{"href":1400,"dataGaName":1401,"dataGaLocation":1064},"https://support.gitlab.com/hc/en-us","support portal",{"text":1403,"config":1404},"Customer portal",{"href":1405,"dataGaName":1406,"dataGaLocation":1064},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1408,"login":1409,"suggestions":1416},"Close",{"text":1410,"link":1411},"To search repositories and projects, login to",{"text":1412,"config":1413},"gitlab.com",{"href":1078,"dataGaName":1414,"dataGaLocation":1415},"search login","search",{"text":1417,"default":1418},"Suggestions",[1419,1421,1425,1427,1431,1435],{"text":1095,"config":1420},{"href":1100,"dataGaName":1095,"dataGaLocation":1415},{"text":1422,"config":1423},"Code Suggestions (AI)",{"href":1424,"dataGaName":1422,"dataGaLocation":1415},"/solutions/code-suggestions/",{"text":1131,"config":1426},{"href":1133,"dataGaName":1131,"dataGaLocation":1415},{"text":1428,"config":1429},"GitLab on AWS",{"href":1430,"dataGaName":1428,"dataGaLocation":1415},"/partners/technology-partners/aws/",{"text":1432,"config":1433},"GitLab on Google Cloud",{"href":1434,"dataGaName":1432,"dataGaLocation":1415},"/partners/technology-partners/google-cloud-platform/",{"text":1436,"config":1437},"Why GitLab?",{"href":1108,"dataGaName":1436,"dataGaLocation":1415},{"freeTrial":1439,"mobileIcon":1444,"desktopIcon":1449,"secondaryButton":1452},{"text":1440,"config":1441},"Start free trial",{"href":1442,"dataGaName":1069,"dataGaLocation":1443},"https://gitlab.com/-/trials/new/","nav",{"altText":1445,"config":1446},"Gitlab Icon",{"src":1447,"dataGaName":1448,"dataGaLocation":1443},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1445,"config":1450},{"src":1451,"dataGaName":1448,"dataGaLocation":1443},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1453,"config":1454},"Get Started",{"href":1455,"dataGaName":1456,"dataGaLocation":1443},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1458,"mobileIcon":1462,"desktopIcon":1464},{"text":1459,"config":1460},"Learn more about GitLab Duo",{"href":1100,"dataGaName":1461,"dataGaLocation":1443},"gitlab duo",{"altText":1445,"config":1463},{"src":1447,"dataGaName":1448,"dataGaLocation":1443},{"altText":1445,"config":1465},{"src":1451,"dataGaName":1448,"dataGaLocation":1443},{"button":1467,"mobileIcon":1472,"desktopIcon":1474},{"text":1468,"config":1469},"/switch",{"href":1470,"dataGaName":1471,"dataGaLocation":1443},"#contact","switch",{"altText":1445,"config":1473},{"src":1447,"dataGaName":1448,"dataGaLocation":1443},{"altText":1445,"config":1475},{"src":1476,"dataGaName":1448,"dataGaLocation":1443},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1478,"mobileIcon":1483,"desktopIcon":1485},{"text":1479,"config":1480},"Back to pricing",{"href":1213,"dataGaName":1481,"dataGaLocation":1443,"icon":1482},"back to pricing","GoBack",{"altText":1445,"config":1484},{"src":1447,"dataGaName":1448,"dataGaLocation":1443},{"altText":1445,"config":1486},{"src":1451,"dataGaName":1448,"dataGaLocation":1443},{"title":1488,"titleMobile":1489,"button":1490,"config":1495},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1106,"config":1491},{"href":1492,"dataGaName":1493,"dataGaLocation":1494},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1496,"disabled":1043},"release",{"data":1498},{"text":1499,"source":1500,"edit":1506,"contribute":1511,"config":1516,"items":1521,"minimal":1731},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1501,"config":1502},"View page source",{"href":1503,"dataGaName":1504,"dataGaLocation":1505},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1507,"config":1508},"Edit this page",{"href":1509,"dataGaName":1510,"dataGaLocation":1505},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1512,"config":1513},"Please contribute",{"href":1514,"dataGaName":1515,"dataGaLocation":1505},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1517,"facebook":1518,"youtube":1519,"linkedin":1520},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1522,1569,1623,1667,1699],{"title":1211,"links":1523,"subMenu":1538},[1524,1528,1533],{"text":1525,"config":1526},"View plans",{"href":1213,"dataGaName":1527,"dataGaLocation":1505},"view plans",{"text":1529,"config":1530},"Why Premium?",{"href":1531,"dataGaName":1532,"dataGaLocation":1505},"/pricing/premium/","why premium",{"text":1534,"config":1535},"Why Ultimate?",{"href":1536,"dataGaName":1537,"dataGaLocation":1505},"/pricing/ultimate/","why ultimate",[1539],{"title":1540,"links":1541},"Contact Us",[1542,1545,1547,1549,1554,1559,1564],{"text":1543,"config":1544},"Contact sales",{"href":1395,"dataGaName":1074,"dataGaLocation":1505},{"text":1398,"config":1546},{"href":1400,"dataGaName":1401,"dataGaLocation":1505},{"text":1403,"config":1548},{"href":1405,"dataGaName":1406,"dataGaLocation":1505},{"text":1550,"config":1551},"Status",{"href":1552,"dataGaName":1553,"dataGaLocation":1505},"https://status.gitlab.com/","status",{"text":1555,"config":1556},"Terms of use",{"href":1557,"dataGaName":1558,"dataGaLocation":1505},"/terms/","terms of use",{"text":1560,"config":1561},"Privacy statement",{"href":1562,"dataGaName":1563,"dataGaLocation":1505},"/privacy/","privacy statement",{"text":1565,"config":1566},"Cookie preferences",{"dataGaName":1567,"dataGaLocation":1505,"id":1568,"isOneTrustButton":1046},"cookie preferences","ot-sdk-btn",{"title":1111,"links":1570,"subMenu":1579},[1571,1575],{"text":1572,"config":1573},"DevSecOps platform",{"href":1093,"dataGaName":1574,"dataGaLocation":1505},"devsecops platform",{"text":1576,"config":1577},"AI-Assisted Development",{"href":1100,"dataGaName":1578,"dataGaLocation":1505},"ai-assisted development",[1580],{"title":1581,"links":1582},"Topics",[1583,1588,1593,1598,1603,1608,1613,1618],{"text":1584,"config":1585},"CICD",{"href":1586,"dataGaName":1587,"dataGaLocation":1505},"/topics/ci-cd/","cicd",{"text":1589,"config":1590},"GitOps",{"href":1591,"dataGaName":1592,"dataGaLocation":1505},"/topics/gitops/","gitops",{"text":1594,"config":1595},"DevOps",{"href":1596,"dataGaName":1597,"dataGaLocation":1505},"/topics/devops/","devops",{"text":1599,"config":1600},"Version Control",{"href":1601,"dataGaName":1602,"dataGaLocation":1505},"/topics/version-control/","version control",{"text":1604,"config":1605},"DevSecOps",{"href":1606,"dataGaName":1607,"dataGaLocation":1505},"/topics/devsecops/","devsecops",{"text":1609,"config":1610},"Cloud Native",{"href":1611,"dataGaName":1612,"dataGaLocation":1505},"/topics/cloud-native/","cloud native",{"text":1614,"config":1615},"AI for Coding",{"href":1616,"dataGaName":1617,"dataGaLocation":1505},"/topics/devops/ai-for-coding/","ai for coding",{"text":1619,"config":1620},"Agentic AI",{"href":1621,"dataGaName":1622,"dataGaLocation":1505},"/topics/agentic-ai/","agentic ai",{"title":1624,"links":1625},"Solutions",[1626,1628,1630,1635,1639,1642,1646,1649,1651,1654,1657,1662],{"text":1155,"config":1627},{"href":1150,"dataGaName":1155,"dataGaLocation":1505},{"text":1144,"config":1629},{"href":1127,"dataGaName":1128,"dataGaLocation":1505},{"text":1631,"config":1632},"Agile development",{"href":1633,"dataGaName":1634,"dataGaLocation":1505},"/solutions/agile-delivery/","agile delivery",{"text":1636,"config":1637},"SCM",{"href":1140,"dataGaName":1638,"dataGaLocation":1505},"source code management",{"text":1584,"config":1640},{"href":1133,"dataGaName":1641,"dataGaLocation":1505},"continuous integration & delivery",{"text":1643,"config":1644},"Value stream management",{"href":1183,"dataGaName":1645,"dataGaLocation":1505},"value stream management",{"text":1589,"config":1647},{"href":1648,"dataGaName":1592,"dataGaLocation":1505},"/solutions/gitops/",{"text":1193,"config":1650},{"href":1196,"dataGaName":1197,"dataGaLocation":1505},{"text":1652,"config":1653},"Small business",{"href":1202,"dataGaName":1203,"dataGaLocation":1505},{"text":1655,"config":1656},"Public sector",{"href":1208,"dataGaName":1209,"dataGaLocation":1505},{"text":1658,"config":1659},"Education",{"href":1660,"dataGaName":1661,"dataGaLocation":1505},"/solutions/education/","education",{"text":1663,"config":1664},"Financial services",{"href":1665,"dataGaName":1666,"dataGaLocation":1505},"/solutions/finance/","financial services",{"title":1216,"links":1668},[1669,1671,1673,1675,1678,1680,1683,1685,1687,1689,1691,1693,1695,1697],{"text":1229,"config":1670},{"href":1231,"dataGaName":1232,"dataGaLocation":1505},{"text":1234,"config":1672},{"href":1236,"dataGaName":1237,"dataGaLocation":1505},{"text":1239,"config":1674},{"href":1241,"dataGaName":1242,"dataGaLocation":1505},{"text":1244,"config":1676},{"href":1246,"dataGaName":1677,"dataGaLocation":1505},"docs",{"text":1267,"config":1679},{"href":1269,"dataGaName":1270,"dataGaLocation":1505},{"text":1681,"config":1682},"What's new",{"href":1327,"dataGaName":1328,"dataGaLocation":1505},{"text":1262,"config":1684},{"href":1264,"dataGaName":1265,"dataGaLocation":1505},{"text":1281,"config":1686},{"href":1283,"dataGaName":1284,"dataGaLocation":1505},{"text":1289,"config":1688},{"href":1291,"dataGaName":1292,"dataGaLocation":1505},{"text":1294,"config":1690},{"href":1296,"dataGaName":1297,"dataGaLocation":1505},{"text":1299,"config":1692},{"href":1301,"dataGaName":1302,"dataGaLocation":1505},{"text":1304,"config":1694},{"href":1306,"dataGaName":1307,"dataGaLocation":1505},{"text":1309,"config":1696},{"href":1311,"dataGaName":1312,"dataGaLocation":1505},{"text":1314,"config":1698},{"href":1316,"dataGaName":1317,"dataGaLocation":1505},{"title":1330,"links":1700},[1701,1703,1705,1707,1709,1711,1715,1720,1722,1724,1726],{"text":1338,"config":1702},{"href":1340,"dataGaName":1332,"dataGaLocation":1505},{"text":1343,"config":1704},{"href":1345,"dataGaName":1346,"dataGaLocation":1505},{"text":1351,"config":1706},{"href":1353,"dataGaName":1354,"dataGaLocation":1505},{"text":1356,"config":1708},{"href":1358,"dataGaName":1359,"dataGaLocation":1505},{"text":1361,"config":1710},{"href":1363,"dataGaName":1364,"dataGaLocation":1505},{"text":1712,"config":1713},"Sustainability",{"href":1714,"dataGaName":1712,"dataGaLocation":1505},"/sustainability/",{"text":1716,"config":1717},"Diversity, inclusion and belonging (DIB)",{"href":1718,"dataGaName":1719,"dataGaLocation":1505},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1366,"config":1721},{"href":1368,"dataGaName":1369,"dataGaLocation":1505},{"text":1376,"config":1723},{"href":1378,"dataGaName":1379,"dataGaLocation":1505},{"text":1381,"config":1725},{"href":1383,"dataGaName":1384,"dataGaLocation":1505},{"text":1727,"config":1728},"Modern Slavery Transparency Statement",{"href":1729,"dataGaName":1730,"dataGaLocation":1505},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1732},[1733,1736,1739],{"text":1734,"config":1735},"Terms",{"href":1557,"dataGaName":1558,"dataGaLocation":1505},{"text":1737,"config":1738},"Cookies",{"dataGaName":1567,"dataGaLocation":1505,"id":1568,"isOneTrustButton":1046},{"text":1740,"config":1741},"Privacy",{"href":1562,"dataGaName":1563,"dataGaLocation":1505},[1743],{"id":1744,"title":7,"body":1042,"config":1745,"content":1747,"description":1042,"extension":1751,"meta":1752,"navigation":1046,"path":1753,"seo":1754,"stem":1755,"__hash__":1756},"blogAuthors/en-us/blog/authors/suri-patel.yml",{"template":1746},"BlogAuthor",{"name":7,"config":1748},{"headshot":1749,"ctfId":1750},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","suripatel","yml",{},"/en-us/blog/authors/suri-patel",{},"en-us/blog/authors/suri-patel","6uYSrzx-VYqO5jfherOjew8qtD9VYm7TE1H5W0GKC4I",[1758,1766,1774],{"title":1759,"description":1760,"heroImage":1761,"category":1038,"date":1762,"authors":1763,"slug":1765,"externalUrl":1042},"What's new in Git 2.55.0?","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1764],"Toon Claes","whats-new-in-git-2-55-0",{"title":1767,"description":1768,"heroImage":1769,"category":1038,"date":1770,"authors":1771,"slug":1773,"externalUrl":1042},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1772],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1775,"description":1776,"heroImage":1777,"category":1038,"date":1778,"authors":1779,"slug":1781,"externalUrl":1042},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[1780],"Patrick Steinhardt","whats-new-in-git-2-54-0",{"promotions":1783},[1784,1798,1810,1822],{"id":1785,"categories":1786,"header":1788,"text":1789,"button":1790,"image":1795},"ai-modernization",[1787],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1791,"config":1792},"Get your AI maturity score",{"href":1793,"dataGaName":1794,"dataGaLocation":1270},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1796},{"src":1797},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1799,"categories":1800,"header":1802,"text":1789,"button":1803,"image":1807},"devops-modernization",[1801,1607],"product","Are you just managing tools or shipping innovation?",{"text":1804,"config":1805},"Get your DevOps maturity score",{"href":1806,"dataGaName":1794,"dataGaLocation":1270},"/assessments/devops-modernization-assessment/",{"config":1808},{"src":1809},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1811,"categories":1812,"header":1814,"text":1789,"button":1815,"image":1819},"security-modernization",[1813],"security","Are you trading speed for security?",{"text":1816,"config":1817},"Get your security maturity score",{"href":1818,"dataGaName":1794,"dataGaLocation":1270},"/assessments/security-modernization-assessment/",{"config":1820},{"src":1821},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1823,"paths":1824,"header":1827,"text":1828,"button":1829,"image":1834},"github-azure-migration",[1825,1826],"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":1830,"config":1831},"See how GitLab compares to GitHub",{"href":1832,"dataGaName":1833,"dataGaLocation":1270},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1835},{"src":1809},{"header":1837,"blurb":1838,"button":1839,"secondaryButton":1844},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1840,"config":1841},"Get your free trial",{"href":1842,"dataGaName":1069,"dataGaLocation":1843},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1543,"config":1845},{"href":1395,"dataGaName":1074,"dataGaLocation":1843},1786734915104]