Git to the point - Git aliases.
Tags: productivity, git, terminal
Published: 2022-06-26 18:03:28

As a dev, Git is just one of those things you'll interact with daily. But I'm sure you've all been there, where you can't remember those commands or it just gets a bit monotonous typing in the same long commands over and over again. 

Well, this is where Git aliases can come in handy. 

## What is a Git Alias?

A git alias is a shorthand version of a command / custom command defined by yourself, which then in turn runs the real command. This make remembering those git commands less important, and I can guarantee it will make your day to day development a lot easier, and more efficient.

## How to add git aliases?

This is quite simple. There are a couple of ways, but for me the easiest is simply to open up your terminal and enter the following command to edit your global Git config. Not only is this easier because you're able to add them in your editor of choice, but it also means that you have more space to view all your aliases. 
You **can **add them via the terminal directly but I feel the syntax / view can be cumbersome (especially with more complex aliases).

How you'd do it in the terminal:
```
git config --global alias.co checkout
```

### My preferred way
But this tutorial is going to show you how to do it via my preferred way, via the Git config and editor.

```terminal
git config --global --e
```

This will open up your git config.

Once you have your editor open you can add an alias with the following code (you may see an alias section already there).

```
[alias]
    co = checkout
```
This is just an example, but this will create an alias of `co` which in turn will be like running `git checkout`. 
You can add your branch name in just the same way, like so:

```
git co feature/making-aliases
```

## Ok - Let's look at some of my favs and most used

_Alias Setup:_
```
tidy-up = !git branch | grep -v "main" | xargs git branch -D
```

This is one of my favs, although I don't use it very regularly (I should though). How this works is simple, it will run 
`git branch ` which will return the list of local branches. It will then utilise the pipe mechanic (which in simplest terms will pass the result to the next command). 

So we pass the branches to 
`grep -v "main"` which will search the branch names, but the `-v` will exclude the branch `main`. 

It then passes these to the next command (xargs coverts input to a command argument) to the `git branch -D`, (the delete branch command).  

## Git Status 

_Alias Setup:_
```
s = status 
```
Get the status of your current branch, it lets you see which changes have been staged, which haven't, and which files aren't being tracked by Git.


## Git Latest  

_Alias Setup:_
```
latest = !git checkout main && git pull
```
This alias is very handy when u want to make sure your main branch is up to date before branching off, or if you need to check a bug on the main branch.

simply call `git latest` and then bam! you have the latest main code.

## Git Checkout

_Alias Setup:_
```
co = checkout
```
This is just a quicker, nicer way of checking out a branch. 

_Usage:_
`git co <branchName>` ie. `git co bug/defect101`

## Git checkout branch

Following on from git checkout, this goes a little further to create a new branch from the current branch

_Alias Steup:_
```
cob = checkout -b
```
_Usage:_
`git cob feature/new-feature`

## Git New-Work

I created this alias 'cos I was tired of having to go get main, git pull, and then branch off of the latest main.

_Alias Setup:_
```
  new-work = !git checkout main && git pull && git checkout 
```

This will pull the latest code of the main branch, and create a new branch with the given name.

_Usage:_

`git new-work bug/fix-issue`

Isn't that a lot quicker / easier?

## Git Branch - with a twist:

_Alias Setup:_

```
br = branch --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(contents:subject) %(color:green)(%(committerdate:relative)) [%(authorname)]' --sort=-committerdate
```

Let's take a look at what this is doing.. this will

List all branches, 
Branch name first
name of last commit
then how many days since the last commit & author name in green text
Ordering the list by most recently committed.


_Usage:_
`git br`

_Output:_
It will output something like this:
![Image of coloured branch details in terminal](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/blqvattwx4m4na52ksge.png)
 

### Git Save

This is another time-saver, where you just want to get everything you've worked on committed, tracked and untracked.

```
save = !git add -A && git commit
```
This simply stages all the untracked and tracked changes. Then commits the changes without a message, which will cause your chosen git editor to open, allowing you to add a commit message + optional description.

You could also add another variation of this with:

```
saveM = !git add -A && git commit -m
```
This is just like the `git save` but requires you to provide a commit message.

### Git Done!

Ever been in that situation where you've gone to push your code and you get the prompt there's no remote branch and you see a message saying to use the command

`git push --set-upstream origin <branchName>`

Well, you can bypass this using the following git alias:

```
done = !git push -u origin HEAD
```
This will push the current branch with the branch name to the origin (remote server).  

so by the end, your git config could look something like this:

```
[alias]
    co = checkout
    cob = checkout -b
    s = status
    tidy-up = !git branch | grep -v "main" | xargs git branch -D
    latest = !git checkout main && git pull
    new-work = !git checkout main && git pull && git checkout  
    done = !git push -u origin HEAD
    save = !git add -A && git commit
    saveM = !git add -A && git commit -m
    br = branch --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(contents:subject) %(color:green)(%(committerdate:relative)) [%(authorname)]' --sort=-committerdate

```

## What do the symbols in the commands do?

`&&` - This simply chains commands together, but the right side command will only run if the left side doesn't occur any errors.

`|` - This will pass the output of the previous command to the right-side command.

Why do some of the alias have `!` in front of them and others do not?

Well, adding an exclamation mark (!) at the beginning is letting the terminal know that it's running a full shell command, not a git subcommand such as (checkout, status etc). Ones that don't have the exclamation mark are a "sub-command" (pre-existing) of git.

The alias is replaced by its definition following the git command. Anything after the alias on the command line comes after the definition


I hope this was helpful, and you've learnt something from it all -- go forth and Git it done :-) -- always if you want to chat, or discuss drop feedback in the comments, or follow me on [twitter](https://twitter.com/gweaths).