好的,我在我的项目中进行了一些更改,结果变得一团糟。 我已经提交了更改,以便稍后回到它,然后使用git checkout HEAD^检出先前的提交。 现在,当我对项目进行提交时,命令行显示SHA-1作为工作分支(而不是主分支)
我并不知道关于git的全部,但我猜想HEAD仍指向我破损的副本,因为我已经解决了问题。 我该如何将HEAD指向我正在使用的最新提交?
我猜想这与rebase有关,但我不确定。
谢谢。
现在我正在对我的项目进行提交,但命令行显示的是SHA-1而不是master分支
这可能意味着你处于“分离头指针”的状态。分离头指针直接指向一个提交,而不是指向一个分支(然后再指向一个提交)。分离头指针就像一个没有名称的分支。
这种状态是由你的git checkout HEAD^
命令引起的,因为HEAD^
指的是一个提交,而不是一个分支名称。你可能想执行git reset --hard HEAD^
,当时master仍然是活动分支, 以此来撤销最近一次提交(它仍然存在于磁盘上,并且可以通过reflog访问直到其在reflog中的条目过期)。
如何将HEAD指向我当前工作的最新提交?
无论是否分离,HEAD
始终指向你正在工作的提交。
如果你的意思是“如何将master指向我当前工作的最新提交?”,那么这与询问“如何使master指向HEAD
?”是相同的。答案是:
git branch -f master HEAD
实际上,你可以省略 HEAD
,因为它是默认值。这将强制重置 master 至当前位于 HEAD
的提交。任何在 master 上的提交,如果无法通过另一个分支或当前的 HEAD
到达,从此以后只能通过 reflog 到达,并最终被垃圾回收(这将丢弃不在 HEAD
中的 master 中的任何内容)。完成此操作后,您可能还想重新将您的 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
的提交”)。
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是混淆提交的哈希值。
我认为你要找的是git reset
命令:
git checkout HEAD
git reset --hard HEAD^
这将把“master”返回到当前HEAD之前的一个修订版本。您目前使用的是“分离头”,因为它没有与其关联的符号名称。