对于一个新仓库,如果里面没有一条推送记录,写好代码后指定仓库地址直接推送是没问题的,但是如果创建仓库的时候推送了一行测试代码或者其他,导致仓库已经存在了master分支的推送记录,这个时候把写好的代码推送的远程仓库时报错:
无法推送到远程仓库,因为你的本地分支位于远程分支的后面。
尝试1,不OK
执行:git pull origin master --allow-unrelated-histories
但是被git中断了:

意思是:有未跟踪的工作区文件会被合并操作覆盖。
为什么会失败?
-
问题根源 :您的本地有一些未跟踪的文件 (比如编译生成的
.dll、.pdb、.suo、.cache等) -
冲突类型 :Git 检测到如果执行
pull,远程仓库的文件会覆盖您本地的这些文件 -
Git 保护机制:为了避免您丢失本地的文件,Git 主动中止了操作
这些文件是什么?
从列表可以看到,主要是:
-
编译输出文件 :
bin/Debug/、obj/Debug/目录下的文件 -
IDE 配置文件 :
.vs/、.suo、.user等 Visual Studio 配置文件 -
临时文件 :各种
.cache文件
我的理解:
git pull origin master --allow-unrelated-histories 是先拉取后合并的操作,
当 Git 说 "would be overwritten by merge" 时,意思是:
-
远程仓库有这些文件
-
您的本地也有这些文件(但未跟踪)
-
Git 要下载远程的这些文件
-
这会覆盖您本地的同名文件
此时在本地把这些提及到的文件都删除再次执行git pull origin master --allow-unrelated-histories应该没问题了,然后再执行git push origin master:master推送当前主分支。
后面再遇到类似的问题可以试一下。
尝试2,OK:
但是我没这样尝试,鉴于我的远程仓库中的文件是测试文件,并没什么卵用,我使用强制推送也可以把本地文件推送到仓库分支上:
git push origin master --force
效果就是远程变成和本地完全一样,根据个人情况使用。