2011-02-14 163 views
83

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

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

我想做的相当于:

git revert B-D 

它的结果将是:

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

其中F包含B-d包容性的逆转。

+0

迈向gitrevisions(7)页的端部,有为首的部分“指定覆盖范围”。你想要什么与那里描述的不同? – 2011-02-14 11:30:43

+1

gitrevisions页面显示'git revert A..​​D'会做我想做的事。但是,当我尝试,我得到的错误“致命的:无法找到'A..D'” – 2011-02-14 11:36:48

+0

[Git恢复多个提交](http://www.singhajit.com/git-revert-multiple-commits/) – 2016-02-11 18:50:23

回答

108

你使用的是什么版本的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 N明确了the comments

git revert OLDER_COMMIT^..NEWER_COMMIT 

如下图所示,你可以不提交马上回复:

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

谢谢那就是答案。升级到1.7.4可以正常工作。为了回答我自己的问题,这是我正在寻找的语法: git revert B^.. D – 2011-02-14 14:56:14

+1

@Alex:太棒了!我已将您的评论纳入我的回答。 – VonC 2011-02-14 15:04:18

-1

使用git rebase -i壁球相关的提交到一个。然后你只需要一次提交即可恢复。

4

git revert OLDER_COMMIT^..NEWER_COMMIT我没有工作,我用git revert -n OLDER_COMMIT^..NEWER_COMMIT,一切都很好,我使用Git版本1.7.9.6

3

如果要恢复承诺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 Haeringcorrection