从Git手册中:
git checkout [--detach] <commit>准备在<commit>上工作,方法是将HEAD分离(请参见“ DETACHED HEAD”部分),并更新工作树中的索引和文件。保留了对工作树中文件的本地修改,因此生成的工作树将是提交中记录的状态加上本地修改。
似乎只有一种选择:HEAD已分离。我可以指定一个不让HEAD脱离的选项吗?
[升级1]我在“将Git存储库还原为先前的提交 ” 一文中的评论中提出了类似的问题
# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .
# Then commit. Be sure and write a good message describing what you just did
git commit
Run Code Online (Sandbox Code Playgroud)
我对他的问题:@Jefromi,在“ git checkout 0d1d7fc32”之后,是否已经分离了HEAD?然后,“ git commit”对悬挂的HEAD无法执行任何操作。
在当前目录中从0d1d7fc32签出状态,但它保留了HEAD的位置。这与使用git checkout other-branch path / to / file之类的东西相同-它将使您进入当前分支,仅签出给定文件。在这种情况下,我们将检出整个当前目录,而不仅仅是一个文件,但仍不更改HEAD。– Jefromi
这样看来,我们可以通过添加“。”来使HEAD不被附加。
[更新2]从下面的答案和评论中,我认为整洁的是:git reset --hard
但是现在我的问题是:Jefromi的方法正确吗?
git checkout 0d1d7fc32 .
git commit
Run Code Online (Sandbox Code Playgroud)
有关他的方法的更多详细信息,请参见上面的链接。
如果你想在不脱离 HEAD 的情况下检查给定的提交哈希,你可以将其分配给一个新分支。只需添加-b <newbranch>到命令末尾git checkout(替换<newbranch>为新分支的名称)
git checkout <hash> -b mynewbranch
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您要签出不是任何分支的最后一个提交的提交,则根本不可能在HEAD引用分支的同时将其签出。
您可以创建或更新分支以指向该特定的提交,如使用git checkout's -b选项在注释中指出的(或-B覆盖现有分支),或者如果您已经在要指向该特定提交的分支上提交,您可以使用进行更新并同时签出git reset --hard <commit>。
Jul*_*eau -1
如果您想在分支模式下签出,并且您确定它已经位于分支的尖端,您需要首先识别该分支名称(使用“git show --decorate”):
git show --decorate <commit>
Run Code Online (Sandbox Code Playgroud)
例如,我的计算机上的“git show --decorate 85d3204”现在告诉我“85d3204”位于“MY-BRANCH”的顶端:
commit 85d3204cd5c081abce3329729691fd9e056dcc19 (MY-BRANCH)
Run Code Online (Sandbox Code Playgroud)
因此,要在分支模式下检查此提交(假设我想继续在“MY-BRANCH”上进行开发),我将遵循以下内容:
git checkout MY-BRANCH
Run Code Online (Sandbox Code Playgroud)