Let's visualize your scenario:
o---o---o------o (some-other-branch) \ o---o---o---M1---N---M2 (QA) \ / / A---B---C----D (release/4.0.1)
In order to undo the changes in QA that came from commits A, B, C and D, you need to revert the merge commits M1 and M2.
First, you need to find the merge commits that happened on QA after release/4.0.1 was forked:
git log --format='%h %s' --right-only --merges releases/4.0.1...QA
This will return the IDs and commit messages of M1, N and M21. For example:
18abe3e Merge branch 'release/4.0.1' 2db6c39 Merge branch 'some-other-branch' b49ea3f Merge branch 'release/4.0.1'
At this point, you can revert the merge commits from release/4.0.1 in QA starting from the latest one:
git switch QA git revert -m 1 b49ea3f # Reverts M2 git revert -m 1 18abe3e # Reverts M1
Alternatively, you can revert all merge commits in a single commit:
git switch QA git revert -m 1 --no-commit b49ea3f # Reverts M2 git revert -m 1 --no-commit 18abe3e # Reverts M1 # Verify that everything works git commit -m "Revert merge commits M2 and M1"
A word of caution: reverting a merge commit removes the changes, but it does not alter the history of the branches. This complicates things if you ever wanted to merge release/4.0.1 into QA again. Read the documentation for more information on the consequences of reverting a merge.
- Unfortunately, it's not possible to filter out merge commits from other branches that happened in between. In this example,
N happened between M1 and M2, so it's going to make the cut.