1 既上一篇往Gitlab推送项目(并且出现! [rejected] master -> master (fetch first)])
我们上一篇搭建了Gitlab环境后,创建了组和用户,并且将该用户拉进该组。当我将一个已有项目通过add,commit,最后push推送时,出现了! [rejected] master -> master (fetch first)]错误。
一开始很坑,百度操作后更种报错,导致越来越蒙,还以为新建的项目没有master分支(因为项目界面没有显示master,只有clone这个选项),需要添加ReadMe文件让它自动创建分支,最后发现是错误的,根本不需要这样操作让其显示master分支。
1.1 然后我就开始测试:
首先我在一个空目录添加一个ReadMe.txt文件,然后按照add,commit,push正常推送,结果发现是完全没问题的,推送之后gitlab页面就显示了master分支。但是我不知道我上面为啥推送我的项目时会出现错误,而推送ReadMe.txt却不会,它们不也是相当于已有项目吗?
1.2 继续测试
接着将上面测试用的本地仓库目录(有ReadMe.txt文件的目录)删掉,并且使用相关命令将远程库中的ReadMe.txt也删掉。然后去到已有项目目录中,继续push推送,结果就出现了上述截图的问题。
然后我也不理它为啥会这样了,我测试过出现这种情况有:远程库多了一个ReadMe而本地是一个已有项目。或者远程库没有ReadMe而本地也是一个已有项目。具体原因也不知道是什么,说白了就是因为本地仓库和远程仓库不一致。
下面我直接给出我的解决方案,看下图。
2 解决该错误
解决该错误,只需要两步即可,其它内容我只是记录起来,方便以后可能会出现错误干扰的因素,方便快速排查。
2.1 先拉取远程库到本地进行合并
git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。
关于rebase的详解,可以看这篇文章(git rebase简介(基本篇)),简单易懂。
git pull --rebase origin master
结果如下:
2.2 重新推送
git push origin master
结果如下:
页面可以看到推送的结果。
3 注意
我在创建新的项目的时候,我将开发者的权限改为了所有者,不知道会不会影响到出现这个[rejected] master -> master (fetch first)]错误后,按上面的处理,是否会影响其推送成功的可能性。
因为我一开始也是这样处理的,但是没有成功(不过我的commit是前一晚提交的,不知道会不会成为错误因素,不过个人感觉可以忽略)。当然如果你成功推送了就不需要看这里了。