如何在Git中还原一系列提交?从查看gitrevisions文档来看,我无法看到如何指定我需要的范围。例如:
A -> B -> C -> D -> E -> HEAD
我想要做类似于这样的事情:
git revert B-D
结果将会是:
A -> B -> C -> D -> E -> F -> HEAD
F中包含B到D(包括B和D)的反转。
如何在Git中还原一系列提交?从查看gitrevisions文档来看,我无法看到如何指定我需要的范围。例如:
A -> B -> C -> D -> E -> HEAD
我想要做类似于这样的事情:
git revert B-D
结果将会是:
A -> B -> C -> D -> E -> F -> HEAD
F中包含B到D(包括B和D)的反转。
您正在使用哪个版本的Git?
只有在Git1.7.2+中才支持撤销多个提交: 更多详细信息请参见Rollback to an old commit using revert multiple times.
当前的git revert
手册页仅适用于当前的Git版本(1.7.4+)。
正如OP Alex Spurling在评论中所述:
升级到1.7.4后就可以正常工作。
回答我自己的问题,这是我正在寻找的语法:
git revert B^..D
B^
表示“B的第一个父提交”,这样可以将B
包括在还原中。git rev-parse
SPECIFYING REVISIONS section”中包含的<rev>^
,例如 HEAD^
语法:更多信息请参见“What does the caret (^
) character mean?”。请注意,每个还原提交都是单独提交的。在评论中,Henrik N进行了澄清。git revert OLDER_COMMIT^..NEWER_COMMIT
如下所示,您可以在不立即提交的情况下还原:
git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
git revert OLDER_COMMIT^..NEWER_COMMIT
- Henrik N^
表示该提交对象的第一个父级”。 - VonC如何使用一个撤销提交来还原一系列的提交
如果你想在一个单独的提交中撤销提交范围从 B 到 D(至少在 git 版本 2 中),你可以执行以下操作:
git revert -n B^..D
git commit -m "revert the commit range B to D, inclusive"
-n
(或--no-commit
)参数告诉git从B的父提交(不包括)开始撤销更改,直到D提交(包括),但是不会创建任何包含撤销更改的提交。撤销只会修改工作树(您的活动文件系统)和索引(您的暂存文件部分)。git revert -n
后不要忘记提交更改:git commit -m "revert the commit range B to D, inclusive"
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 提供的 更正。
来自 man git revert
:
-n
,--no-commit
通常,此命令会自动创建一些提交,并在提交日志中声明已还原哪些提交。此标志将所需的更改应用于您的工作树和索引以还原指定的提交,但不进行提交。此外,在使用此选项时,您的索引无需与
HEAD
提交匹配。还原是针对索引的初始状态进行的。当连续还原多个提交的影响到您的索引时,这很有用。
git revert -n B..D
只撤销了 C 和 D 提交,而没有撤销 B 提交。
git revert -n B^..D
撤销了 B、C 和 D 提交。 - Honza Haeringgit revert -n master~5..master~2
,它表示包括最近的第五次提交。但是,master~5
实际上是第六次最新的提交。请参阅Git文档中的修订选择以获取有关..
符号的详细信息 :-) - Honza Haeringgit revert OLDER_COMMIT^..NEWER_COMMIT
对我没有起作用。
我使用了 git revert -n OLDER_COMMIT^..NEWER_COMMIT
,一切顺利。我使用的是 git 版本1.7.9.6
。
-n
或 --no-commit
选项将在一个提交中还原范围内的所有更改,而不是为范围内的每个提交创建还原提交。最终结果相同,也就是说,相同的更改将被还原。只是取决于您想要 git 历史记录看起来如何。 - Dennis git rebase -i
将相关提交合并为一个。然后您只需撤销一个提交即可。