临时切换工作副本到特定的Git提交

326

如何在不丢失它之后进行特定 Git 提交的切换?

我希望本地文件会发生改变,但提交的数据库仍然完整无缺,只是当前位置指针设置为当前选择的提交。

我想将文件状态更改为特定提交,运行项目,完成后将文件恢复到最后一次提交。

如何在不压缩整个项目文件夹的情况下完成此操作?


相关:回退到之前的Git提交 - user456814
3个回答

444

如果你在某个分支 mybranch 上,直接执行 git checkout commit_hash。然后用 git checkout mybranch 返回你的分支。今天我也在解决一个 bug 时进行了类似的二分查找 :) 另外,你应该了解一下 git bisect


7
注意,如果您的存储库干净并且不需要分支,则可以只执行 git checkout commit_hash 命令。这对某些用例(比如我的)可能更容易。 - enderland
1
@enderland:你的HEAD指向某个分支,通常是这样的 :) - Alexander Pavlov
10
谢谢您对 git bisect 的支持,它是一个非常有用的工具! - Niek
2
自 Git 2.23 版本开始,您还可以使用 git switch - 命令返回到原始分支。 - PiaBa
1
@Fed 你是回复错人了吗?我从未使用过“令人困惑”的词语。 - Niek
显示剩余3条评论

75

首先,使用 git log 查看日志,选择你想要的提交,记下用于标识提交的 sha1 哈希值。接下来,运行 git checkout hash。完成后,git checkout original_branch。这种方法的优点是不会移动 HEAD,它只是将工作副本切换到特定的提交。


4
我认为你的意思是 git checkout <original_branch>git checkout HEAD 实际上是一个 NOOP。 - Abe Voelker
4
git reset --hard <hash> 命令会改变当前分支的 HEAD,而 git checkout <hash> 命令则会进入分离头指针(detached HEAD)状态,不会改变任何分支。使用 git checkout 命令可以轻松地返回原来的状态,而无需知道分支的原始哈希值,具体操作可参考这篇答案。 - jofel
初学者的问题:鉴于这个问题的背景(暂时切换到早期的提交),为什么移动或不移动HEAD会有优势或劣势? - nutty about natty
假设我的编辑被批准,它应该可以回答你的问题。无论如何,HEAD实际上都会被移动;但在检出中,HEAD指向的分支引用本身不会被移动。 - echristopherson

31

除了其他回答中展示给您如何通过git checkout <the-hash-you-want>切换版本外,值得知道的是您可以使用以下命令返回到之前的版本:

git checkout -

git checkout @{-1}

这通常比以下方式更方便:

git checkout what-was-that-original-branch-called-again-question-mark

如您所料,git checkout @{-2}会将您带回两个git checkout之前的分支,其他数字同理。如果您能记住更大的数字所在的位置,那么您应该得到某种奖章。


遗憾的是,对于生产力而言,git checkout @{1}并不能将您带到未来要使用的分支,这真是令人惋惜。


8
请注意,git checkout -git checkout @{-1}的简写别名。 - N7L
@Nathanael 天哪不可能...这改变了一切!太好了,谢谢!...我本来想把这个加入答案中,但我认为了解一般的@{n}语法也很有用,因为它适用于许多git命令。我发现如果加入你的速记会让答案变得相当混乱。相反,我投了你的评论一票 - 希望人们能看到它。再次感谢。 - Benjohn
1
没问题。无论如何,这个讨论都是离题的。更像是一个奖励!我经常使用相同的语法将功能合并到发布中。例如,git merge - 将上次检出的分支合并到当前检出的分支中。这就像 bash 中的 cd - - N7L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接