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

Ste*_*bua 8 git undo

首先,我之前已经看到了这个问题的答案,但它被许多"答案"所掩盖,这些"答案"没有正确回答我的问题,我再也找不到了.

所以这就是:我如何将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'
Run Code Online (Sandbox Code Playgroud)

Dai*_*Dai 13

只需" checkout提交".这将使用您从历史记录中指定的repo快照(提交)覆盖当前工作目录,并将其设置为您可以根据需要进行分段和提交的新工作集.如果您commit之后立即执行,则您的repo将具有与您执行的提交相同的文件系统内容checkout(假设您没有其他未分级或暂存的更改)

不会重写历史记录,也不会编辑或删除任何先前的提交 - 因此它的工作方式类似于Mediawiki上的"回滚":

cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> . 
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"
Run Code Online (Sandbox Code Playgroud)

另请参阅:回滚到公共存储库中的旧Git提交

关于.(点)

.(点)字符表示"当前目录" -这不是什么特别的或独特的与git,这是一个标准的命令行文件系统的惯例是在Windows,Linux,MacOS和甚至MS-DOS相同.它的工作方式类似于.."父目录".我建议阅读这些:

关于 checkout

请注意:checkout是git中的重载命令 - 它可能意味着切换分支(a la svn switch)或从历史记录中获取特定文件或提交并放入工作区(a la svn update -r <id>).它也可能意味着其他事情:https://git-scm.com/docs/git-checkout - 我很感激它会让人迷惑,特别是我在使用TFS多年后开始使用git时(其中"Checkout"意味着其他的东西)完全).

  • 如果你像我一样错过了尾随的“.”并最终处于分离的 HEAD 状态,那么“git checkout master”(或者大概用“master”替换你正在处理的任何分支)将基本上撤消该命令。 (3认同)
  • 啊。这也行不通。我希望在我上次提交的基础上提交旧的内容。如果你们不知道如何做我想要的事情,请不要发送错误答案的垃圾邮件。 (2认同)