{"id":49762029,"url":"https://github.com/coder11125/oh-my-git","last_synced_at":"2026-05-14T12:01:20.301Z","repository":{"id":356476736,"uuid":"1232505420","full_name":"coder11125/oh-my-git","owner":"coder11125","description":"OMG: \"Because Git is powerful... and power corrupts absolutely\" – The version control upgrade for humans who hate cryptic, nerd errors. (Git only)","archived":false,"fork":false,"pushed_at":"2026-05-12T05:41:57.000Z","size":125,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-12T10:41:41.295Z","etag":null,"topics":["bash","cli","git","nodejs","npm","typescript"],"latest_commit_sha":null,"homepage":"https://ohmygit-ebon.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coder11125.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T02:05:50.000Z","updated_at":"2026-05-12T05:42:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/coder11125/oh-my-git","commit_stats":null,"previous_names":["coder11125/oh-my-git"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/coder11125/oh-my-git","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder11125%2Foh-my-git","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder11125%2Foh-my-git/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder11125%2Foh-my-git/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder11125%2Foh-my-git/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coder11125","download_url":"https://codeload.github.com/coder11125/oh-my-git/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder11125%2Foh-my-git/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32979305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T06:31:55.726Z","status":"ssl_error","status_checked_at":"2026-05-13T06:31:51.336Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","cli","git","nodejs","npm","typescript"],"created_at":"2026-05-11T09:54:47.774Z","updated_at":"2026-05-14T12:01:20.272Z","avatar_url":"https://github.com/coder11125.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Oh My Git (`omg`)\n\n\u003cdiv style=\"text-align: center;\"\u003e\n  \u003cimg width=\"700\" height=\"400\" alt=\"Oh-My-Git\" src=\"https://github.com/user-attachments/assets/ec43e95c-538f-4d78-996b-2d4424942f03\" /\u003e\n\u003c/div\u003e\n\n---\n\u003e *Because git is powerful... and power corrupts absolutely.*\n\n`omg` is a friendly CLI wrapper that translates git's cryptic error messages into human speak. Built with [commander](https://github.com/tj/commander.js), [simple-git](https://github.com/steveukx/git-js), [chalk](https://github.com/chalk/chalk), and [ora](https://github.com/sindresorhus/ora)\n\n## Why omg?\n\nLet's be honest: git is a time machine with a interface designed by someone who hates you. \n\n- `fatal: not possible to fast-forward, aborting` → *What?!*\n- `error: Your local changes would be overwritten by merge` → *But I just wanted to...*\n- `CONFLICT (content): Merge conflict in src/index.js` → *Why does this always happen on Friday?!*\n\n`omg` wraps all that angst into simple, friendly commands. It won't make git less confusing, but at least you'll have a friendlier error message to laugh at while you cry.\n\n## Install\n\nInstall globally from npm:\n\n```bash\nnpm install -g @coder11125/omg\n```\n\nThat exposes the `omg` binary on your `PATH`.\n\n## Usage\n\n### Commit\n\nStage all changes and commit in one step. Git makes this two commands because... reasons:\n\n```bash\nomg -c \"message\"\n```\n\n\u003e 💡 Pro tip: If you forget the `-m` flag with regular git, you get thrown into Vim. `omg` won't do that to you. You're welcome.\n\n### Checkout\n\nSwitch to an existing branch. Regular git uses `git checkout` which also restores files, detaches HEADs, and probably makes toast if you ask nicely. `omg` just switches branches:\n\n```bash\nomg --visit \u003cbranch\u003e\n```\n\n### Status\n\nShow a friendly summary of the current repository state. Unlike `git status`, which looks like a novel by Stephen King:\n\n```bash\nomg status\n```\n\n\u003e No more reading 47 lines to figure out if you're on main or master. We just tell you.\n\n### Branch management\n\nGit branches are like multiverse theory: cool in concept, terrifying when you have 47 of them and no idea where you are.\n\n```bash\nomg branch                     # list all local branches (* marks current)\nomg branch -n \u003cname\u003e           # create a new branch (stay on current)\nomg branch -n \u003cname\u003e -s      # create and switch to it\nomg branch -d \u003cname\u003e           # delete a branch (must be fully merged)\n```\n\n### Remote management\n\n```bash\nomg remote                     # list all remotes\nomg remote \u003curl\u003e               # add a new remote named \"origin\"\nomg remote \u003curl\u003e \u003cname\u003e        # add a new remote with a custom name\n```\n\n### Push\n\nShare your code with the world (or your team, or just your future self wondering what you were thinking).\n\n```bash\nomg push                       # push current branch to its upstream remote/branch\nomg push \u003cremote\u003e              # push to specific remote\nomg push origin -u main        # set upstream branch while pushing\nomg push -f                    # force push with lease (safer)\n```\n\n\u003e ⚠️ `-f` is `--force-with-lease`, not nuclear `--force`. We're trying to prevent \"git push origin main --force\" horror stories.\n\n### Pull\n\nDownload changes from remote. The `-r` flag uses rebase, which keeps history linear because merge commits are like littering in your git log:\n\n```bash\nomg pull                       # pull from upstream\nomg pull \u003cremote\u003e              # pull current branch from specific remote\nomg pull -r                    # pull with rebase (cleaner history)\n```\n\n### Merge\n\nCombine branches. Squash merging is like stuffing all your messy commits into one neat package so nobody knows how many times you \"fixed the fix\":\n\n```bash\nomg merge \u003cbranch\u003e             # merge branch into current\nomg merge \u003cbranch\u003e --squash    # squash merge (hide the evidence)\nomg merge --abort              # abort ongoing merge (panic button)\n```\n\n### Rebase\n\nRebasing: for when you want to rewrite history like a politician. \"I definitely wrote this feature in one perfect commit.\"\n\n```bash\nomg rebase \u003cbranch\u003e            # rebase current onto branch\nomg rebase --continue          # continue after resolving conflicts\nomg rebase --abort             # abort rebase (we've all been there)\n```\n\n### Stash\n\nStash: git's \"hide your mess in the closet\" feature. Your stashes will eventually become a time capsule of code you forgot existed.\n\n```bash\nomg stash                      # stash current changes (sweep under rug)\nomg stash pop                  # pop most recent stash (hope you remember what's in there)\nomg stash list                 # list all stashes (your abandoned children)\nomg stash drop 0               # drop stash at index 0 (let go of the past)\nomg stash apply 0              # apply stash but keep it ( commitment issues)\n```\n\n### Log\n\nView commit history with pretty formatting. Finally, a log you can actually read without your eyes bleeding:\n\n```bash\nomg log                      # show last 10 commits\nomg log -n 20                # show last 20 commits (journey into the past)\nomg log --oneline            # condensed format (for the lazy)\nomg log -n 5 --oneline       # last 5, one-line (just the highlights)\n```\n\n### Visualize\n\nSee the multiverse of branches in all its glory. Perfect for when you've merged so many things you're not sure which reality you're in anymore:\n\n```bash\nomg visualize                # show a visual branch tree (the spaghetti detector)\n```\n\n\u003e 💡 Use this to see how your feature branches relate to main without needing a PhD in graph theory.\n\n### Diff\n\nReview changes before committing. Because \"I don't know what I changed\" is not a valid excuse at standup:\n\n```bash\nomg diff                     # show unstaged changes (the \"oops\" detector)\nomg diff --staged            # show staged changes (what you're about to regret)\nomg diff src/index.ts        # show changes for specific file\n```\n\n### Blame\n\nFind out who broke that line of code. Perfect for passive-aggressive code reviews:\n\n```bash\nomg blame \u003cfile\u003e             # show line-by-line authorship\nomg blame \u003cfile\u003e -L 42       # show blame for specific line only\nomg blame \u003cfile\u003e --stats     # show author statistics with heatmap\n```\n\n\u003e 💡 Pro tip: Use `--stats` to see who really owns the file. Spoiler: it's probably you from 3 years ago wondering \"what was I thinking?\"\n\n### Clone\n\nMake a local copy of someone else's beautiful disaster:\n\n```bash\nomg clone \u003curl\u003e              # clone to default directory\nomg clone \u003curl\u003e my-project     # clone to custom directory\n```\n\n### Ship\n\n🚢 **It. Just. Works.** \n\nOne command to rule them all: stage → commit → fetch → rebase → push. For when you're tired of typing the same 5 commands in a row.\n\n```bash\nomg ship \"fix: handle null pointer\"     # commit and ship\nomg ship                                # just sync and push (trust the process)\nomg ship -n                             # dry run - see what would happen\nomg ship --no-rebase                    # use merge instead of rebase\n```\n\nShip automatically:\n- Stages uncommitted changes (even that console.log you forgot)\n- Commits with your message (or judges you if you don't provide one)\n- Fetches from remote (so you know if someone broke main)\n- Rebases if you're behind (because merge bubbles are gross)\n- Pushes to origin (send it!)\n- Shows PR URL hint for GitHub remotes (you're welcome)\n\n### Oops\n\nWe all make mistakes. Git makes recovering from them feel like solving a Rubik's cube blindfolded. `omg oops` is your \"undo\" button for life:\n\n```bash\nomg oops                      # show recovery menu (the panic room)\nomg oops uncommit             # undo last commit, keep changes (take-backsies)\nomg oops discard              # undo last commit, discard changes (nuclear option)\nomg oops unstage              # unstage all staged files (stage fright)\nomg oops unadd src/index.ts   # unstage specific file (partial regret)\nomg oops restore-branch       # recover deleted branches (Lazarus mode)\n```\n\n### Sync\n\nThe \"I just want to get back to main, pull, and go back to my branch without typing 47 commands\" command:\n\n```bash\nomg sync                      # sync with main (full journey: stash → checkout → pull → prune → return → pop)\nomg sync -b develop           # sync with a different base branch\n```\n\nSync does the hokey pokey:\n- Stashes your mess (so it's safe)\n- Switches to main (the promised land)\n- Pulls latest (catch up on gossip)\n- Prunes dead branches (spring cleaning)\n- Returns to your feature branch (back to reality)\n- Restores your stashed mess (welcome home)\n\n### Doctor\n\nGit checkups: because prevention is better than \"why is my repo on fire?!\"\n\n```bash\nomg doctor                    # run health checks\nomg doctor --fix              # auto-fix issues where safe\n```\n\nDoctor checks for:\n- Uncommitted changes (your \"I'll finish this later\" pile)\n- Staged but uncommitted files (the forgotten middle child)\n- Branch behind/ahead status (are you lost?)\n- No remote configured (coding into the void)\n- Merge/rebase in progress (unfinished business)\n- Detached HEAD state (you've gone full zombie)\n- Binary files in commits (why is your .zip file 100MB?)\n- Accumulating stashes (digital hoarding is still hoarding)\n\n### Combine flags\n\nFlags can be combined in a single invocation, e.g. commit then switch:\n\n```bash\nomg -c \"wip: refactor\" --visit feature/new-thing\n```\n\n### Other\n\n```bash\nomg --help        # show help\nomg --version     # show version (also -V)\nomg --verbose     # show detailed error output (show nerd errors)\n```\n\n### Update\n\nSelf-improvement for your CLI:\n\n```bash\nomg update       # check for updates (be better than yesterday)\n```\n\n### Init\n\nStart a new git repository. The first step on a long journey of merge conflicts:\n\n```bash\nomg init                    # initialize in current directory\nomg init my-project         # initialize in new directory\nomg init -m \"Initial commit\" # initialize with first commit\n```\n\n### Tag\n\nMark important moments in history. Like \"v1.0.0\" (aka \"it barely works but marketing wants a release\"):\n\n```bash\nomg tag                     # list all tags (milestones)\nomg tag v1.0.0              # create lightweight tag\nomg tag v1.0.0 -m \"Release\"  # create annotated tag (fancy!)\n```\n\n### Fetch\n\nCheck what your coworkers broke while you were sleeping:\n\n```bash\nomg fetch                   # fetch from all remotes (the gossip gatherer)\nomg fetch origin            # fetch from specific remote\n```\n\n### Reset\n\nTime travel with varying degrees of danger:\n\n```bash\nomg reset                   # unstage files (the \"oops\" fix)\nomg reset --soft            # keep changes staged (gentle)\nomg reset --hard            # discard all changes (point of no return ⚠️)\n```\n\n\u003e ⚠️ `--hard` is called that for a reason. There's no undo button for this one.\n\n### Revert\n\nUndo a commit the *right* way (by making a new commit that undoes it). Unlike `reset`, this won't get you fired:\n\n```bash\nomg revert \u003ccommit\u003e         # revert a commit (professional take-backsies)\nomg revert --continue       # continue after resolving conflicts\n```\n\n### Cherry-pick\n\nSteal a commit from another branch. It's not really stealing if it's version control:\n\n```bash\nomg cherry-pick \u003ccommit\u003e    # apply commit from another branch (borrowed code)\nomg cherry-pick --continue  # continue after resolving conflicts\n```\n\n### Config\n\nGet or set git configuration:\n\n```bash\nomg config user.name         # get current value\nomg config user.name \"John\"  # set value\n```\n\n### Social\n\nSee who's contributing to your repository (and who's doing all the work):\n\n```bash\nomg social                   # show contributor statistics\n```\n\nShows:\n- All contributors with commit counts and percentages\n- \"Most helpful human\" award for top contributor\n- Humorous commentary about collaboration patterns\n\n\u003e 💡 Perfect for passive-aggressive code reviews or just satisfying your curiosity about who actually owns the codebase.\n\n### Spinner quips\n\nWhile `omg` waits on git, loading spinners pick a **random one-liner** from a category that matches what you are doing (push, stash, ship, doctor, and so on). The silly bit is followed by a dim **`·`** and the **real task** so you still know what is happening:\n\n```bash\n$ omg status\n⠋ Taking emotional inventory · Analyzing repository status\n```\n\nQuips live in [`src/quips.ts`](src/quips.ts) if you want to add your own trauma.\n\n### Verbose Mode (For the Curious)\n\nBy default, `omg` speaks human. When git throws a tantrum, we translate:\n\n```bash\n$ omg push\n✖ Push failed\n(OMG) 🤓 Nerd Error hidden: Run omg push -u origin main to solve it\n```\n\nBut maybe you're a purist and want to see the raw git error. We support that too:\n\n```bash\n$ omg push --verbose\n✖ Push failed\n(OMG) 🤓 Nerd Error hidden: Run omg push -u origin main to solve it\n\nDetails:\nfatal: The current branch main has no upstream branch.\nTo push the current branch and set the remote as upstream, use\n    git push --set-upstream origin main\n\nTo have this happen automatically for branches without a tracking\nupstream, see 'push.autoSetupRemote' in 'git help config'.\n```\n\nUse `--verbose` when you want to see git's full essay:\n\n```bash\nomg status --verbose        # show detailed error output\nomg push --verbose          # show full git error messages\nomg --verbose -c \"message\"  # combine with other commands\n```\n\n\u003e 🤓 Fun fact: Git error messages were originally written to fit on punch cards. That's why they're so... concise.\n\n## Development\n\n```bash\nnpm install\nnpm run build            # compile TypeScript -\u003e dist/\nnpm run typecheck        # type-check without emitting\n\n# try the CLI locally without publishing\nnpm link\nomg --help\n```\n\n## Philosophy\n\n\u003e \"Git is a tool that lets you confidently delete code on Monday, regret it on Tuesday, and find it again on Wednesday. `omg` just makes the emotional rollercoaster more bearable.\"\n\nRemember: `omg` won't make you a better developer. But it might make you a happier one. And isn't that what really matters?\n\n**Pro tip:** If you ever feel overwhelmed by git, just remember: Linus Torvalds created git in 2005 because existing tools weren't painful enough. You're not the problem. Git is the problem.\n\n## 🤝 Contributors\n\nThank you to all the amazing people who have helped build oh-my-git! \n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoder11125%2Foh-my-git","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoder11125%2Foh-my-git","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoder11125%2Foh-my-git/lists"}