Reputation: 11533
Suppose I have 2 branches master
and dev
.
The dev
branch is ahead of master
by 2 commits, and neither of those commits is merged or pushed to any remote
.
The dev
branch looks like this:
dev A - B - C - D - E
Whereas, A is oldest, and E newest commit.
Id like to get to this state:
dev A - B - C - E
Basically I want to nuke the commit before the last commit, as if it never happened. There should be no conflicts either (E does not depend on D's changes).
Could I use interactive rebase?
Upvotes: 3
Views: 942
Reputation: 9114
I would use the itneractive form of rebase. While on dev
(you need to have clean working copy):
git rebase -i HEAD~~
In your favourite text editor, you get a list of last 2 commits. Just comment/delete the line for the unwanted commit.
If HEAD
depends on changes introduced by HEAD~
, you could get merge conflicts and after you resolve them, you will loose your previous history (still available through the reflog
, of course). I usually prefer this method.
If you want to conserve your previous history (and the unneeded commit), you should do
git checkout HEAD~~ # go to last good commit
git checkout -b new_branch # create a new branch and forget about the original
git cherry_pick dev # copy the commit on top of `dev` to `new_branch`
You will still get a conflict, but you won't be modifying the history of dev
.
On the other hand, if the unwanted commit was on master
and you didn't want to break anybody's build, you would do git revert HEAD~
Upvotes: 4