# Git alias for squashing experimental commits

With git, it is possible to commit several times in one branch, then squash those commits together when merging into another branch. I most often use this workflow for experimental work. I'll have a feature branch which is what I will create a pull request from, so I want it to have a clean commit history. I want to avoid lots of commits saying things like 'tried a different approach', 'third attempt', 'might be working this time'. (I'm sure we've all seen commits like that before!)

I create a new branch from my feature branch. This is where I will put my experimental commits, which will be squashed into a single commit on my feature branch. Let's say my feature branch is called `feature` and I've created an experimental branch `experiments`. 

I have the following alias in my `.gitconfig`:

```.gitconfig
squash = "!f() { BRANCH=`git symbolic-ref --short HEAD`; git checkout ${1}; git merge --squash $BRANCH; }; f"
```

I can use this alias while I'm on my `experiments` branch. I just run `git squash feature`, and it will squash all the commits and leave me on the `feature` branch with a load of uncommitted code. I can then review and commit the changes as a single commit, with a new commit message.

This alias was inspired by an answer on [Stack Overflow](https://stackoverflow.com/a/37209562/4051181).
