Revert a range of commits in git
A -> B -> C -> D -> E -> HEAD
I want to do the equivalent of:
git revert B-D
where the result would be:
A -> B -> C -> D -> E -> F -> HEAD
where F contains the reverse of B-D inclusive.
4 Solutions collect form web for “Revert a range of commits in git”
What version of Git are you using?
Reverting multiple commits in only supported in Git1.7.2+: see “Rollback to an old commit using revert multiple times.” for more details.
git revert man page is only for the current Git version (1.7.4+).
As the OP Alex Spurling reports in the comments:
Upgrading to 1.7.4 works fine.
To answer my own question, this is the syntax I was looking for:
git revert B^..D
Note that each reverted commit is committed separately.
Henrik N clarifies in the comments:
git revert OLDER_COMMIT^..NEWER_COMMIT
As shown below, you can revert without committing right away:
git revert -n OLDER_COMMIT^..NEWER_COMMIT git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
git revert OLDER_COMMIT^..NEWER_COMMIT didn’t work for me, I used
git revert -n OLDER_COMMIT^..NEWER_COMMIT and everything good, I’m using git version
If you want to revert commit range B to D (at least in git version 2) in a single commit, you can do
git revert -n B^..D
This revert the changes done by commits from B’s parent commit (excluded) to the D commit (included), but doesn’t create any commit with the reverted changes. The revert only modifies the working tree and the index.
Don’t forgot to commit the changes after
git commit -m "revert commit range B to D"
You can also revert multiple unrelated commits in a single commit, using same method. for example to revert B and D but not C
git revert -n B D git commit -m "Revert commits B and D"
Thanks Honza Haering for the correction
git rebase -i to squash the relevant commits into one. Then you just have one commit to revert.