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


248

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

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

我想将文件的状态更改为特定的提交,运行项目,并在完成后将文件还原回上一次提交。

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


Answers:


344

如果您在某个分支机构mybranch,那就继续吧git checkout commit_hash。然后,您可以通过返回到您的分支git checkout mybranch。今天我有同样的游戏将bug分成两部分:)另外,您应该了解git bisect


6
请注意,git checkout commit_hash如果您使用的是干净的存储库,而无需进行分支,则可以执行此操作。在某些用例(例如我的用例)中可能会更容易。
enderland

@enderland:通常,您的HEAD总是指向某个分支:)
Alexander Pavlov

我遇到了一个问题,我必须使用整个提交哈希,因为不接受部分提交。
mayyiam 2014年

6
推荐git bisect参考;多么有用的工具!
尼克(Niek)

54

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


4
我想你的意思是git checkout <original_branch>git checkout HEAD实际上是一项NOOP
Abe Voelker

3
git reset --hard <hash>更改当前分支的HEAD,与此同时,git checkout <hash>您将获得不更改任何分支的分离结帐,并且可以轻松返回而无需知道该分支的原始哈希ID,如此答案所示。
jofel 2012年

@Femaref初学者的问题:考虑到此问题的上下文(暂时切换到较早的提交),为什么移动HEAD或不移动HEAD是有利还是不利?
关于natty的坚果,

@nuttyaboutnatty假设我的编辑被批准,它将回答您的问题。HEAD实际上无论如何都会被移动;但是在结帐时,分支引用HEAD指向的对象本身并未移动。
echristopherson

15

除了此处显示的其他答案外,git checkout <the-hash-you-want>值得知道的是您可以切换回使用的位置:

git checkout @{-1}

这通常比以下更方便:

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

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


可悲的是,为了提高生产力,git checkout @{1}您并没有带您去将来要去的分支机构,这真是可惜。


1
请注意,这git checkout -git checkout @{-1}
Nathanael

@Nathanael OMGOD没办法 ……这改变了一切!好的谢谢!…我打算将其合并到答案中,但是我认为了解常规@{n}语法也很有用,因为它可以与许多git命令一起使用。我发现很难添加您的速记而不使答案相当混乱。相反,我投票支持您的评论-希望人们能看到它。再次感谢。
约翰

1
没问题。无论如何,该讨论与实际问题相切。更多奖金!我经常使用相同的语法将功能合并到发行版中。例如git merge -,将您上次签出的分支合并到当前签出的分支中。就像cd -bash一样。
拿但
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.