Git执行rebase后分支栏显示Detached状态无法推拉代码如何解决
问题根因
你的操作顺序有误,直接导致了游离头(Detached HEAD)状态和无效rebase流程:
- 执行完
git checkout develop和git pull后,你当前的工作分支就是develop,此时运行git rebase develop本质是在develop分支上rebase自身,属于无意义操作。冲突触发后Git会自动切换到游离的提交节点,就会出现VS的Git Changes窗口显示Detached、推送/拉取按钮置灰不可用的现象。 - 子分支rebase父分支的正确逻辑是:先切到你的子功能分支,再以最新的develop分支为基准做rebase,不是在develop分支上执行rebase命令。
修复操作
按顺序在Git Bash中执行以下命令即可:
- 先终止当前异常的rebase流程,退出游离状态
git rebase --abort
执行完成后会自动回到之前停留的develop分支,Detached状态会直接消失。
2. 切换到你需要合并develop代码的子分支,将命令中的<your-feature-branch>替换为你自己的子分支名称
git checkout <your-feature-branch>
- 停留在子分支上,执行rebase命令对接最新的develop代码
git rebase develop
- 如果此时再次弹出冲突提示,属于正常流程,按以下步骤处理即可:
- 打开VS编辑器,逐个定位标记为冲突的文件,选择保留需要的代码段、合并两边的改动,删除文件里自动生成的
<<<<<<</=======/>>>>>>>冲突标记 - 每解决完一个文件的冲突,执行
git add <已解决冲突的文件路径>标记该文件冲突处理完成 - 所有冲突全部标记解决后,执行
git rebase --continue即可走完整个rebase流程 - 如果中途改乱了想撤销操作,随时执行
git rebase --abort就能回到rebase开始前的子分支状态,不会丢失原有代码
- 打开VS编辑器,逐个定位标记为冲突的文件,选择保留需要的代码段、合并两边的改动,删除文件里自动生成的
注意:rebase会改写分支的提交历史,完成后如果要将本地子分支推送到远程仓库,需要加上
-f参数执行强制推送:git push -f origin <your-feature-branch>。强制推送仅可在你自己负责的个人子分支上使用,绝对不要在develop、main这类公共协作分支上执行强制推送,避免覆盖其他人提交的代码。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

