我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
当前回答
这种方法可能会丢弃部分提交历史记录,但如果旧主分支和当前状态的合并很棘手,或者您不介意丢失部分提交历史,则会更容易。
要简单地保持当前状态而不合并,请将当前分离的HEAD转换为主分支:
手动备份存储库,以防发生意外错误。提交您要保留的最后更改。创建一个临时分支(让我们将其命名为分离头),该分支将包含当前状态的文件:
git checkout -b detached-head
(a) 如果不需要保留主分支,请将其删除
git branch -D master
(b) 如果要保留,请重命名
git branch -M master old-master
将临时分支重命名为新的主分支
git branch -M detached-head master
资料来源:改编自Gary Lai的这篇Medium文章。
其他回答
HEAD是一个指针,它直接或间接指向特定的提交:
连接的HEAD表示它连接到某个分支(即它指向某个分支)。分离的HEAD意味着它不附加到任何分支,即它直接指向某个提交。
换句话说:
如果它直接指向提交,则HEAD被分离。如果它间接指向提交(即,它指向分支,而分支又指向提交),则会附加HEAD。
为了更好地理解带有附加/分离头的情况,让我们展示通向上面四幅图片的步骤。
我们从存储库的相同状态开始(所有象限中的图片都相同):
现在我们要执行git签出-在单个图片中使用不同的目标(顶部的命令变暗以强调我们只应用这些命令):
以下是执行这些命令后的情况:
如您所见,HEAD指向git checkout命令的目标-指向分支(四元组的前3个图像),或(直接)指向提交(四元组最后一个图像)。
工作目录的内容也会更改,以符合适当的提交(快照),即HEAD(直接或间接)指向的提交。
因此,现在我们的情况与答案开头的情况相同:
您可能做了git重置--硬原点/分支。
试着在你的分行结账
这是我在意识到自己头脑清醒,已经做出了一些改变之后所做的事情。
我提交了更改。
$ git commit -m "..."
[detached HEAD 1fe56ad] ...
我记得提交的哈希值。然后我检查了我本该去的那家分店。
$ git checkout master
Switched to branch 'master'
最后,我将提交的更改应用于分支。
$ git cherry-pick 1fe56ad
[master 0b05f1e] ...
我认为这比创建一个临时分支要简单一些。
通常HEAD指向分支。当它不是指向分支,而是指向像69e51这样的提交散列时,这意味着你有一个分离的HEAD。你需要指出两个分支来解决这个问题。你可以做两件事来解决它。
git checkout other_branch//当您需要提交哈希中的代码时不可能创建一个新分支,并将提交哈希指向新创建的分支。
HEAD必须指向分支,而不是提交哈希是黄金法则。
分离的头意味着你没有正确地签出你的分支,或者你刚刚签出了一个提交。
如果您遇到这样的问题,请首先隐藏本地更改,这样您就不会丢失更改。
之后。。。使用以下命令签出所需的分支:
假设您想要分支MyOriginalBranch:
git checkout-b someName origin/MyOriginalBranch