【发布时间】:2015-04-09 05:47:08
【问题描述】:
查询是关于 git reset,
第 1 阶段:现在我想使用以下命令恢复到特定提交,前提是没有本地更改。
git reset --hard <sha 1 of specific commit>
查询 1:我如何才能恢复到一个新的单独分支?
查询 2:一段时间后,我想恢复到第 1 阶段的状态, 收回我使用
git reset --hard丢弃的所有提交。是 这可能吗?
请建议:)
【问题讨论】:
查询是关于 git reset,
第 1 阶段:现在我想使用以下命令恢复到特定提交,前提是没有本地更改。
git reset --hard <sha 1 of specific commit>
查询 1:我如何才能恢复到一个新的单独分支?
查询 2:一段时间后,我想恢复到第 1 阶段的状态, 收回我使用
git reset --hard丢弃的所有提交。是 这可能吗?
请建议:)
【问题讨论】:
git reset 只适用于当前分支,所以如果你想在单独的分支上执行它,只需创建一个并检查它。例如使用git checkout -b new_branch_name。这将创建一个指向与以前相同的提交的分支。然后你可以执行你的git reset --hard而不影响你原来的分支。
现在,如果您使用了git reset --hard,并且没有指向原始提交的备份分支,您仍然可以恢复它。幸运的是,Git 不会删除丢失的提交,但会保留它们,直到存储库被垃圾收集。所以你恢复的机会很大。
您首先应该检查的是使用git reflog 的引用日志。它将为您提供 HEAD 之前指出的内容的日志。在某些时候,您应该会看到这样的条目:
b3db916 HEAD@{n}: reset: moving to b3db916
这是您git reset --hard b3db916 的结果。现在它下面的条目是硬重置之前的状态。因此,如果您查看最左侧的哈希,那应该是您想要恢复的提交。您可以使用git show <hash> 进行验证。顺便提一句。除了指定哈希之外,您还可以使用git show HEAD@{n+1}(n+1 是重置条目号之后的数字)。如果不是您要查找的提交,请尝试周围的其他提交,看看您是否可以找到它。
如果您找到了提交,您可以使用git branch new_branch <hash> 或git branch new_branch HEAD@{n+1} 创建一个指向它的新分支。
如果您在 reflog 中找不到该条目(这不太可能但可能),您也可以尝试使用 git-fsck 恢复丢失的对象。
【讨论】:
1 git checkout -b newbranch && git reset --hard sha
2 一切皆有可能。是否要将新分支重置为原始状态?执行 git 重置。您只是想在工作目录中获取原始状态吗?然后git checkout stage1
【讨论】:
问题 1:我想你会想在特定提交之后“做”事情[并且在该特定提交下面有很多提交]。假设这个分支是 STAGE_1_BRANCH
如果是这样,你可以这样做
git checkout -b temp sha_of_specific_commit
#do_things
#commit
问题 2:现在您希望在特定提交之后将您最近的提交推回 STAGE_1_BRANCH,然后是其他提交
git rebase temp STAGE_1_BRANCH
【讨论】: