我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
我在我的存储库中做一些工作,注意到一个文件发生了本地更改。我不再需要它们了,所以我删除了文件,以为我可以签出一份新的副本。我想做的Git相当于
svn up .
使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站
git checkout HEAD^ src/
(src是包含已删除文件的目录)。
现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?
当前回答
如果你做出了改变,然后意识到你是一个独立的人,你可以这样做: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 add .
但是,如果您只更改或删除了现有文件,则可以通过以下方式同时添加(-a)和提交消息(-m):
git commit -a -m "my adjustment message"
然后,您可以简单地使用当前状态创建一个新分支:
git checkout -b new_branch_name
你将有一个新的分支,所有的调整都将在新分支中。然后,您可以根据需要继续推送到远程和/或签出/拉入/合并。
如果您已经更改了不想丢失的文件,可以将其推送。我已经在分离模式下提交了它们,之后您可以移动到一个临时分支以稍后在master中集成。
git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work
摘自:
如何处理在分离的头脑中做出的承诺
这种方法可能会丢弃部分提交历史记录,但如果旧主分支和当前状态的合并很棘手,或者您不介意丢失部分提交历史,则会更容易。
要简单地保持当前状态而不合并,请将当前分离的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(直接或间接)指向的提交。
因此,现在我们的情况与答案开头的情况相同:
不创建临时分支的解决方案。
如何退出(“修复”)分离的HEAD状态,当您已经在该模式中更改了某些内容,并且(可选)想要保存更改时:
提交要保留的更改。如果您想接管在分离HEAD状态下所做的任何更改,请提交它们。喜欢:gitcommit-a-m“您的提交消息”放弃不想保留的更改。硬重置将丢弃您在分离HEAD状态下所做的任何未提交的更改:git重置--硬(如果没有这一点,步骤3将失败,抱怨分离的HEAD中修改了未提交的文件。)查看您的分支。通过检查之前处理的分支来退出分离的HEAD状态,例如:切换到主分支接管你的承诺。现在,您可以通过樱桃采摘来接管在分离HEAD状态下所做的提交,如我对另一个问题的回答所示。数字刷新gitcherry-pick<hash1><hash2><hash3>…