Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
还原git中的提交范围_Git_Revert_Range - Fatal编程技术网

还原git中的提交范围

还原git中的提交范围,git,revert,range,Git,Revert,Range,如何在git中恢复一系列提交?通过查看文档,我看不到如何指定所需的范围。例如: 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+中支持在中还原多个提交:有关更多详细信息,请参阅“” 当前版本仅适用于

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

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+中支持在中还原多个提交:有关更多详细信息,请参阅“” 当前版本仅适用于当前Git版本(1.7.4+)


如评论中的报告所示:

升级到1.7.4可以正常工作。
回答我自己的问题,这是我想要的语法:

git revert B^..D 
B^
表示“B的第一个父提交”:允许在还原中包含
B

请参阅“”,其中包括语法:请参阅“”)中的详细信息

请注意,每个恢复的提交都是单独提交的

澄清如下:

如下图所示,无需立即提交即可恢复:

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

使用
git-rebase-i
将相关提交压缩为一个。然后你只有一个提交要还原。

执行
git revert OLDER\u commit^..NEWER\u commit
对我不起作用


我使用了
git revert-n OLDER\u COMMIT^..NEWER\u 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"
参考:



感谢您在gitrevisions(7)页面的末尾提供了一个标题为“指定范围”的部分。你想要的和上面描述的有什么不同?GitReversions页面建议“git revert A..D”将实现我想要的。然而,当我尝试时,我得到了错误“致命:找不到'A..D'”,谢谢,这就是答案。升级到1.7.4可以正常工作。为了回答我自己的问题,这是我想要的语法:git revert B^..Dgenius。谢谢我没有想到我需要以相反的顺序恢复提交,以应用补丁,嗯。这个命令指明了方向。我经常参考这个答案,我总是需要一段时间才能弄清楚顺序。因此,为了帮助我未来的自我:
git revert OLDER\u COMMIT^..NEWER\u COMMIT
这是什么意思?@DustinGetz第一个父级:请参阅:“修订参数的后缀
^
表示该提交对象的第一个父级”。如果使用git-rebase,您可以简单地删除提交。我认为有理由不重新设置基址,比如希望保持提交F的SHA1不变。或者,将恢复提交压缩为一个。我想您可以在单独的分支上压缩它们,恢复该提交,然后将恢复提交挑选到原始分支上。我遇到了同样的问题,并使用-n修复它,但是你应该用OLDER\u COMMIT(git revert-n OLDER\u COMMIT^..NEWER\u COMMIT)离开^1。@FeelGood你为什么要离开^2?我有A->B->C历史记录,目标是还原B和C。当我运行'git revert-n B..C'时,只有C被还原。当我使用'git revert-nb^..C'时,git恢复了两次提交。也许我做错了什么。酷,我们必须测试它,但我认为在我的情况下效果很好(除非我恢复了1提交范围lol),我将修改答案以包括^。感谢
-n
-no commit
选项将在一次提交中还原整个范围内的所有更改,而不是为该范围内的每个提交创建一个还原提交。最终结果与中相同,相同的更改将恢复。这取决于您希望您的git历史记录是什么样子。
git revert-nb..D
不会还原提交B,只有C和D。
git revert-nb^..D
也会还原B。根据git文档,它是这样做的。文章中的参考如果您在参考中提到这个示例(我认为这有点混乱):
git revert-n master~5..master~2
,它说包含了第五个最新提交。但是
master~5
实际上是第六次提交。有关
的详细信息,请参见git文档。
符号:-)
 git revert -n B D
 git commit -m "Revert commits B and D"