Create a shortcut
To save yourself a bit of typing you can create a Git Alias for frequently used commands, e.g.
git config --global alias.create-branch 'checkout -b'
I can now type something like
git create-branch git-aliases
and I will create and switch to a new branch called git-aliases.
Under the hood, git has updated my .gitconfig and added an alias section as follows
[alias]
create-branch = checkout -b
Get the name of the current branch
I can never remember the syntax for getting the name of the current branch:
git config --global alias.current-branch 'rev-parse --abbrev-ref HEAD'
So now git current-branch will return the name of the current branch.
Chaining commands
Of course this in and of itself is of limited use except for shortening common commands or giving them more memorable names.
However, if you add a ! at the beginning of your alias you are telling git to start a Shell where you can start using bash.
-
Committing everything
I pretty much always want to commit all of my unstaged files - otherwise how do I know if I’ve missed something crucial from my commit?
git config --global alias.commit-all '!git add -A && git commit -m'I can now type, e.g.
git commit-all "add a commit-all alias".Git will expand the command in place so that anything I type after the alias is treated as part of the command. In the above example it’s as though I had typed
commit -m "my commit message". -
Cleaning up and starting afresh
When I’ve finished working on a branch I want to go back to
master, get latest and clean up any stray non-tracked files.git config --global alias.get-clean-master '!git checkout master && git pull && git clean -xfd -e .vs/'Usage
git get-clean-master.Note the
-e .vs/ignores a folder Visual Studio takes an exclusive lock on, so some files cannot be deleted without closing Visual Studio. Omit this part if you don’t use Visual Studio. -
Getting latest from
masterinto branchWhen I’m working in a branch and someone has updated
masterI want to pull their changes in to my branch.The simplest way to do that is with
git config --global alias.get-latest '!git fetch origin && git merge origin master'Then
git get-latestwill fetch the latest changes fromoriginand merge them into my branch. The problem with this approach is that my local copy ofmasteris still behindorigin, so when I switch back I’ll still need to update.To make sure my local
masteris updated with the changes too, a more complex command is.git config --global alias.get-latest '!branch=$(git current-branch) && git checkout master && git pull && git checkout $branch && git merge master --no-edit'So now, from a branch you can type
git get-latestand it will switch tomaster, do agit pull, switch back to your branch merging frommasterand accepting the default commit messageNote how we have managed to reuse our earlier alias
git current-branch. Nice!Note also the use of single
'quotes above. If I had used double"quotes thengitwould have evaluated what’s inside the double quotes, i.e. the$(git current-branch)and$branch. At the point of execution (i.e. when creating the alias) they would have evaluated tonulland I would have got unexpected blank spaces. -
Setting Upstream when pushing
I invariably forget to set the upstream when creating a new local branch, so I can do
git config --global alias.push-branch '!branch=$(git current-branch) && git push -u origin $branch'and now
git push-branchwill automatically set the upstream when I push a branch. -
Starting a GitHub Pull Request
When you’ve finished working on your branch and you want to create a Pull Request:
git config --global alias.pull-request '!branch=$(git current-branch) && git remote get-url origin | sed \"s/\.git$/\/pull\/new\/$branch/\" | start $(cat)'Usage
git pull-requestThis will assemble the correct
GitHubURL to create a Pull Request and launch it in the default browser. Caveat this is only tested on Windows! -
Starting a BitBucket Pull Request
The version of the above for BitBucket is:
git config --global alias.pull-request '!branch=$(git current-branch) && git remote get-url origin | sed \"s/:/\//\" | sed \"s/git@/https:\/\//\" | sed \"s/\\.git$/\/pull-requests\/new?source=$branch/\" | start $(cat)' -
Starting a GitLab Merge Request
The version of the above for GitLab is:
git config --global alias.merge-request '!branch=$(git current-branch | sed \"s/\//%2f/g\") && git remote get-url origin | sed \"s/\.git$//\" | sed \"s/$/\/-\/merge_requests\/new?merge_request%5Bsource_branch%5D=/\" | sed \"s|$|${branch}|\" | start $(cat)'Note that handily GitHub and GitLab use different names Pull- and Merge- request so you can have both commands globally if you happen to use both.
For more information, check out this excellent article from Phil Haack
git
productivity
]