📅 2016-Aug-11 ⬩ ✍️ Ashwin Nanjappa ⬩ 🏷️ git, merge, squash ⬩ 📚 Archive
Merge is a common operation in Git to merge the changes in another branch to the current branch.
Here is an example, where we checkout the master
branch and merge a feature_branch
to it:
$ git checkout master
$ git merge feature_branch
$ git commit
In the images above we can see that the two branches are actually merged together in the directed acyclic graph (DAG) with an edge. After this, the git log
for master
will show all the commits that are in feature_branch
too in addition to the commits in master
.
There might be cases where you do not want to actually merge the two branches. Maybe you just want a single commit on master
that has all the changes that would have been merged from feature_branch
. Note that this is different from git rebase
since that replays all the multiple commits of feature_branch
on master
.
The answer to this is git merge --squash
. This command effectively changes the files such that they would be after a git merge
. However, there would be no link between master
and feature_branch
after this commit is committed.
To merge with squash in the above scenario:
$ git checkout master
$ git merge --squash feature_branch
$ git commit
When you commit you will see that Git inserts a default commit message that says Squashed commit of the following
and lists all the commits from feature_branch
that are squashed into this commit. You can delete this commit message and create your own of course.
The pictorial depiction of this operation above shows that there is no link between the two branches after this merge. When you do git log
no one can see the multiple commits of feature_branch
. You can even safely delete feature_branch
if you want to after this operation.
Tried with: Git 2.9.0 and Ubuntu 16.04