【问题标题】:Temporarily switch working copy to a specific Git commit临时将工作副本切换到特定的 Git 提交
【发布时间】:2012-05-01 02:36:40
【问题描述】:

如何切换到特定的 Git 提交而不丢失之后所做的所有提交

我希望本地文件将被更改,但提交的数据库将保持不变,只有当前位置指针设置为当前选择的提交。

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

如何在不压缩整个项目文件夹的情况下做到这一点?

【问题讨论】:

标签: git commit temporary


【解决方案1】:

如果您在某个分支mybranch,请继续git checkout commit_hash。然后您可以通过git checkout mybranch 返回您的分支。我今天有同样的游戏将一个错误一分为二:)另外,你应该知道git bisect

【讨论】:

  • 请注意,如果您在干净的存储库上并且不需要进行分支,则可以只使用 git checkout commit_hash。对于某些用例(比如我的)可能更容易。
  • @enderland:你的 HEAD 总是指向某个分支,通常 :)
  • 我遇到了一个问题,我不得不使用整个提交哈希,因为不接受部分提交哈希。
  • 支持git bisect 参考;多么有用的工具!
【解决方案2】:

首先,使用git log 查看日志,选择您想要的提交,记下用于识别提交的 sha1 哈希。接下来,运行git checkout hash。完成后,git checkout original_branch。这样做的好处是不移动 HEAD,它只是将工作副本切换到特定的提交。

【讨论】:

  • 我想你的意思是git checkout <original_branch>git checkout HEAD 实际上是一个 NOOP
  • git reset --hard <hash> 更改当前分支的 HEAD,而使用 git checkout <hash> 您将获得一个不会更改任何分支的分离结帐,并且您可以轻松返回而无需知道您的分支的原始哈希 ID如this answer所示。
  • @Femaref 初学者的问题:鉴于这个问题的上下文(暂时切换到较早的提交),为什么移动或不移动 HEAD 是有利还是不利?
  • @nuttyaboutnatty 假设我的编辑被批准,它应该回答你的问题。在任何情况下,HEAD 实际上都会被移动;但在结帐时,分支引用 HEAD 指向的本身并没有移动。
【解决方案3】:

除了这里向您展示如何git checkout <the-hash-you-want> 的其他答案之外,值得知道您可以切换回您使用的位置:

git checkout @{-1}

这通常比:

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

如您所料,git checkout @{-2} 将带您回到您在两个 git checkouts 前所在的分支机构,其他号码也是如此。如果你能记住你在哪里获得更大的数字,你应该为此获得某种奖章。


遗憾的是,对于生产力,git checkout @{1} 不会带你去你将来所在的分支,这是一种耻辱。

【讨论】:

  • 注意git checkout -git checkout @{-1}的简写别名
  • @Nathanael OMGOD不可能 ...这改变了一切!好的谢谢! …我打算将其纳入答案中,但我认为了解一般的@{n} 语法也很有用,因为它适用于许多 git 命令。我发现很难在不使答案相当混乱的情况下添加您的速记。相反,我对你的评论投了赞成票——我希望人们会看到它。再次感谢。
  • 没问题。无论如何,这个讨论与实际问题相切。更多的奖金!我经常使用相同的语法将功能合并到一个版本中。例如git merge - 将您上次签出的分支合并到当前签出的分支中。就像 bash 中的 cd -
【解决方案4】:

我曾经实现过 git checkout @{10} 并且工作正常,然后我的大杯焦糖咖啡突然掉到了电脑上......

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2013-04-10
  • 2015-09-12
  • 1970-01-01
相关资源
最近更新 更多