恢复git中的一系列提交

efzxgjgh  于 2023-08-01  发布在  Git
关注(0)|答案(4)|浏览(133)

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

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

字符串
我想做的事情相当于:

git revert B-D


其中结果将是:

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


其中F包含B-D的逆,包括B-D在内。

jvlzgdj9

jvlzgdj91#

你用的是什么版本的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规范修订部分”,其中包括<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"

cig3rfwq

cig3rfwq2#

如何通过 * 一次 * revert commit来恢复一系列提交**

如果你想在一次提交中将提交范围B恢复到D(至少在git version 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"


您还可以使用相同的方法在单个提交中还原多个不相关的提交。举例来说:还原B和D,但不还原C:

git revert -n B D
git commit -m "Revert commits B and D"


参考文献:

  1. https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
    1.感谢Honza Haering的更正。
    1.从man git revert
    -n--no-commit
    通常,该命令会自动创建一些提交,并带有提交日志消息,说明哪些提交被恢复。此标志应用将命名提交还原到工作树和索引所需的更改,但不进行提交。此外,当使用此选项时,索引不必与HEAD提交匹配。还原是根据索引的开始状态完成的。
    这在将多个提交的效果恢复到一行中的索引时很有用。
balp4ylt

balp4ylt3#

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

bakd9h0s

bakd9h0s4#

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

相关问题