https://softwaredoug.com/blog/2022/11/09/idiot-proof-git-aliases.html [hea] Doug Turnbull * Home back home Idiot proof git November 9th, 2022 I'm an idiot. And git is hard. A lot of places use a rebase-based Git workflow, and I've made git less hard with a set of handy aliases. Put these in your ~/.gitconfig and turn git into an actually less painful command line tool to use. [alias] # ********************* # Rebase workflow mainbranch = "!git remote show origin | sed -n '/HEAD branch/s/.*: //p'" synced = "!git pull origin $(git mainbranch) --rebase" update = "!git pull origin $(git rev-parse --abbrev-ref HEAD) --rebase" squash = "!git rebase -v -i $(git mainbranch)" publish = push origin HEAD --force-with-lease pub = publish Here's documentation for these idiot-proof git aliases. Publish your branch's changes to the world The publish (abbrev pub) command publishes your changes to your branch Github. If other changes have been posted by another user to Github, then changes will be rejected. You should update first to incoroporate their changes and resolve any conflicts. git publish git pub Under the hood this is a force push with lease to your branch at origin. Sync your branch with main / master from Github The synced command will get your local branch up to date with your main branch (main or master) at origin (ie Github). git synced Under the hood, this fetches main or master from origin and performs a rebase, replaying your commits on top of the tip of main or master. Update your branch with Github's copy of your branch If your local branch gets out of date with origin's version of your branch, then do an update. This would happen if you're collaborating on the branch with a colleague and need to get up to date. git update Under the hood, this fetches origin/your-branch and performs a rebase . Squash commits Prior to merging, you likely want to shrink your branch's many noisy commits to one or two meaningful ones. That's what squash command does, giving you a chance to rewrite the branch's history. git squash Under the hood, this is an interactive rebase. Other useful commands * git pr -> Open this PR at github.com * git hub -> Open this repo at github.com * git amend -> Alias for git commit --amend * git ammend -> How I always misspell 'amend', also alias for git commit --amend # ******************** # My dumbass typos ammend = commit --amend amend = commit --amend # ********************* # Github # From - https://salferrarello.com/git-alias-open-pull-request-github/ pr = "!f() { \ open \"$(git ls-remote --get-url $(git config --get branch.$(git rev-parse --abbrev-ref HEAD).remote) \ | sed 's|git@github.com:\\(.*\\)$|https://github.com/\\1|' \ | sed 's|\\.git$||'; \ )/compare/$(\ git config --get branch.$(git rev-parse --abbrev-ref HEAD).merge | cut -d '/' -f 3- \ )?expand=1\"; \ }; f" hub = "!f() { \ open \"$(git ls-remote --get-url \ | sed 's|git@github.com:\\(.*\\)$|https://github.com/\\1|' \ | sed 's|\\.git$||'; \ )\"; \ }; f" For simplicity, I use "Github" here to refer to the origin remote, but replace whatever your Github with whatever your origin is. The exception being git pr and git hub commands. Similarly I use main as the trunk/main/master. But both main and master are supported. --------------------------------------------------------------------- [headshot2] Doug Turnbull More from Doug Doug's ML Powered Search course Doug's articles at OpenSource Connections | Shopify Eng Blog --------------------------------------------------------------------- --------------------------------------------------------------------- (c) 2022 Doug Turnbull