如何在git中恢复一系列提交?从查看gitrevisions文档,我看不出如何指定我需要的范围。例如:
A -> B -> C -> D -> E -> HEAD
我想做相同的事情:
git revert B-D
结果如下:
A -> B -> C -> D -> E -> F -> HEAD
其中F包含B-D的反向。
答案 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 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 :(得分: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
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
将相关提交压缩为一个。然后你只有一个提交还原。