如何修复在git中检出HEAD ^

时间:2009-11-10 05:06:46

标签: git git-svn

好的,所以我在我的项目中做了一些修改,导致了一个巨大的混乱。我已经提交了更改,所以我可以稍后再回到它,然后使用git checkout HEAD ^来检查先前的提交。现在我正在对我的项目进行提交,它将命令行上的SHA-1显示为工作分支(而不是主分区)

我不知道有关git的一切知识,但我猜HEAD仍然指着我的破碎副本,因为我正在切断并解决了问题。我怎样才能将HEAD指向我正在进行的最新提交?

我猜这与rebase有关,但我不是百分百肯定。

感谢。

3 个答案:

答案 0 :(得分:23)

现在我正在对我的项目进行提交,它将命令行上的SHA-1显示为工作分支(而不是主分支)

这可能意味着你有一个“独立的头部”。分离的HEAD直接指向提交而不是指向分支(然后指向提交)。一个独立的头像一个未命名的分支。

此状态是由git checkout HEAD^命令引起的,因为HEAD^是指提交,而不是分支名称。你可能想要git reset --hard HEAD^ - ,而 master 仍然是活动分支 - 从 master 中删除最近的提交(它仍然存在于磁盘上并且可以通过reflog访问,直到它在reflog中的条目到期为止。)

如何将HEAD指向我正在处理的最新提交?

HEAD始终是您正在进行的提交,无论它是否已分离。

如果您的意思是“如何将 master 指向我正在使用的最新提交?”,那么就像询问“我如何获得 master 指向HEAD?“。答案是

git branch -f master HEAD

(实际上,您可以不使用HEAD,因为这是默认设置)。这会强制将 master 重置为当前HEAD的提交。无法通过另一个分支或当前HEAD访问的 master 上的任何提交将只能通过reflog访问,并最终将被垃圾收集(这将从 master中丢弃) master 中不在HEAD中的任何内容。您可能还希望在此之后将HEAD重新附加到此更新后的主文件中。

git checkout master

您可以先重新挂接HEAD,然后使用以下两个连续命令重置 master ,而不是上面的两个命令:

git checkout master         # reattach, commit at HEAD is now the unwanted commit
git reset --hard HEAD@{1}   # reset master to the commit at HEAD before the prior command

HEAD@{1}表示法用于访问reflog中的条目。此示例仅表示“之前的HEAD”(即“最近一次影响HEAD的操作之前HEAD的提交”。

答案 1 :(得分:3)

git checkout HEAD
git reset HEAD^

这将删除最近的提交。确认它适用于svn log

我注意到你标记了这个git-svn。这只有在你还没有将混乱的提交推送到svn时才有效。如果你有,你需要应用混乱的提交的反向合并,如下所示:

$ git log
commit 30480f327040f812cb2afffdd1cdd374bf26fe83
Author: you
Date: today

    messed up commit

$ git revert 30480f327040f812cb2afffdd1cdd374bf26fe83

其中30480f327040f812cb2afffdd1cdd374bf26fe83是乱搞提交的哈希值。

答案 2 :(得分:1)

我认为你要找的是git reset

git checkout HEAD
git reset --hard HEAD^

这将使“master”返回到当前HEAD之前的一个修订版本。你现在正在使用的是一个“独立头”,因为它没有与之相关的符号名称。