如何在Git中将以前的版本恢复为新提交?

jk9hmnmh  于 2023-09-29  发布在  Git
关注(0)|答案(4)|浏览(89)

首先,我以前在这里看到过这个问题的答案,但是它被太多的“答案”所掩盖,这些答案不能正确地回答我的问题,以至于我无法再找到它。
所以,事情是这样的:如何在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'
hgc7kmma

hgc7kmma1#

简单地说就是“checkout the commit”。这将覆盖您当前的工作目录与指定的快照(提交),您的仓库从历史,并使您的新工作集,您可以阶段和提交,因为你想。

cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> .

重要提示:前一行的**结尾.**很重要!如果省略它,您将最终处于“detached HEAD”状态,这是您在这里不希望看到的。

如果你在之后立即执行commit,那么你的repo将与你执行checkout的提交具有相同的文件系统内容(假设你没有其他未暂存或暂存的更改):

git commit -m "Restoring old source code"

这不会 * 重写历史,也不会编辑或删除任何以前的提交-所以它的工作原理类似于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”完全是另一回事)。

brgchamk

brgchamk2#

**编辑:**我看到你想保留历史记录,所以我下面的回答无效。但是,它仍然有用。您可以在编辑器中重新排列行,然后继续。

现在,回到最初的答案。

可以尝试rebase命令。

git rebase -i HEAD~n

其中n大约比当前提交和您想要恢复的提交之间的提交数多1。比如说,删除最后3个提交:

git rebase -i HEAD~4

一旦你在那里,它将打开Vim或纳米(或其他编辑器)。只需删除要移除的提交的行,然后退出编辑器。
在Vim中,它将是esc,类型为:exitenter
现在,简单地推它。这将导致错误,所以做一个力推。

git push -f

您可能还必须指定分支名称和上游。应该可以了!

此方法会完全删 debugging 误的提交,因此它不会只是添加一个新的提交并恢复更改。

以下是文档:https://git-scm.com/docs/rebase

mum43rcc

mum43rcc3#

记下当前HEAD的提交哈希

  1. git reset --hard <old-commit>
  2. git reset --soft <previous-HEAD>
  3. git add . && git commit -m "message"
    搞定了!
uurv41yg

uurv41yg4#

使用git revert https://git-scm.com/docs/git-revert

git revert HEAD~1

相关问题