Git - 如何将游离分支的代码提交到目标分支 (HEAD detached from XXXX解决方法)
游离分支
一般情况下,HEAD 会指向某个分支的某个Commit-ID。但是 HEAD 偶尔会发生「没有指向某个本地分支」的情况,这种状态的 HEAD 称为 detached HEAD 。
HEAD detached at head // 游离HEAD
游离状态的本质上是本地的HEAD指向了一个未知的分支,HEAD不会指向任何分支,严谨的说是HEAD指向了一个没有分支名字的修订版本,此时已经处于游离状态。
哪些情况可能会出现detached HEAD
1)使用 git checkout 跳转至某个 Commit-ID,而这个 Commit-ID 刚好目前没有分支指向它。当切换至其他分支时,这个 (HEAD detached at e0c619c) 临时分支是会被干掉。可以使用 git switch -c <new-branch-name> 命令来创建一个新分支来指向该 Commit-ID
2)Rebase 的过程其实也是处于不断的detached HEAD状态
3)切换至某个远程分支
解决方案
head指针处于游离状态,需要建立一个临时分支然后将它合并到目标分支,最后删除那个临时分支即可。
1. 检出到该提交
git reflog // 使用查看Git操作历史
如果想要操作这个特定的提交,可以直接检出:
git checkout 16c80e5
这将把HEAD指向这个特定的提交,再次进入一个游离HEAD状态。
2. 创建一个新分支来保存这个提交
在这个游离HEAD状态下,创建一个新分支:
git branch dev-test-16c80e5
这样做将会保存在16c80e5提交上的改动到一个新的分支dev-test-16c80e5上。
3. 切换到目标分支并合并
切换到目标分支(例如dev-test)并将这个新分支合并进去:
git checkout dev-test
git merge dev-test-16c80e5
4. 推送目标分支到远程仓库
git push origin dev-test
5. 清理
合并完成后,如果确认所有改动都已经正确地合并到了目标分支,可以删除临时分支:
git branch -d dev-test-16c80e5
如果git提示该分支尚未完全合并而拒绝删除,可以使用-D选项强制删除:
git branch -D dev-test-16c80e5
6. 预防
如果在提交代码之前就发现是游离分支,可以执行:(本地创建一个’xxx’的分支,之后会关联到远程分支)
git checkout -b xxx(分支名) origin/xxxx(远程分支)
查看对应的分支,就可以正常提交代码,完美规避了detached HEAD(游离分支)的情况
总结:
通过这个流程,可以安全地将不小心提交到游离分支的改动移动到正确的分支上,同时确保所有改动都得到保留。这个过程利用了git reflog来找回可能丢失的提交,并通过创建新分支、合并以及清理临时分支的方式来纠正错误,确保代码的安全和项目的整洁。