|## within current branch, squashes all commits that are ahead of master down into one|
|## useful if you merged with upstream in the middle of your commits (rebase could get very ugly if this is the case)|
|## commit any working changes on branch "mybranchname", then...|
|git checkout master|
|git checkout -b mybranchname_temp|
|git merge --squash mybranchname|
|git commit -am "Message describing all squashed commits"|
|git branch -m mybranchname mybranchname_unsquashed|
|git branch -m mybranchname|
|## optional, not recommended if you want to keep the unsquashed history around for a bit longer|
|git branch -D mybranchname_unsquashed|
|## if squashing already-pushed commits...|
|git push --force|
Aug 5, 2016
I used for three years. Scott! you are the best!
Nov 30, 2016
Thank you, this is a masterpiece of gitmanship :squirrel:
Dec 7, 2016
Another way, you can rebase on the parent of your first commit which is the pointer where your branch diverged.
git rebase -i FIRST_COMMIT_SHA1~
Jul 20, 2017
lol.. I actually had to get some conflicts with rebase with master.. But above steps effectively got me the same thing as below could do:
git reset --soft HEAD^^^(as many new commits in your feature branch. Now, you can see all your changed files in
git stash(stashing all changed files of feature branch)
git rebase master(no conflicts because feature branch now has no commits of its own)
git stash pop(with conflicts in your changed files adding
====wherever you made changes in your files..)
Anyways, this is good enough.
Aug 25, 2017
cheers bro, swish swish swish...another one bites the dust
Apr 17, 2018
I frequently consult this GIST as I can never remember how to do this, and wish it were a single command in git. Thank you so much for saving me from rebase hell.
Jun 11, 2018
Cheers again bro!
Aug 16, 2018
Thanks a lot !! You saved my time :)
Aug 17, 2018
Once again this has served me well...thanks!
Sep 19, 2018
Fair play, this has once again pulled me from the darkness
Oct 8, 2018
Nice one m8!
Jun 20, 2019
Brilliant, thanks for this
Dec 16, 2019
Feb 12, 2021
Note that you might face the issue of setting tracking information as well (connecting your new squashed branch to your remote one). To handle this you will need to do:
git branch --set-upstream-to=origin/myfeaturebranch myfeaturebranch
thank you for saving me from rebase hell