恢复 git 中的提交范围

如何恢复 git 中的提交范围?从 电脑修订版文档中,我看不出如何指定我需要的范围。例如:

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

我想做的相当于:

git revert B-D

结果会是:

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

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

81731 次浏览

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

恢复仅在 Git1.7.2 + 中支持的多次提交: 有关更多细节,请参见“ 使用多次恢复回滚到旧的提交。”。
当前的 git revert手册页只适用于 目前Git 版本(1.7.4 +)。


正如 观察员 Alex Spurling在评论中报告的那样:

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

git revert B^..D

B^表示“ B 的第一个父提交”: 它允许在还原中包含 B
请参阅“ 指定修订部分”,其中包含 例如 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"

使用 git rebase -i将相关的提交压缩成一个,然后只需要一个提交来恢复。

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

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

如果您想在一次提交中将提交范围 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纠正一下