git reset无法更改HEAD

时间:2017-08-22 00:21:51

标签: git

我在工作树中有什么

* 63a7b9f 2017-08-21 | temp commit (HEAD) [Jiaxiang Liang]
* ad8d3f2 2017-08-19 | adding gitignore [Jiaxiang Liang]
* a562db1 2016-03-31 | revert to correct bugfix [Y. Yan]
* 3b24fd4 2016-03-31 | old src old test [Y. Yan]
* f9b4935 2016-03-31 | old src new test [Y. Yan]
* 6bf6585 2016-03-31 | new src new test [Y. Yan]
* 71209a6 2016-03-31 | new src old test [Y. Yan]
* 3114478 2016-03-15 | bugfix: anti-flow for push pop and peek [Y. Yan]

我想要做的是删除提交63a7b9f并将头移至ad8d3f2。我并不关心63a7b9f中的任何事情。所以我做了

git reset --hard ad8d3f2
HEAD is now at ad8d3f2 adding gitignore

它似乎删除了提交,但我有这个让我烦恼的事情:

git status

HEAD detached from 63a7b9f
nothing to commit, working directory clean

所以我很奇怪HEAD为什么不动。我确实希望HEAD指向ad8d3f2。我想要像git reset之后的那样:

git status
HEAD detached at ad8d3f2

解决方案:所以建议使用分支的答案给了我一些想法来解决我的问题。请注意,我忘了提及所有提交都处于状态HEAD detached at <commit>

git branch temp
git checkout temp
git checkout ad8d3f2 //may not be necessary
git branch -d temp

在此之后,我得到了我想要的状态。

3 个答案:

答案 0 :(得分:2)

输出HEAD detached from <commit>基于HEAD reflog ,而不是其当前值。这可能是一个错误,但它并不意味着你现在不是一个不同的独立HEAD。

具体来说,一旦HEAD分离,就没有分支重置。使用git reset --hard <commit>只需设置索引和工作树,同时将HEAD 设置为提交的,就好像您已经完成了另一个git checkout -f <commit>一样。 HEAD 仍然分离;只有git checkout <name>,对于某个有效的分支名称<name>,才会重新附加您的HEAD

答案 1 :(得分:0)

git reset --hard HEAD^1怎么样?

答案 2 :(得分:0)

查看您的工作树,似乎您要删除上一次提交。这里有几个选项,其中一些包括:

    同时移动HEAD指针时,
  • git reset 。您可以使用

    执行此操作
    git reset --hard HEAD^
    

    这会在您上次提交之前将HEAD重置为提交,或者在工作树中提交ad8d3f2

  • git checkout 到新分支,从第二个到最后一个提交ad8d3f2分支。

    git checkout ad8d3f2 .
    

    命令末尾的.ad8d3f2更改应用于整个工作树。如果您在上次提交中添加了文件,则可能会遇到一些麻烦,因为此方法不会删除它们。

  • 另一方面,
  • git revert 会删除上次提交时添加的文件。

    git revert --no-edit HEAD^
    

    如果您不想重写提交历史记录,或者如果您已经推送到远程仓库并且不想强制推送,那么这也是一个不错的选择 - 它会创建一个“还原”提交