If you have commits:
1 2 3 4 5
and you want to get rid of commit 3, do this:
# currently on master branch
git checkout -b tmp
git format-patch 4..HEAD --stdout > patch.diff # gets all the commits you want
git reset --hard 2 # go back to good times (before you had commit 3).
git am < patch.diff # apply the patch you generated (this is not squished)
# now you're back to happy times. Depending on what you're
# trying to do, you can:
# 1. delete your master branch and rename tmp to master
# 1. make tmp your feature branch and make PR from it
# 1. or hard reset your master branch and merge tmp into it.
# clean up
This happened to me just now when I merged a branch
master locally because
I didn't want to wait for a PR to get merged. Now, every time I checkout new branch
master, it includes commits from
foo. Now, when I create a PR from
upstream, it includes
foo commits. Which would be OK if
foo got merged right away.
BUT, I ended up changing history on
foo (squash/rebase/amend/whatever), so that now
foo have divergent histories and you end up having merge conflicts even
foo don't touch the same files.
NOW YOU KNOW.