好的,所以我在我的项目中做了一些修改,导致了一个巨大的混乱。我已经提交了更改,所以我可以稍后再回到它,然后使用git checkout HEAD ^来检查先前的提交。现在我正在对我的项目进行提交,它将命令行上的SHA-1显示为工作分支(而不是主分区)
我不知道有关git的一切知识,但我猜HEAD仍然指着我的破碎副本,因为我正在切断并解决了问题。我怎样才能将HEAD指向我正在进行的最新提交?
我猜这与rebase有关,但我不是百分百肯定。
感谢。
答案 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之前的一个修订版本。你现在正在使用的是一个“独立头”,因为它没有与之相关的符号名称。