Revert a range of commits in git

你离开我真会死。 提交于 2019-12-17 03:51:43

问题


How can I revert a range of commits in git? From looking at the gitrevisions documentation, I cannot see how to specify the range I need. For example:

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.


回答1:


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.
The current 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 

B^ means "the first parent commit of B": that allows to include B in the revert.
See "git rev-parse SPECIFYING REVISIONS section" which include the <rev>^, e.g. HEAD^ syntax: see more at "What does the caret (^) character mean?")

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"



回答2:


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"

Reference: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

Thanks Honza Haering for the correction




回答3:


Doing git revert OLDER_COMMIT^..NEWER_COMMIT didn't work for me.

I used git revert -n OLDER_COMMIT^..NEWER_COMMIT and everything is good. I'm using git version 1.7.9.6.




回答4:


Use git rebase -i to squash the relevant commits into one. Then you just have one commit to revert.



来源:https://stackoverflow.com/questions/4991594/revert-a-range-of-commits-in-git

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!