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?
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 runninggit checkout -B master-merge master
and perform the squash there, then fast-forward tomaster
by usinggit merge --ff-only master-merge
while onmaster
. Then no actual commits are made onmaster
, only fast forwards.