【问题标题】:How to set the working directory to an older commit?如何将工作目录设置为较旧的提交?
【发布时间】:2013-05-14 09:38:39
【问题描述】:

要追踪我破坏软件功能的时间点,我需要查看我的存储库的旧版本。我只想将工作目录设置为较旧的提交,使用代码,然后丢弃更改,然后尝试另一个提交。

我不想更改有关提交的任何内容,既不删除也不创建提交。我尝试使用git reset,但之后不再显示更新的提交。所以我再次下载了存储库,因为我不知道如何恢复它。

【问题讨论】:

标签: git working-directory


【解决方案1】:

一个简单的git checkout old-sha1 可以作为一个开始,但这种任务的真正命令是:

git bisect.

通过二分搜索查找引入错误的更改

如果您有一个脚本能够测试您的工作树是否“有效”,您可以通过 git bisect 在以前的提交上执行该脚本,找到第一个中断测试的提交。

请注意,GitHub for Windows 尚不直接支持此命令:您必须打开一个 shell。


git checkout 会让您处于分离的 HEAD 中,这无关紧要,因为您不会进行任何修改。
要回到原来的样子,请查看一个分支:

git checkout master

见“Why did git detach my head?”。

【讨论】:

  • 谢谢,我之前以为checkout 只适用于分支机构。我可以为bisect 使用哪种脚本?我的应用程序是用原生 C++ 编写的。顺便说一句,Git 给我留下了深刻的印象,包括这样的命令。
  • @danijar 不,您可以签出任何树状结构。例如,git checkout "@{10 minutes ago}" 会给你 10 分钟前的提交。
  • @danijar for git bisect,任何你想要的脚本,只要它以状态 0(工作)或 1(失败)退出。
  • 我使用了checkout,Git 告诉我我现在处于“分离头”状态。这意味着什么?我怎样才能回到最新的提交?
  • @danijar 我已经编辑了答案以解决分离的头部方面。
【解决方案2】:

您可以使用以下命令将另一个分支中的代码签出到索引:

git checkout my-other-branch .

点是一个路径说明符,表示您要对整个存储库执行此操作。您也可以只指定一个特定的文件夹。从技术上讲,您可以为my-other-branch 参数指定任何“tree-ish”说明符,例如标签、提交哈希、HEAD~1 之类的东西……如果您希望这些更改不暂存,则可以做:

git reset HEAD

假设您开始时处于干净状态,您现在的工作目录将处于与 my-other-branch 相同的状态。

【讨论】:

  • 这个对我有用。工作目录中没有点说明符的文件不会被恢复。
【解决方案3】:

使用git checkout <branch_name> 可以切换到另一个可用的分支。如果您想将 HEAD 重置为较旧的提交,可以尝试以下命令:

  • git reset --hard HEAD~1 通过单次提交重置 HEAD
  • git reset --hard HEAD~2 通过2次提交等来重置HEAD

如果你有提交,那么你可以试试这个命令:git reset --hard <commit> 通过这种方式,您可以将工作目录设置为较旧的提交。

要完全放弃更改,您可以尝试:git reset --hard 这会将您的目录清理到上一次提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2013-03-10
    相关资源
    最近更新 更多