Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Revert merge Git-Flow

Tags:

git

git-flow

I'm using SourceTree and Git-Flow pattern. Now I have prepared a release for my beta-testers to test so I created a new release/v1.0.1 branch. But my mind slipped and I decided to finish (merge into develop and master and tag) the release even though I haven't even sent out the release to my testers. So I would like to have the release branch open up again if my testers finds any bugs I can fix these bugs in the release branch and then when all bugs are fixed I can finish the release.

So how can I easily with SourceTree preferably (or using git commands) revert back to the state when I had the release/v1.0.1 branch?

Attached screendump from SourceTree:

enter image description here

EDIT: Okay I did the git reset --hard HEAD~2 on develop (HEAD~2) because I had tested manually checking out. But now when I checkout master and do a git reflog it seems to me that I should do a reset on HEAD~6

Peters-MacBook-Pro:Remessage peterwarbo$ git reflog
f7663b1 HEAD@{0}: checkout: moving from develop to master
3d132da HEAD@{1}: reset: moving to HEAD~2
2f1c753 HEAD@{2}: checkout: moving from master to develop
f7663b1 HEAD@{3}: checkout: moving from develop to master
2f1c753 HEAD@{4}: merge release/v1.0.1: Merge made by the 'recursive' strategy.
4332fe4 HEAD@{5}: checkout: moving from master to develop
f7663b1 HEAD@{6}: merge release/v1.0.1: Merge made by the 'recursive' strategy.
fe323ef HEAD@{7}: checkout: moving from release/v1.0.1 to master
28a63ea HEAD@{8}: commit: Bumped version number to 1.0.1

But when I do that I get this "error":

Peters-MacBook-Pro:Project peterwarbo$ git reset --hard HEAD~6
fatal: ambiguous argument 'HEAD~6': unknown revision or path not in the working tree.

EDIT 2: New image to illustrate fuckup.

enter image description here

EDIT 3: Attached new image to illustrate the current state now after issuing the git commands in user1615903´s answer. Why does it say that develop is 2 behind? And why is there a merge from release/v1.0.1 to master even though I did a reset to master to the initial commit (fe323ef)?

enter image description here

like image 297
Peter Warbo Avatar asked Apr 18 '13 10:04

Peter Warbo


People also ask

How to revert a merge in Git?

You have to make a decision as soon as possible either you push a hotfix or revert your merge immediately. If you decide to revert your changes then this the flow that you need to follow First, create a new branch/pr from master. Run the command git log and find the hash of the merge commit.

What is the difference between GIT reset and revert?

git revert will make sure that a new commit is created to revert the effects of that unwanted merge. This is in contrast to git reset, where we effectively "remove" a commit from the history. That's also the reason why git revert is a better solution in cases where you've already pushed to a remote. The -m 1 option tells Git that we want ...

Does Git revert move ref commits to another commit?

This command takes a particular commit, but it doesn’t move ref commits to that commit. The git revert operation takes the particular commit, inverses its changes, and generates a new “revert commit”. But you should also consider that git revert can undo a single commit and will not return to the previous state of your project.

What does Git revert -m 1 do?

$ git revert -m 1 <merge-commit-hash> Let's take a closer look at what this command will do: git revert will make sure that a new commit is created to revert the effects of that unwanted merge. This is in contrast to git reset, where we effectively "remove" a commit from the history.


1 Answers

This is quite easy. Things you will need to do are:

  • Reset develop branch to the commit it was before merge

  • Reset master branch to the commit it was before merge

  • Have the release branch point to the correct commit again

  • Remove the tag

  • Push the fixed commits to remote

So to do steps 1 and 2:

git checkout develop
git reset --hard 4332fe4

git checkout master
git reset --hard <SHA of the commit the master was before the merge>

Then to "recreate" the release branch:

git checkout -b "release/v1.0.1" 28a63ea

And finally to remove the tag:

git tag -d v1.0.1

More information about undoing a merge in this stackoverflow question

After that, if the changes were already pushed, you need to use the -f switch to override changes in remote:

git push -f

And to delete the tag from the remote:

git push --delete origin v1.0.1
like image 90
1615903 Avatar answered Nov 15 '22 05:11

1615903