belly: Improving Git's Command Line User Experience
Tags: git, productivity, development
Published: 2019-03-03 19:34:04

---
title: "belly: Improving Git's Command Line User Experience"
published: true
tags: git, productivity, development 
canonical_url: https://www.kahlillechelt.com/2018/08/08/belly-improving-gits-command-line-user-experience/
---

My preferred way to use Git is on the command line. I have a set of Git command sequences that I use all the time and that I know by heart but are a nuisance to type out every time and a set of command sequences that I need regularly but have to look up all the time. In order to improve my personal Git user experience I created [_belly_](https://github.com/kahlil/belly).

belly is a cli-tool that provides a better user experience for some common Git command sequences:

## Commit & Push

When working on a personal project or on a feature branch within GitHub Flow, I do this all the time:

```
git commit -m "my commit message"
git push
```

That’s a lot of typing for something I do tens of times a day.

belly combines this into one command:

```
belly c my commit message
```

_Tip: instead of typing `belly` you can just type `b`._

## Git Checkout Branch Or Create And Checkout

I create branches for features, bug fixes and hot fixes all the times. I also often have to switch between branches.

belly combines switching and creating-and-switching into one command. So instead of:

```
git checkout my-branch
```

or

```
git checkout -b my-branch
```

I can just do:

```
belly s my-branch
```

belly will switch to `my-branch` if it exists and it will create-and-switch to`my-branch` if it doesn’t exist yet.

## Set And Delete Tags Locally And On Remote

When you set a version tag you typically want it set in the local and the remote repository. belly allows you to do that with:

```
belly t v1.0.0
```

belly can also delete those tags for you:

```
belly t v1.0.0 -d
```

## Rename A Branch Locally And Remote

This is one of those Git commands I always have to look up. How do I rename a branch again and why is the command to rename it on the server so different?

Anyway, no need to break out Google for that anymore. Just:

```
belly n my-new-branch-name
```

and it will rename your local branch as well as the corresponding remote branch for you.

## Easy Squashing

There are a couple ways to squash your feature branch commits. If you want to squash everything down to master and add a commit message you can use belly’s`q` command:

```
belly q my commit message
```

## Force-Push The Right Way

When you work with rebasing and squashing in order to keep your Git history legible you have to force-push in your feature branches regularly. Rather than using `--force-push` it is recommended to use `--force-push-with-lease` which is an awkwardly named flag that does not allow you to force-push if the remote branch has been updated by somebody else. This should be the default.

With belly you can use:

```
belly p
```

To force-push-with-lease your current branch state.

If you think any of these convenience methods would be useful to you, feel free to [get belly](https://github.com/kahlil/belly). PRs are welcome, if discussed previously in an issue.

I will be improving belly over time and add more features if I think it would be useful.