本文关于解决如述 Git 上传问题及分析问题出现原因,且提供了两个解决方案来以此应对。

推荐方案

思路:先拉取远程仓库的代码文件到本地进行合并后,再推送到远程仓库
优点:可以不干扰到他人的Commit logs(提交记录)

方案

1
2
3
git fetch origin master // 下载远程 origin(起源) 仓库的 master(主) 分支到本地(假设你有多条分支在远程仓库上
git merge origin/master // 假设你在本地 master 分支上,合并远程的 origin/master 分支
git push origin master // 成功运行前两条,就可以顺利推送到远程仓库主分支了

fatal: 拒绝合并无关的历史 …

1
2
git pull origin master --allow-unrelated-histories // 允许拉取无关历史的远程仓库主分支文件到本地,并进行合并
git push origin master // 成功运行,就可以顺利推送到远程仓库主分支了

如果你担心,合并会不会覆盖掉我的一些文件或代码,那你需要了解以下知识[1]

git分支合并把代码覆盖的问题
git分支合并把代码覆盖的问题

激进方案

使用自己本地仓库强制推送到远程仓库,若有重复的文件,将会使得本地文件强制覆盖远程文件,这将会导致你远程仓库上**其他人的提交记录(Commit logs)也全被覆盖清空。

方案

1
git push -f gitee master
强制推送
强制推送

注意

推送后果
推送后果

后果

如图,近 7 天里本来是有其他成员的提交记录,现在已经分支已经砍掉别人的记录,然后从我上一个提交记录开始接上[2]

提交覆盖
提交覆盖

分析原因

模拟情景

你的项目是多人(或多设备)协作的,当你的团队成员(或其他设备)提交了新的文件代码,上传到(如) Gitee 平台 的远程仓库 hexo_Cache 的 master 主分支上,而你并没有选择先进行拉取合并其他人提交的工作,而选择直接上传你的到远程仓库分支上,就会出现如下报错:

Gitee 平台提交报错
Gitee 平台提交报错

为此我特地尝试在我的另一台设备 Surface 上,提交一个测试文件到 Gitee 平台 的远程仓库 hexo_Cache 的 master 主分支上,然后在我另一台设备 Mibook 尝试直接上传,发现情况属实出现报错。而我选择上传到 GitHub 平台 的远程仓库 Origin 的 master 主分支上时,则显示成功上传(那是因为我事先并未在 GitHub 上有上传其他新的 (已提交的) 东西:

GitHub 平台提交成功
GitHub 平台提交成功

参考链接

1. OSCHINA - git分支合并把代码覆盖的问题?,malle0 ,彩阳

2. 百度经验 - GIT学习–(19) Git操作禁忌之git push -f, 爱做菜的技术宅