恢复git中的一系列提交

Ale*_*ing 109 git range revert

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

A -> B -> C -> D -> E -> HEAD
Run Code Online (Sandbox Code Playgroud)

我想做相同的:

git revert B-D
Run Code Online (Sandbox Code Playgroud)

结果将是:

A -> B -> C -> D -> E -> F -> HEAD
Run Code Online (Sandbox Code Playgroud)

其中F包含BD的反向.

Von*_*onC 148

你用的是什么版本的Git?

仅在Git1.7.2 +中支持还原多个提交:有关详细信息,请参阅" 使用revert多次回滚到旧提交. ".
当前的git revert手册页仅适用于当前的 Git版本(1.7.4+).


正如OP Alex Spurling在评论中所述:

升级到1.7.4工作正常.
要回答我自己的问题,这是我正在寻找的语法:

git revert B^..D 
Run Code Online (Sandbox Code Playgroud)

B^表示"B的第一个父提交":允许包含B在恢复中.
请参阅" git rev-parse指定修订版本"部分,其中包括<rev>^例如HEAD^语法:请参阅" 插入符号(^)字符的含义是什么意思? ")

请注意,每个还原的提交都是单独提交的.

Henrik N评论中澄清:

git revert OLDER_COMMIT^..NEWER_COMMIT
Run Code Online (Sandbox Code Playgroud)

如下所示,您可以在不立即提交的情况下恢复:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
Run Code Online (Sandbox Code Playgroud)

  • 我经常回答这个问题,总是需要一段时间来弄清楚这个顺序.所以为了帮助我未来的自我:`git revert OLDER_COMMIT ^ .. NEWER_COMMIT` (4认同)
  • 谢谢,这就是答案。升级到 1.7.4 效果很好。为了回答我自己的问题,这是我正在寻找的语法: git revert B^..D (2认同)
  • 这是什么意思? (2认同)

Ram*_*ast 9

如果要在单次提交中将提交范围B还原为D(至少在git版本2中),则可以执行此操作

 git revert -n B^..D
Run Code Online (Sandbox Code Playgroud)

这将从B的父提交(排除)提交到D提交(包含)的更改完成,但不会使用还原的更改创建任何提交.恢复仅修改工作树和索引.

不要忘记之后提交更改

 git commit -m "revert commit range B to D"
Run Code Online (Sandbox Code Playgroud)

您还可以使用相同的方法在单个提交中还原多个不相关的提交.例如,还原B和D但不是C

 git revert -n B D
 git commit -m "Revert commits B and D"
Run Code Online (Sandbox Code Playgroud)

参考:https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

感谢Honza Haering纠正

  • `git revert -n B..D`不会还原提交B,只有C和D.`git revert -n B ^ .. D`也会返回B. (3认同)
  • 如果您在参考文献中引用这个示例(我认为这有点令人困惑):“git revert -n master~5..master~2”,它表示包含第五个最新提交。但 `master~5` 实际上是第 6 个最新提交。有关“..”符号的详细信息,请参阅 git 文档中的[修订选择](https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection):-) (2认同)

Orl*_*ndo 6

git revert OLDER_COMMIT^..NEWER_COMMIT对我不起作用.

我用过git revert -n OLDER_COMMIT^..NEWER_COMMIT,一切都很好.我正在使用git版本1.7.9.6.

  • `-n`或`--no-commit`选项将在单个提交中恢复整个范围内的所有更改,而不是为范围中的每个提交创建还原提交.最终结果是相同的,因为相同的更改将被还原.只是取决于你希望你的git历史看起来如何. (2认同)