Reputation: 229
What's the best way to revert a committed git merge while keeping the option of merging the same branch at a later point?
This is for a situation when I merge a branch into HEAD, then decide that I do not want these changes at the present, but still want the option to merge them into HEAD at some later point.
"git revert -m 1" reverts the code to the pre-merge state, but the branch is still somehow marked as "already merged". So a repeated merge with the same branch at a later point does not work.
This should be a very common problem (and git is an evolved tool), yet I cannot find a simple clean solution (apart from destroying the git repository and pulling it from remote again). Am I missing something?
Upvotes: 4
Views: 1423
Reputation: 1256
If you have not yet published your merge commit (pushed to the central server), the best solution is to rewrite history to remove the merge commit.
git reset HEAD^
git rebase -i
If you have published the merge, you will need to decide whether it is better to rewrite history to preserve proper merge potential for your branch, or simply add a revert commit. This will require talking to everyone who may have potentially downloaded the merge.
If you cannot rewrite history, you'll need to do a revert:
git revert -m 1
In this case, a future merge of the branch will need manual intervention. You may need to cherry-pick commits that are not picked up by the merge, or revert your revert commit.
Upvotes: 1
Reputation: 13617
Sorry to say that you have wasted your branch.
But there is a workaround. The trick is to "rewrite" the merge commit temporarily so that it forgets that the branch is a parent. Assume X
is the merge commit:
git replace --graft X X^ # pretend that there is just one parent
git merge branch # merge the branch again
git replace --delete X # remove the replacement
Upvotes: 9
Reputation: 251
If your merge commit is not pushed yet and it is the top one, you can use reset command
git reset --hard HEAD^
Note, that all uncommitted changes will be lost.
Upvotes: 1