在git中撤销一系列的提交
在git中撤销一系列的提交
如何在git中还原一系列的提交?从查看gitrevisions文档来看,我无法找到如何指定我所需的范围。例如:
A -> B -> C -> D -> E -> HEAD
我想要做的等效操作是:
git revert B-D
结果应该是:
A -> B -> C -> D -> E -> F -> HEAD
其中F包含了B-D(包括)的反向变化。
如何在Git中恢复一系列提交
如果要在单个提交中还原提交范围B到D(至少在Git版本2中),可以执行以下操作:
git revert -n B^..D git commit -m "还原提交范围B到D,包括它们"
-n
(或--no-commit
)参数告诉Git还原从B的父提交(不包括)到D提交(包括)所做的更改,但是不创建具有还原更改的提交。还原只修改工作树(您的活动文件系统)和索引(您的暂存文件区)。
在运行git revert -n
后不要忘记提交更改:
git commit -m "还原提交范围B到D,包括它们"
您还可以使用相同的方法在单个提交中还原多个无关的提交。例如,还原B和D但不还原C:
git revert -n B D git commit -m "还原提交B和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
不会还原提交B,只会还原C和D。而git revert -n B^..D
也会还原B。
根据Git文档,它确实会还原。参考帖子中的引用。
如果您指的是参考中的这个示例(我认为有点令人困惑):git revert -n master~5..master~2
,它表示包括第五个最新提交。但是master~5
实际上是第六个最新提交。有关..
符号的详细信息,请参阅Git文档中的修订选择。
如果您计划重新应用这些提交,这通常是个坏主意
,我不明白为什么。在执行此操作后,您仍然可以逐个提交重新应用这些提交。
非常好的答案,正是我需要的!我需要添加一些历史记录(可能是10个提交)来自我们软件的旧版本,而不需要重写历史记录,并且在完成后不更改我们的main
分支,这个答案正是我需要的!为了执行此操作,我将清空工作树,并将软件第一个版本复制到工作树中,然后进行提交。然后我将复制v2并提交,然后是v3,并进行提交,依此类推,直到添加所有历史记录。完成后,我希望有一个单个还原提交来撤消所有这些版本。完成后,main
分支将...
...与最初的状态完全相同,并且我们的软件版本历史记录现在可以在存储库中使用,因此我们始终可以根据需要使用git diff
来查看过去发生了什么变化!
Git版本不同,对于回滚多个提交的支持也不同。在Git 1.7.2+版本中,可以使用git revert
命令回滚多个提交。回滚多个提交的语法是:git revert OLDER_COMMIT^..NEWER_COMMIT
。每个被回滚的提交都会单独进行提交。
如果要回滚的提交中存在合并冲突,可能无法正常工作。解决冲突可能是必要的,但是Git 2.34+版本默认使用了更好的合并算法(ORT算法),可以提供帮助。
在回滚多个提交之前,可以使用git rev-list OLDER_COMMIT^..NEWER_COMMIT
命令预览要回滚的提交范围。
值得注意的是,git revert
和git cherry-pick
命令的"commit range"语法是相同的。
总结起来,要回滚一个提交范围的多个提交,在Git 1.7.2+版本中,可以使用git revert OLDER_COMMIT^..NEWER_COMMIT
命令。如果存在合并冲突,需要手动解决冲突。可以使用git rev-list OLDER_COMMIT^..NEWER_COMMIT
命令预览要回滚的提交范围。
问题:如何在git中还原一系列的提交?
解决方法:使用git revert -n OLDER_COMMIT^..NEWER_COMMIT
命令。
原因:当使用git revert OLDER_COMMIT^..NEWER_COMMIT
命令时,无法还原提交。但是在git版本1.7.9.6
中,使用git revert -n OLDER_COMMIT^..NEWER_COMMIT
命令可以成功还原。
具体原因是:当运行git revert -n B..C
命令时,只有C被还原,而B没有被还原。使用git revert -n B^..C
命令时,B和C都被还原。这可能是因为我做错了操作。
使用-n
或--no-commit
选项可以在一个提交中还原整个范围内的所有更改,而不是为范围内的每个提交创建还原提交。最终结果是相同的,也就是说,相同的更改将被还原。这取决于你想要的git历史记录的样子。
范围B..D
表示可从D到达但无法从B到达的提交。这就是为什么B不被包括在内的原因,因为B可从自身到达。使用B^..D
表示可从D到达但无法从B的父提交到达的提交,因此B被包括在内。