1. 前言
本文解决由于git 处于游离状态下不能提交代码的问题。文章由导致原因,解决方法和思考三个内容组成。
2. 问题复现
我们从远程仓库 clone 代码下来,进行需求开发,可能进行了以下步骤。
(1)git clone /xxx/demo.git
这时候将远程仓库的默认分支克隆下来了,本文中的默认分支时master分支,但是我需要基于feature分支或者其他分支进行开发。所以有接下来的动作。
(2)git checkout origin/newbranch1
将远程的 newbranch1 分支 checkout。问题就出现在这里。不管是记错命令还是因为不熟git都可能会出现这样的失误。
这个命令将导致git 的HEAD指向远程分支,是处于一个游离状态,如果只是看代码这个动作是OK的,但是要基于此进行开发那是有些问题的。通过git branch
命令来看git的分支状态,可以看到HEAD detached at origin/newbranch1
,如下图所示。
(3)然后你忙活了一天写了很多东西,熟练的git add、git commit、git pull
,到git push origin xxx
的时候出问题了:
error: src refspec newbranch1 does not match any.error: failed to push some refs to '/xxx/express-sequelize-mysql-demo.git'
怎么解决呢?
3. 解决方法
注意,一定要将修改的代码提交到本地仓库区,否则接下来的动作可能导致你的代码没了!
注意,一定要将修改的代码提交到本地仓库区,否则接下来的动作可能导致你的代码没了!
注意,一定要将修改的代码提交到本地仓库区,否则接下来的动作可能导致你的代码没了!
将修改的代码提交到本地仓库区,就是要执行git add . git commit
动作。
接下来是解决问题的步骤了:
(1)新建本地分支git branch temp
,新分支会记录你修改的代码,不能直接checkout到其他分支,不然你的代码要没有了。
(2)我们要提交代码到newbranch1分支(你想要提交代码的目标分支名称),那么执行git branch newbranch1
。
执行这一步,git会在本地仓库建立一个newbranch1的分支,并关联到远程仓库的newbranch1分支。
(3)切换到newbranch1分支,执行git checkout newbranch1
。
(4)将temp临时分支与newbranch1分支合并,git merge temp
。
(5)看看代码,是不是ok了,你会发现是的,没错了。那拉取一下git pull origin newbranch1
,再git push origin newbranch1
就提交上去了。
(6)删除本地临时分支,它没有价值了,git branch -d temp
。
到这里就全部解了,但还是要思考一下如何避免问题的出现。
4. 一些思考
我们如果要基于某个分支进行开发,不要执行2 -(2)中的git checkout origin/newbranch1
命令,这将导致git指向游离状态,在一些多人协作的复杂场景下是需要用到了,但如果只是较为简单的小项目上我们可以这么做:
(1)git clone下来之后,通过git checkout newbranch1
就能直接检出并切换到远程仓库的newbranch1分支了。这个方法的话,没有newbranch1会自动创建并切换到该分支。
(2)当然,还有个方法。就是通过git branch newbranch1
创建分支,然后再切换到分支git checkout newbranch1
。
还是要拿个仓库动手试试才能明白,光看这个你就可能晕掉了,动手吧
5. 给作者加加油吧
对你有帮助的话,一杯咖啡让作者更有动力~ (click)