How to use "git merge --squash" while preventing regular commits using git hooks

573 Views Asked by At

I would like to prevent commits to master using a local commit hook as per the answer at https://stackoverflow.com/a/40465455/329496

That works fine as I can now merge changes on feature branches into master:

git merge feature_branch

I actually want to use squash merges so that finished features land as a single commit on master:

git merge --squash feature_branch

That doesn't actually merge it creates the squashed changes as modified files in my index. I then have to commit those index changes yet I have disabled commits to master.

Is there a way to prevent commits to master and also ensure work merged from feature branches is squashed automatically?

1

There are 1 best solutions below

0
On

In this situation, Git doesn't know the difference between a commit on master that is of the kind you want (a merge squash) and the kind you don't want (everything else). There really isn't a way to do this with plain Git, although various hosting platforms (e.g. GitHub and GitLab) offer this as an option for pull requests.

However, there is a workaround. You can create another branch (say, master-merge) by running git checkout -B master-merge master and perform the squash there, then fast-forward to master by using git merge --ff-only master-merge while on master. Then no actual commits are made on master, only fast forwards.