我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
当前回答
Git:您当前不在分支上。
Git不时显示:
将历史推到当前(分离的HEAD)立即状态,使用git push origin HEAD:<name of remote branch>
这意味着:
“HEAD没有分支”
要修复此问题,请运行2个命令:
gitbranch-f{{your_working_branch}}HEAD—将分支设置为头部git checkout{{your_working_branch}}--checkout==开关分支
其他回答
分离的头部意味着您不再在分支上,您已经在历史中签出了一个提交(在本例中,提交是head之前的提交,即head^)。
如果要删除与分离的HEAD关联的更改
你只需要检查你所在的分行,例如。
git checkout master
下次更改文件并希望将其恢复到索引中的状态时,不要先删除该文件,只需执行以下操作
git checkout -- path/to/foo
这将把文件foo恢复到索引中的状态。
如果您希望将更改与分离的HEAD保持关联
运行gitbranchtmp-这将在名为tmp的新分支中保存更改。运行git签出主机如果您想将所做的更改合并到master中,请从master分支运行gitmergetmp。运行git checkout master后,您应该在master分支上。
如果你做出了改变,然后意识到你是一个独立的人,你可以这样做:stash->checkout master->stash pop:
git stash
git checkout master # Fix the detached head state
git stash pop # Or for extra safety use 'stash apply' then later
# after fixing everything do 'stash drop'
您将拥有未提交的更改和正常的“附加”HEAD,就像什么都没有发生一样。
由于“分离的头状态”使您处于临时分支,所以只需使用git checkout,这将使您处于上一个分支。
HEAD是一个指针,它直接或间接指向特定的提交:
连接的HEAD表示它连接到某个分支(即它指向某个分支)。分离的HEAD意味着它不附加到任何分支,即它直接指向某个提交。
换句话说:
如果它直接指向提交,则HEAD被分离。如果它间接指向提交(即,它指向分支,而分支又指向提交),则会附加HEAD。
为了更好地理解带有附加/分离头的情况,让我们展示通向上面四幅图片的步骤。
我们从存储库的相同状态开始(所有象限中的图片都相同):
现在我们要执行git签出-在单个图片中使用不同的目标(顶部的命令变暗以强调我们只应用这些命令):
以下是执行这些命令后的情况:
如您所见,HEAD指向git checkout命令的目标-指向分支(四元组的前3个图像),或(直接)指向提交(四元组最后一个图像)。
工作目录的内容也会更改,以符合适当的提交(快照),即HEAD(直接或间接)指向的提交。
因此,现在我们的情况与答案开头的情况相同:
当您在git中签出一个特定的提交时,您将处于分离的头部状态。。。也就是说,您的工作副本不再反映命名引用的状态(如“master”)。这对于检查存储库的过去状态非常有用,但如果您确实试图恢复更改,则不需要检查。
如果您对特定文件进行了更改,并且只想放弃这些更改,则可以使用如下签出命令:
git checkout myfile
这将丢弃所有未提交的更改,并将文件恢复到当前分支头部的任何状态。如果要放弃已提交的更改,可以使用reset命令。例如,这将将存储库重置为上一次提交的状态,并放弃任何后续更改:
git reset --hard HEAD^
但是,如果您与其他人共享存储库,git重置可能会造成中断(因为它会擦除存储库历史的一部分)。如果您已经与其他人共享了更改,您通常希望查看git-restore,它会生成一个“反提交”,也就是说,它会创建一个新的提交来“撤消”所涉及的更改。
GitBook有更多细节。