首先,我以前在这里看到过这个问题的答案,但是它被太多的“答案”所掩盖,这些答案不能正确地回答我的问题,以至于我无法再找到它。
所以,事情是这样的:如何在Git中恢复到历史记录中的上一个版本,使其成为当前历史记录上的新提交?
基本上,这是我想用版本控制系统做的最基本的事情。简单的重置不起作用,因为它会丢弃我的历史记录,简单的恢复也不起作用,因为有时它会给我错误消息(我想做的事情应该是可能的,没有任何错误消息)。
如果我只是执行git revert
,就会发生以下错误:
git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
4条答案
按热度按时间hgc7kmma1#
简单地说就是“
checkout
the commit”。这将覆盖您当前的工作目录与指定的快照(提交),您的仓库从历史,并使您的新工作集,您可以阶段和提交,因为你想。重要提示:前一行的**结尾
.
**很重要!如果省略它,您将最终处于“detached HEAD”状态,这是您在这里不希望看到的。如果你在之后立即执行
commit
,那么你的repo将与你执行checkout
的提交具有相同的文件系统内容(假设你没有其他未暂存或暂存的更改):这不会 * 重写历史,也不会编辑或删除任何以前的提交-所以它的工作原理类似于Mediawiki上的“回滚”:
标签:Rollback to an old Git commit in a public repo
关于
.
(dot).
(点)字符表示“当前目录”-它不是git特有的东西,它是一个标准的命令行文件系统约定,在Windows、Linux、macOS甚至MS-DOS上都是一样的。它的工作原理类似于..
表示“父目录”。我推荐阅读这些:关于
checkout
注意:
checkout
是git中的重载命令--它可能意味着切换分支(如svn switch
),或者从历史记录中获取特定文件或提交并放入工作区(如svn update -r <id>
)。它也可以意味着其他事情:https://git-scm.com/docs/git-checkout-我知道它会让人感到困惑,尤其是当我在使用TFS多年之后开始使用git时(其中“Checkout”完全是另一回事)。brgchamk2#
**编辑:**我看到你想保留历史记录,所以我下面的回答无效。但是,它仍然有用。您可以在编辑器中重新排列行,然后继续。
现在,回到最初的答案。
可以尝试rebase命令。
其中
n
大约比当前提交和您想要恢复的提交之间的提交数多1。比如说,删除最后3个提交:一旦你在那里,它将打开Vim或纳米(或其他编辑器)。只需删除要移除的提交的行,然后退出编辑器。
在Vim中,它将是
esc
,类型为:exit
enter
。现在,简单地推它。这将导致错误,所以做一个力推。
您可能还必须指定分支名称和上游。应该可以了!
此方法会完全删 debugging 误的提交,因此它不会只是添加一个新的提交并恢复更改。
以下是文档:https://git-scm.com/docs/rebase
mum43rcc3#
记下当前HEAD的提交哈希
git reset --hard <old-commit>
git reset --soft <previous-HEAD>
git add . && git commit -m "message"
搞定了!
uurv41yg4#
使用git revert https://git-scm.com/docs/git-revert