165

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

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

我想做相当于:

git revert B-D

结果将是:

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

其中 F 包含 BD 的倒数。

4

4 回答 4

215

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

仅在 Git1.7.2+ 中支持还原多个提交:有关更多详细信息,请参阅“使用还原多次回滚到旧提交。 ”。
当前git revert手册页仅适用于当前Git 版本(1.7.4+)。


正如OP Alex Spurling在评论中报告的那样:

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

git revert B^..D 

B^表示“B 的第一个父提交”:允许包含B在还原中。
请参阅“ git rev-parseSPECIFYING REVISIONS 部分”,其中包括<rev>^, 例如HEAD^语法:在“插入符号 ( ^) 字符是什么意思? ”中查看更多信息)

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

Henrik N在评论中澄清:

git revert OLDER_COMMIT^..NEWER_COMMIT

如下所示,您可以在不立即提交的情况下还原:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
于 2011-02-14T13:31:09.110 回答
25

如果您想在一次提交中将提交范围 B 恢复为 D(至少在 git 版本 2 中),您可以执行

 git revert -n B^..D

这会将由 B 的父提交(排除)的提交完成的更改恢复到 D 提交(包括),但不会创建任何包含恢复更改的提交。还原仅修改工作树和索引。

之后不要忘记提交更改

 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更正

于 2017-01-24T07:22:33.427 回答
10

git revert OLDER_COMMIT^..NEWER_COMMIT对我没有用。

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

于 2012-10-25T18:15:58.303 回答
-1

用于git rebase -i将相关提交压缩为一个。然后你只有一个提交来恢复。

于 2011-02-14T13:48:59.917 回答