恢复git中的一系列提交

时间:2011-02-14 11:25:16

标签: git revert range

如何在git中恢复一系列提交?从查看gitrevisions文档,我看不出如何指定我需要的范围。例如:

A -> B -> C -> D -> E -> HEAD

我想做相同的事情:

git revert B-D

结果如下:

A -> B -> C -> D -> E -> F -> HEAD

其中F包含B-D的反向。

4 个答案:

答案 0 :(得分:133)

你使用的是什么版本的Git?

仅在Git1.7.2 +中支持还原多个提交:有关详细信息,请参阅“Rollback to an old commit using revert multiple times.”。
当前git revert man page仅适用于当前 Git版本(1.7.4 +)。


评论中的OP Alex Spurling报告:

升级到1.7.4可以正常工作 要回答我自己的问题,这是我正在寻找的语法:

git revert B^..D 

B^表示“B的第一个父提交”:允许在转换中包含B
请参阅“git rev-parse SPECIFYING REVISIONS section”,其中包含<rev>^, e.g. HEAD^语法:请参阅“What does the caret (^) character mean?”中的详情。

请注意,每个还原的提交都是单独提交的。

Henrik Nthe comments中澄清:

git revert OLDER_COMMIT^..NEWER_COMMIT

如下图所示,您可以在不立即提交的情况下恢复:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"

答案 1 :(得分:9)

如果要在一次提交中将提交范围B还原为D(至少在git版本2中),则可以执行

 git revert -n B^..D

这将从B的父提交(排除)提交到D提交(包含)的更改恢复,但不会创建具有恢复的更改的任何提交。 revert仅修改工作树和索引。

不要忘记在

之后提交更改
 git commit -m "revert commit range B to D"

您还可以使用相同的方法在单个提交中还原多个不相关的提交。例如,还原B和D但不是C

 git revert -n B D
 git commit -m "Revert commits B and D"

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

感谢Honza Haering

correction

答案 2 :(得分:6)

执行git revert OLDER_COMMIT^..NEWER_COMMIT对我不起作用。

我使用了git revert -n OLDER_COMMIT^..NEWER_COMMIT,一切都很好。我正在使用git版本1.7.9.6

答案 3 :(得分:0)

使用git rebase -i将相关提交压缩为一个。然后你只有一个提交还原。