如何修复在git中检出HEAD^

11

好的,我在我的项目中进行了一些更改,结果变得一团糟。 我已经提交了更改,以便稍后回到它,然后使用git checkout HEAD^检出先前的提交。 现在,当我对项目进行提交时,命令行显示SHA-1作为工作分支(而不是主分支)

我并不知道关于git的全部,但我猜想HEAD仍指向我破损的副本,因为我已经解决了问题。 我该如何将HEAD指向我正在使用的最新提交?

我猜想这与rebase有关,但我不确定。

谢谢。

3个回答

23

现在我正在对我的项目进行提交,但命令行显示的是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的提交”)。


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是混淆提交的哈希值。


1

我认为你要找的是git reset命令:

git checkout HEAD
git reset --hard HEAD^

这将把“master”返回到当前HEAD之前的一个修订版本。您目前使用的是“分离头”,因为它没有与其关联的符号名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接