如何在保持 git 历史向前发展的同时恢复提交

Posted

技术标签:

【中文标题】如何在保持 git 历史向前发展的同时恢复提交【英文标题】:How to revert a commit while keeping the git history moving forward 【发布时间】:2021-10-14 04:05:38 【问题描述】:

假设我有一个大型项目,团队很大,而且提交速度很快。我编写了一些代码,进行提交,然后将该提交推送到源。

然后我决定不再想要那个提交。如果我要

git reset --hard HEAD~1

或类似的东西,我的历史可以追溯到过去,而且 GitHub 一直坚持让我运行 pull,因为我的本地现在落后于 GitHub。

相反,我想要做的是返回一个提交,但让历史看起来好像我做了原始提交,然后又做了另一个提交,但第二次提交实际上只是删除了第一的。这样,其他团队成员可以随时拉取,而不会搞砸历史记录。

我怎样才能做到这一点?

【问题讨论】:

你试过了吗...revert? 您似乎想隐藏还原,这是可以理解的,但通常不是必需的或重要的。如果没有重置,你不会这样做,这会产生分歧,需要的不仅仅是来自其他开发者的拉动。 这能回答你的问题吗? How to revert last commit and remove it from history? 因为您说“返回提交”。特别是“返回一个提交,但是”。这意味着您希望在可见、历史和现实之间有所区别。 听起来你根本不知道git revert,它正是你想要的:做一个完全撤消的new提交另一个提交。既然您知道这一点,我不确定这个问题有多大价值(恕我直言)。也许考虑删除它? 【参考方案1】:

相反,我想要做的是返回一个提交,但让历史看起来好像我做了原始提交,然后又做了另一个提交,但第二次提交实际上只是删除了首先

这很愚蠢。你不能往后退,假装你往前走。不是让历史出现以某种方式,而是让历史成为那种方式——也就是说,你事实上做了原始提交,然后之后进行了另一次提交,删除了第一次引入的更改。这正是git revert 所做的,所以只需使用它。没有什么可耻的;确实会犯错误,而修复它们是工作的一部分。

【讨论】:

我显然对这个问题的措辞非常糟糕。我不在乎历史长什么样。我只想在保持历史线性的同时删除更改,所以 git 和 github 不要抱怨。 reset 导致这种问题。我去看看revert,谢谢。 是的,revert 正是这样做的:它使历史保持线性。它使事情顺利进行A -- B -- C -- Ooops -- Unoops -- D

以上是关于如何在保持 git 历史向前发展的同时恢复提交的主要内容,如果未能解决你的问题,请参考以下文章

在保留所有历史提交的同时将Git存储库迁移到tfs Git

eclipse中如何使用Git/gitee雷哥pull拉代码,commit提交到本地,Push推送到服务器

如何将我的 git 分支恢复到指定的提交?

git如何恢复本地删除的文件

.git如何恢复代码

git撤销操作和历史查看(git log)