我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
当前回答
分离的头部意味着您不再在分支上,您已经在历史中签出了一个提交(在本例中,提交是head之前的提交,即head^)。
如果要删除与分离的HEAD关联的更改
你只需要检查你所在的分行,例如。
git checkout master
下次更改文件并希望将其恢复到索引中的状态时,不要先删除该文件,只需执行以下操作
git checkout -- path/to/foo
这将把文件foo恢复到索引中的状态。
如果您希望将更改与分离的HEAD保持关联
运行gitbranchtmp-这将在名为tmp的新分支中保存更改。运行git签出主机如果您想将所做的更改合并到master中,请从master分支运行gitmergetmp。运行git checkout master后,您应该在master分支上。
其他回答
这是我在意识到自己头脑清醒,已经做出了一些改变之后所做的事情。
我提交了更改。
$ git commit -m "..."
[detached HEAD 1fe56ad] ...
我记得提交的哈希值。然后我检查了我本该去的那家分店。
$ git checkout master
Switched to branch 'master'
最后,我将提交的更改应用于分支。
$ git cherry-pick 1fe56ad
[master 0b05f1e] ...
我认为这比创建一个临时分支要简单一些。
git pull origin master
对我来说很有用。它只是明确地给出了远程和分支名称。
当我开始使用git时,这对我来说是一件令人困惑的事情,后来我明白了为什么会发生这种情况,以及处理这种情况的最佳方法是什么。
出现这种情况的根本原因是,通常gitHEAD总是指向某个分支,当您试图将HEAD指向某个特定的提交时,就会将HEAD置于分离的HEAD状态。
HEAD连接时的状态-
cat .git/HEAD # output--> ref: refs/heads/master or ref: refs/heads/main
当HEAD处于分离状态时-
cat .git/HEAD # output--> b96660a90cad75867453ebe1b8d11754bbb68b0e <commit hash>
解决方案-
git stash # Temporarily shelves (or stashes) changes
git branch # Find your default branch
git switch master # Point HEAD to master or main branch
git stash pop # Apply all the changes you had previously
分离的HEAD表示您当前不在任何分支上。如果您想保留当前的更改并简单地创建一个新分支,您可以这样做:
git commit -m "your commit message"
git checkout -b new_branch
之后,您可能希望将此新分支与其他分支合并。git“a dog”命令总是有用的:
git log --all --decorate --oneline --graph
HEAD是一个指针,它直接或间接指向特定的提交:
连接的HEAD表示它连接到某个分支(即它指向某个分支)。分离的HEAD意味着它不附加到任何分支,即它直接指向某个提交。
换句话说:
如果它直接指向提交,则HEAD被分离。如果它间接指向提交(即,它指向分支,而分支又指向提交),则会附加HEAD。
为了更好地理解带有附加/分离头的情况,让我们展示通向上面四幅图片的步骤。
我们从存储库的相同状态开始(所有象限中的图片都相同):
现在我们要执行git签出-在单个图片中使用不同的目标(顶部的命令变暗以强调我们只应用这些命令):
以下是执行这些命令后的情况:
如您所见,HEAD指向git checkout命令的目标-指向分支(四元组的前3个图像),或(直接)指向提交(四元组最后一个图像)。
工作目录的内容也会更改,以符合适当的提交(快照),即HEAD(直接或间接)指向的提交。
因此,现在我们的情况与答案开头的情况相同: