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

2024-02-05

首先,我以前在这里看到过这个问题的答案,但它被太多的“答案”所掩盖,这些“答案”不能正确回答我的问题,以至于我无法再次找到它。

所以事情就是这样:如何在 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'

Simply "checkout提交”。这将使用历史记录中存储库的指定快照(提交)覆盖您当前的工作目录,并使该工作集成为您可以根据需要暂存和提交的新工作集。

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

重要的提示: the 尾随.上一行很重要!如果省略它,您最终将处于“分离的 HEAD”状态,这是您不想要的。

If you commit之后您的存储库将立即具有与您执行的提交相同的文件系统内容checkout到(假设您没有其他未暂存或暂存的更改):

git commit -m "Restoring old source code"

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

也可以看看:回滚到公共存储库中旧的 Git 提交 https://stackoverflow.com/questions/2007662/rollback-to-an-old-git-commit-in-a-public-repo

关于. (dot)

The .(点)字符的意思是“当前目录”——它对 git 来说并不是什么特殊或独特的东西,它是一个标准的命令行文件系统约定,在 Windows、Linux、macOS 甚至 MS-DOS 上都是相同的。它的工作原理类似于..意思是“父目录”。我建议阅读这些:

  • https://askubuntu.com/questions/54900/what-do-and-mean-when-in-a-folder https://askubuntu.com/questions/54900/what-do-and-mean-when-in-a-folder
  • https://superuser.com/questions/37449/what-are-and-in-a-directory https://superuser.com/questions/37449/what-are-and-in-a-directory
  • Linux 中的双点(..) 和单点(.) 是什么? https://stackoverflow.com/questions/23242004/what-is-double-dot-and-single-dot-in-linux
  • https://unix.stackexchange.com/questions/118175/what-are-some-uses-of-single-period-double-period-in-the-shell-command https://unix.stackexchange.com/questions/118175/what-are-some-uses-of-single-period-double-period-in-the-shell-command

关于checkout

意识到:checkout是 git 中的一个重载命令 - 它可能意味着切换分支(a lasvn switch)或从历史记录中获取特定文件或提交并将其放入您的工作区(a lasvn update -r <id>)。它也可能意味着其他事情:https://git-scm.com/docs/git-checkout https://git-scm.com/docs/git-checkout- 我很欣赏它会让人们感到困惑,尤其是当我在使用 TFS 多年后开始使用 git 时(其中“Checkout”完全意味着其他东西)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何在 VS Code 中仅提交跟踪文件?

    git status 显示以下三个信息 要提交的变更 分阶段变更 未暂存提交的更改 未暂存更改 未跟踪的文件 我曾经git commit a 它提交 1 和 2 然而VS代码Commit All提交 1 2 和 3 Commit Stage
  • 如何使用它们的更改来解决选择冲突?

    My git cherry pick FOO产生了冲突 我可以检查冲突的文件并删除之间的行 lt lt lt lt lt lt lt and 以及冲突标记本身 但我希望有一种更简单的方法 我觉得svn等同于选择theirs conflict
  • Hudson 结帐卡在“git fetch”处

    我正在使用 git 版本 1 6 2 2 1669 g7eaf8 在 Hudson 1 314 上使用 Hudson Git 插件 0 7 3 当我触发构建时 Hudson 执行 git fetch 但它永远不会返回 我把一只卡在那里14天
  • 由于合并而不允许 git revert 但未给出 -m 选项

    我正在尝试使用 revert 命令恢复到 git 中的某个 哈希 号 我正在使用以下命令 git revert c14609d74eec3ccebafc73fa875ec58445471765 但是 我得到以下返回 错误 提交 c14609
  • 如何在 git diff 中按标点符号拆分单词?

    我对以下命令有一些运气 git diff color words lt gt space lt gt 但它似乎没有在第一个字符类中正确地否定方括号 我试过这个 git diff color words lt gt space lt gt 为
  • 如何像对待普通目录一样对待嵌套存储库(子模块)?

    我的 WordPress 网站是使用 Git 进行版本控制的 包括wp content plugins 文件夹 现在有一个插件 wp editormd 带有自己的 Git 存储库 wp content plugins wp editormd
  • 判断 Git 提交是否是合并/恢复提交

    我正在编写一个脚本 需要检查特定提交是否是合并 恢复提交 我想知道是否有 git 技巧 到目前为止我想到的 我绝对不想依赖这里的提交消息 是检查HASH 2看看我是否没有收到错误 是否有更好的方法 判断某个东西是否是合并很容易 这是不止一位
  • 从 git 中删除历史记录 - git 命令失败

    我正在尝试从 Git 历史记录中清除项目 bin 目录 我已经将 bin 添加到 gitignore 并运行 git rm cached r bin成功地 现在我尝试使用 GitHub 帮助页面中推荐的命令来清除历史记录 git filte
  • Git:结帐而不运行结帐后挂钩

    我有一个我喜欢的结帐后挂钩 大多数时候 但有时我知道运行它会浪费时间 或者 因为它会删除并重建我的开发数据库 所以我不希望它去做它的事情 有没有跳过钩子的 git 选项 公平地说 我已经开始寻找一个了 我认为没有命令行选项可以完成您想要的操
  • 克隆存储库而不将其设为原始远程存储库

    我正在从一台将被擦除的计算机上克隆一个 git 存储库 是否可以在不创建原始存储库的情况下克隆存储库origin master 或者我是否需要克隆它 然后删除远程分支 这是通过git remote rm origin Edit 存储库只有一
  • 如何重命名 GitHub 网站上的目录/文件夹?

    我在 GitHub 网站上找到了一种方法rename https github com blog 1436 moving and renaming files on github一个文件并成功完成 我也找到了一种方法rename https
  • Git - 推送到远程存储库中的远程跟踪分支

    当简单地做git push到远程存储库 其master分支得到更新 对于非裸存储库来说 这是不希望出现的情况 最近的 Git 版本显示的警告消息清楚地表明了这一点 我希望能够推送到远程存储库 并拥有其之一远程追踪分支进行更新 稍后 当我登录
  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • git subtree pull -P 不管 总是合并冲突

    问题 即使我没有进行任何更改 每次尝试拉入子树时 我都会遇到合并冲突 我在做什么 In 子树仓库 Make some changes git commit am Changes made git push origin master In
  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • 远程测试时如何搭建git开发环境

    这似乎是一个愚蠢的问题 但我觉得我对 GIT 相当了解 但我似乎无法按照我的意愿设置我的开发环境 我要么错过了一些非常简单的东西 要么我做错了 我在我的服务器上初始化了一个裸 git 存储库 将其克隆到我的本地计算机 提交我的文件并推送到原

随机推荐