news 2026/10/3 9:17:07

Git推送实战:从首次push到远程仓库报错排查全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git推送实战:从首次push到远程仓库报错排查全流程

年初我带的一个新人第一次用Git往远端推代码,敲完git push origin main之后屏幕刷出一片英文,当场就懵了。他回头问我:"代码到底推上去没有?" 我说你先把报错读完,他念到一半就卡住了——不是不认识单词,而是完全不知道 Git 在朝他吼什么。这种场景我见得太多了。

其实"Git 推送代码到远程"这件事,拆开看就三个问题:本地仓库和远程仓库分别是什么状态、推送这个动作到底在做什么、报错信息在说什么。这篇文章不打算讲那些绕来绕去的概念,直接以"把代码从本地推到远程"这条主线路,把安装、配置、首次推送、报错排查、日常协作技巧全部串起来。不管你是刚装了 Git 的纯新手,还是已经写过几行git add但推送总出问题的半熟手,这篇都适用。我会尽量把每个操作背后的"为什么"也说清楚,免得你只会复制命令,一换场景就抓瞎。

1. 推送前必须想明白的事:本地、远程、暂存区到底在忙什么

很多人推送失败,根子不在命令敲错,而是脑子里对 Git 的模型是模糊的。所以正式开始之前,我先用一个日常比喻把这套逻辑讲透。

1.1 用"草稿本"和"公告栏"理解 Git 的三层结构

Git 本地仓库内部其实有三块区域:工作区(你眼睛看到的文件)、暂存区(一个临时存放改动的区域)、本地仓库(已经提交的历史记录)。远程仓库相当于办公室里的公告栏,你把内容贴上去,别人才能看到。

你平时的改动发生在工作区,文件修改完只是"草稿"状态。git add是把草稿选出来放进暂存区,相当于你挑了几页准备贴出去的内容。git commit是把暂存区里的内容正式登记进本地历史,相当于给自己的草稿拍了照,存进个人相册。而git push才是把相册里某一张照片贴到公告栏上。

远程仓库和本地仓库并不是实时同步的。很多新手以为在本地 commit 了就等于推上去了,这是最大的误解。commit 只存在于你这台电脑上,别人拉代码根本看不到,只有 push 之后远端才有。

1.2 推送的本质:提交记录的"上传"而非文件的"复制"

再往深一层说,git push传输的不是文件本身,而是提交记录(commit)。Git 会把本地仓库里存在于远端缺失的所有提交记录打包传过去,然后远端仓库更新它的指针指向最新提交。整个过程就像给公告栏的相册补照片,不是把整本相册重新搬一遍,而是只发送新增的部分。

这个机制带来一个关键推论:只要本地没有新提交,git push就什么都不传。有时候你执行git push提示 "Everything up-to-date",不是命令没生效,而是真的没有新东西可以推。想清楚这一点,很多"推送没反应"的困惑就解开了。

1.3 远程仓库的两种来源:克隆来的和自己手动关联的

远程仓库的关联方式,决定了你接下来的 push 命令怎么敲。我见过不少新手在这上面原地打转:

第一种情况,你在 GitHub、Gitee(码云)或者公司内部的 GitLab 上新建了一个空仓库,然后按照提示执行git clone把仓库下到本地。这种情况下远程地址已经被 Git 自动配置好了,你直接 commit 然后 push 就行。

第二种情况,你本地已经有一个项目文件夹,里面根本没初始化为 Git 仓库,这时你要先git init,再手动添加远程地址,也就是git remote add origin。很多教程把这两个流程混在一起讲,导致新手分不清自己处于哪个状态。

我建议你在动笔之前,先跑一下git remote -v看看本地到底有没有关联远程。如果有输出,说明是克隆来的或者已经配好了;如果空白一片,那就得手动关联。这个命令花三秒钟,能帮你少走二十分钟弯路。

2. 动手前的准备工作:安装、身份配置和远程仓库关联

2.1 三个平台下的 Git 安装方式

Git 的安装其实没什么技术含量,但版本选择有一点讲究。Windows 用户直接去 Git 官网下载 Git for Windows,安装时一路默认即可,但有一个选项值得留意:默认编辑器建议保留 Vim,不要改成 Notepad 之类。虽然 Vim 对新手不太友好,但改掉之后 Git 某些场景反而容易出别的幺蛾子。如果你实在不习惯 Vim,后面可以配置成 VS Code,这也是一种常见做法。

macOS 用户需要注意一个细节:系统自带的 Git 版本往往偏老,建议用 Homebrew 安装新版,命令是brew install git。Linux 用户更简单,Debian/Ubuntu 系用sudo apt install git,CentOS/RHEL 系用sudo yum install git。

装完先别急着用,打开终端跑一下:

git --version

能输出版本号,说明安装成功。这里有个小建议:不要追求最新版本,但也不要停在过于古老的版本。太老的 Git 对某些远程仓库的认证协议支持不好,推送时可能莫名报错。

2.2 身份配置:为什么 commit 总是显示"unknown user"

装好 Git 之后第一件事,是配置用户名和邮箱。很多人直接跳过这一步,结果推送代码后,远程仓库的提交记录里显示一堆乱码或者 "unknown user"。原因在于每次 commit 都会写入作者信息,这个信息不是自动从系统里读的,而是 Git 配置里定义的。

git config --global user.name "你的名字" git config --global user.email "你的邮箱"

这里有一个经常被忽略的点:邮箱不一定要用真实邮箱,但最好和你远程仓库账号绑定的邮箱一致。很多代码托管平台会通过邮箱匹配提交记录和账号,不一致的话,你的提交虽然推进去了,却不会计入你的贡献图。公司内部的 GitLab 尤其在意这个,身份不匹配的话代码审查都找不到人。

配置完了可以用这个命令验证:

git config --list

输出里能看到user.name和user.email,说明配置生效。

2.3 远程仓库的两种地址协议:HTTPS 和 SSH

远程仓库地址有两种协议,一种是 HTTPS,形如https://github.com/username/repo.git,另一种是 SSH,形如git@github.com:username/repo.git。两者的区别直接关系到你后续推送时怎么认证。

  • HTTPS 方式:每次推送都可能要输账号密码。虽然 Git 有凭据管理器帮你想办法记住,但有时候在服务器上或者某些环境下,会频繁要求重新认证,比较烦人。
  • SSH 方式:需要提前生成密钥对,把公钥配置到托管平台。配置成功后,推送不再需要输密码,体验最顺滑。这也是绝大多数有经验的开发者推荐的方式。

对于国内用户来说,Gitee(码云)是一个访问稳定、流程完整的代码托管平台,下面的示例我会同时以 Gitee 和 GitHub 来说明。如果你使用公司内部的 GitLab,思路完全一样,只是域名和仓库地址不同。

2.4 SSH 密钥生成与配置的完整步骤

我推荐优先用 SSH 方式关联远程仓库。这里把完整流程拆成四步:

第一步,生成密钥对。打开终端输入:

ssh-keygen -t ed25519 -C "你的邮箱"

一路回车即可,除非你想给密钥文件设置单独的 passphrase。生成之后,你的用户目录下的.ssh文件夹里会多出两个文件:id_ed25519(私钥)和id_ed25519.pub(公钥)。

第二步,把公钥内容复制出来。Windows 用户可以这样:

cat ~/.ssh/id_ed25519.pub

或者用clip < ~/.ssh/id_ed25519.pub直接复制到剪贴板。macOS 用pbcopy < ~/.ssh/id_ed25519.pub。Linux 就老老实实手工复制。

第三步,登录你的 Gitee 或 GitHub 账号,进入"设置" → "SSH 公钥"页面,把公钥粘贴进去保存。这一步相当于把你的电脑登记为可信设备。

第四步,测试连通性:

ssh -T git@gitee.com

如果输出提示你以某个用户名成功登录,就说明配置成功了。这里有个关键点:测试命令里的用户名必须是git,不是你的账号名。这个细节很多人搞混,导致测试永远失败。

2.5 手动关联远程地址的两种场景

仓库地址准备好之后,关联远程把它"挂"到本地仓库上:

git remote add origin git@gitee.com:你的用户名/你的仓库名.git

origin是 Git 的默认远程仓库别名,你可以把它理解成"远端地址的快捷方式"。以后推送就用origin指代那一长串地址。

如果你执行过git clone,可以跳过这步,因为 clone 时已经自动设置好了。但要注意,clone 下来的仓库,远程别名可能不是origin而是别的名字,习惯上大家都用origin,如果是公司项目,建议先跑git remote -v确认一下实际别名是什么。

3. 第一次推送的标准操作流程:从 init 到 push 的完整链路

环境准备完毕,下面进入核心环节:把代码推上去。我会把每一步都拆开讲,包括命令的含义和使用场景,这样做的好处是你以后遇到变体能自己判断该用哪个命令。

3.1 第一种情况:从空远程仓库开始(init 流程)

假设你在 Gitee 上新建了一个空仓库,页面会提示你用git clone或者git init两种方式接入。我以一个本地已有项目文件夹的场景来演示init流程。

先在项目文件夹里打开终端,执行:

git init

这时项目目录里会多出一个隐藏的.git文件夹,这就是本地仓库本体。注意:这个文件夹不要删除,也不要放进被忽略的文件列表里,它是 Git 工作的基础。

接下来把项目文件加入暂存区:

git add .

这里的.表示当前目录下所有未被忽略的文件。如果你想只添加某个文件,就写具体路径,比如git add README.md。第一次使用这个命令时,我建议执行完先看一下git status,它会列出你已经添加了哪些文件。如果你发现某个不该提交的文件混进来了(比如本地的配置文件),趁现在赶紧用git rm --cached把它移出暂存区。

然后提交:

git commit -m "初始化项目"

-m后面跟的是提交说明。新手这里常见的错误是不写-m,结果 Git 直接打开了 Vim,屏幕上黑黢黢一片,光标闪烁,不知道干嘛。遇到这种情况别慌,按一下i进入编辑模式,写完说明后按Esc,再输入:wq回车保存退出即可。这算是个经典坑了。

提交之后本地仓库就有了第一个提交记录,但远程还是空的,所以接下来关联并推送:

git remote add origin git@gitee.com:你的用户名/你的仓库名.git git push -u origin main

-u参数是--set-upstream的简写,意思是把本地分支和远端分支建立跟踪关系。建立之后,以后直接敲git push就能推,不用再写完整的git push origin main。

这里有个分支名的细节:Git 默认分支名可能是main也可能是master,取决于你的 Git 版本和初始化时的配置。你可以用git branch命令查看当前在哪个分支上,然后按实际名字推送。

3.2 第二种情况:克隆已有仓库(clone 流程)

如果你要参与一个已有项目,或者想先在本地复现远程仓库的内容,用克隆的方式更直接:

git clone git@gitee.com:用户名/仓库名.git

这条命令做了好几件事:在当前目录下创建仓库文件夹、下载全部代码和提交历史、自动配置远程关联。所以克隆完成后你不需要git init,也不需要git remote add,直接开始改代码即可。

克隆之后推送的流程简单很多:

git add . git commit -m "更新内容" git push

因为 clone 已经帮你把跟踪关系配好了,最后一步可以省掉origin main那些参数。很多人学 Git 的时候两种流程都看过,记混了才会在克隆仓库里又去git init,这会导致仓库状态错乱,千万别这么做。

3.3 推送成功之后,验证一下远端状态

推送成功时 Git 会显示一行类似这样的输出:

To git@gitee.com:username/repo.git 1a2b3c4d..5e6f7g8h main -> main

看到这行基本就可以放心了。为了保险起见,你也可以直接在浏览器打开远程仓库页面,确认代码文件确实出现在那里。

这里要提醒一点:远程仓库页面上显示的提交记录,和你本地git log看到的应该是同一串哈希值。如果你本地的git log最新提交是5e6f7g8h,但远程页面上显示的是另一个哈希,说明你可能推了某个分支,而不是当前分支。遇到这种情况,做一下git branch确认分支名,再明确推送到对应分支。

3.4 为什么要用-u:upstream 的完整含义

很多教程直接让你git push -u origin main,却不解释-u的意义。现在我把它讲透。

-u全称是--set-upstream,作用是为当前本地分支设置一个上游分支。上游分支就是一个"默认的远程目标"。设置了之后,你以后在当前分支上执行git pull和git push时,Git 会自动知道该跟哪个远程分支交互,不需要每次手动指定。

日常操作中,git push和git pull是高频命令,如果你每次都要敲全git push origin main、git pull origin main,不仅烦,还容易在多个分支之间切换时推错方向。设置好 upstream 会轻松很多,所以第一次推送务必带上-u。

4. 推送失败排查手册:认证报错、非快进冲突与误提交处理

推送失败是 Git 使用中最劝退的部分。我在带新人的时候发现,大家遇到的问题翻来覆去就那么几类。与其零散地搜答案,不如按错误类型系统过一遍,把每个问题的判断思路和解决办法说清楚。

4.1 认证失败:Permission denied 与 HTTP 401

SSH 方式最常见的报错是:

Permission denied (publickey).

这个报错的意思是:远端没有认可你的密钥。判断思路按顺序排查:第一,确认你的 SSH 公钥确实已经粘贴到了托管平台;第二,确认你测试连接用的是ssh -T git@gitee.com而不是别的用户名;第三,确认本机当前用的私钥文件名是否默认的id_ed25519。如果你生成密钥时改了文件名,Git 不会自动识别,需要额外配置~/.ssh/config文件来指定使用哪个私钥。

HTTPS 方式常见的报错是:

remote: Authentication failed

这通常意味着账号密码输入错误。国内平台我遇到过一种特殊情况:账号密码是对的,但因为账号绑定了两步验证,单纯的密码认证被服务器拒绝。这种情况下,需要去平台设置里生成一个访问令牌(Personal Access Token),然后把令牌当作密码输入。

4.2 非快进推送被拒绝:hint: Updates were rejected

这是多人协作项目里最经典的报错。你的git push被拒,提示说远端有你在本地没有的提交。我见过的场景是这样的:你在本地改了三天代码,远程分支早已被同事推进去好几个 commit 了。你本地基于的是旧提交,远端指针已经往前走,两个提交历史分叉了,Git 拒绝直接覆盖。

解决办法的规范流程是先拉取再推送:

git pull origin main

注意,pull会自动执行一次合并(merge)。如果同事改的文件和你的改动没有交集,Git 会自动合并成功,然后你再git push就顺了。如果改到了同一个文件的同一个区域,就会产生冲突,需要手动解决。关于冲突的具体处理,我在 4.4 节专门展开。

这里要郑重提醒一下:遇到更新被拒绝,千万不要第一反应就是git push --force。强制推送会用你本地的历史覆盖远端历史,如果同事的提交已经被你覆盖,那些提交可能直接丢失。在公司项目里强制推送是相当危险的操作,除非你能确认自己完全清楚后果,否则不要碰。

4.3 文件过大被拒绝:remote: File is too large

Git 不像网盘那样适合存大文件。默认情况下,单个文件超过一定大小(托管平台通常限制在 100MB 左右),推送就会被拒绝。

如果你不小心加了几个几十上百兆的压缩包或者数据集,推送失败后即使你马上git rm再提交也会有问题——因为那个大文件已经进入了提交历史,而推送上传的是历史里所有相关的对象。解决办法有两个:

一种是在远端还没任何提交的情况下,把本地仓库彻底重置回初始状态,重新提交干净的文件:

git rm -r --cached . git add . git commit --amend -m "修正:移除大文件"

另一种是如果大文件已经进了历史多次提交,用git filter-repo这类工具清洗历史。平时多留个心眼,在项目根目录维护好.gitignore,把构建产物、日志文件、临时压缩包提前屏蔽掉,省得以后踩坑。

4.4 合并冲突的现场处理:从识别到解决

多人协作中冲突不可避免。git pull之后如果出现冲突,Git 会在文件里插入冲突标记:

<<<<<<< HEAD 这是你本地的改动 ======= 这是远程的改动 >>>>>>> main

你需要打开这些文件,逐段决定保留哪部分。这个过程中有两条经验值得注意:

第一条,别用编辑器随便删标记。很多新手会用记事本把<<<<<<<、=======、>>>>>>>这些行删掉,但内容取舍不对,可能导致代码逻辑错误。正确做法是先看懂两个版本各是什么逻辑,再决定保留哪边或者两边都保留。

第二条,不要一个人闷头解决大冲突。如果一个文件的冲突段落超过两位数,我建议直接找对端同事一起过一遍,因为每个改动背后都有业务意图,你自己硬猜很容易改错。冲突文件全部解决完毕后,执行:

git add . git commit -m "合并冲突" git push

这里要记住:不用再执行一次git merge,git commit本身就是在完成合并提交。

5. 推送之外的高频场景:分支管理、误推送撤回和忽略规则

推送这个问题讲到这里,基础链路已经完整了。不过日常开发中还有几个和 push 强相关的场景,单独拿出来说一说,这些内容在"第一次推送"教程里通常不会写,但实战中几乎每周都会遇到。

5.1 分支推送:把开发分支推上去的正确姿势

在团队项目里,大家通常不在主分支上直接开发,而是每个需求建一个分支:

git checkout -b feature/login

这条命令的意思是创建并切换到一个新分支。在这个分支上完成代码后,推送时要注意:

git push -u origin feature/login

推送之后,远程仓库会出现一个同名的feature/login分支。同事可以通过这个分支看到你的开发进度,提交合并申请也以这个分支为基础。这是多人协作非常常见的流程。

日常管理分支的常用命令还有:

git branch -a # 查看本地和远端所有分支 git checkout main # 切换回主分支 git branch -d feature/login # 删除本地分支 git push origin --delete feature/login # 删除远程分支

这些命令配合起来用,基本覆盖了日常分支管理的需要。

5.2 推送错了怎么办:撤回和修复思路

推送之后发现提交有误,分两种情况处理。

如果只是提交说明写错了,最近一次提交还没推出去,可以用:

git commit --amend -m "修正后的提交说明"

这个命令会把上一次提交的说明改掉,不产生新提交。但注意,已推送的提交不建议用 amend 改,因为修改提交会改变它的哈希值,一旦推送过就会导致本地历史和远端不一致,下次推送会被拒绝。万一你 amend 了已经推送的提交,需要强制推送才能对上,这又回到了"危险操作"的话题。

如果你想把某个文件从最近一次提交里撤出来,保留文件但不提交:

git reset HEAD^ 文件名

这条命令会把暂存区恢复到上一次提交的状态,但文件本身留在工作区。这种操作只适用于还没推送的提交。

如果提交已经推送且影响很大,常见的做法是生成一个新的"反向提交":

git revert 提交哈希

revert会生成一个与目标提交内容相反的新提交,相当于安全地撤销旧改动,不会破坏历史。我处理线上问题一般优先用revert,因为它不会强制改写远端历史,对团队最友好。

5.3 .gitignore 的正确写法与常见的错误用法

很多推送失败的原因,不是因为技术难,而是因为把不该提交的文件都提交了。node_modules、虚拟环境、编译产物、IDE 配置文件这些话,进仓库纯粹是给同事添堵。

一个项目从第一天就该配好.gitignore。它的语法很简单,按行写匹配规则:

node_modules/ dist/ .env *.log

node_modules/表示忽略整个目录,.env表示忽略所有同名文件,*.log表示忽略所有.log后缀文件。常见语言和框架的.gitignore模板在 GitHub 上都能找到现成的,比如你写 Python 项目,直接搜"Python .gitignore"就能找到一份比较完整的。

一个新手经常犯的错是:文件已经被提交到仓库之后才去配.gitignore,然后发现规则不生效。这是因为.gitignore只对未被跟踪的文件生效,已经被 Git 追踪的文件不受影响。已经提交的文件你要先把它从版本控制里移除:

git rm -r --cached 文件名

这里加--cached是最关键的:它表示只从 Git 的跟踪列表里移除,本地文件不会删除。执行完再提交,之后.gitignore就能管住这个文件了。

5.4 同时关联多个远程仓库:把代码推到两个平台

最后分享一个稍微进阶一点的操作场景。有时候你会想把同一份代码同时推送到两个不同的托管平台,比如 Gitee 一份、GitLab 一份。

实现方式有好几种,最直观的是添加两个远程地址:

git remote add gitee git@gitee.com:username/repo.git git remote add gitlab git@gitlab.com:username/repo.git

推的时候分别推送:

git push -u gitee main git push -u gitlab main

你也可以在推送命令上加多个地址:

git push gitee main git push gitlab main

还有一种更省事的做法,用git remote set-url --add origin给同一个远程别名配置多个地址,这样git push一次就能推到两家。不过这种做法有个隐患:git pull只会从其中一个地址拉取,两个平台代码差异较大时容易混乱。我个人建议,除非你有非常明确的镜像同步需求,否则还是用多个远程别名的方式,逻辑更清晰。

6. 写在后面的一些实操体会

这套流程写到这里,关于 Git 推送这件事,从环境准备到日常协作的核心内容基本都覆盖了。最后分享几点我在实际项目中积累的体会,算是附加的实用建议。

第一点,每次推送前看一眼git status。很多时候推送失败不是技术问题,是你根本没意识到自己处于哪个分支、哪些文件有改动。一条git status能帮你避免大量乌龙。

第二点,提交信息要有信息量。我见过太多update、修改这种提交说明,过一个月回头看根本不知道当时改了啥。团队协作里,提交信息是留给同事和未来的自己看的,写清楚"修复登录接口返回 500 错误"一定比写"修复 bug"有价值得多。

第三点,也是我最想说的一点:遇到报错,先读完整错误信息再动手。Git 的报错提示已经很友好了,它通常会告诉你"发生了什么、为什么发生、你可以怎么办"。很多新人一看到英文就慌,直接去复制粘贴第一行报错去搜答案,结果反而走了弯路。把错误信息从头到尾读一遍,你会发现自己能解决大部分问题。

踩过的坑多了之后你会发现,Git 推送这件事本身不复杂,真正复杂的是对状态的理解和对错误的判断。把本文说的这些场景亲手练一遍,从安装到首次推送,再到故意制造一次冲突看它是怎么报错的,比你翻十篇教程都有用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 9:16:08

热电联产机组调度建模:破解电-热强耦合优化难题

简介&#xff1a;本资源是一套面向电力系统优化方向研究生、能源领域工程师及MATLAB建模实践者的热电联产机组调度优化代码实现方案&#xff0c;聚焦于CHP机组与火电、风电、热电机组协同调度&#xff0c;结合相变储热技术提升系统经济性与可再生能源消纳能力。压缩包共8个文件…

作者头像 李华
网站建设 2026/10/3 9:16:05

Web请求为何是I/O密集型?从网卡到响应全链路拆解与高并发优化思路

接到需求的时候很少会问“这请求是I/O密集还是CPU密集这类问题”&#xff0c;但一旦做性能排查、并发优化、容量评估&#xff0c;这个问题就会自己找上门。Web请求为什么是I/O密集型&#xff0c;大家都能随口说一句“因为要等网络”&#xff0c;但等的是什么、CPU时间为什么少得…

作者头像 李华
网站建设 2026/10/3 9:15:58

HOG+SVM行人检测全流程解析:从特征提取到难例挖掘

简介&#xff1a;本资源是一套基于HOG特征提取与SVM分类器实现的行人检测完整项目&#xff0c;面向人工智能、计算机科学、自动化等专业的在校学生、教师及初学者&#xff0c;适用于课程设计、毕业设计、算法实践与CV入门学习。项目包含从负样本裁剪、HOG特征提取、SVM模型训练…

作者头像 李华
网站建设 2026/10/3 9:13:22

Spring Boot微信小程序商城毕业设计:从源码到全栈实战解析

1. 项目整体解读&#xff1a;从标题看透毕业设计的真实需求先把这个标题拆开看——“springboot商城微信小程序-计算机毕业设计源码34906”&#xff0c;它其实包含了好几个信息层。如果你正在找毕设方向&#xff0c;或者已经拿到这套源码准备跑起来&#xff0c;那这篇文章就是为…

作者头像 李华
网站建设 2026/10/3 9:10:55

Java+SpringBoot+SSM智能包裹配送管理系统开发实战与避坑指南

每年这个时候&#xff0c;我都会收到一批“基于JavaSpringBootSSM的XX管理系统”的求助帖&#xff0c;最近咨询量最大的就是这套“智能包裹配送服务管理系统”。标题里同时出现SpringBoot和SSM&#xff0c;其实很多人会把它们当成两套互斥框架&#xff0c;这是个常见的误解。Sp…

作者头像 李华
网站建设 2026/10/3 9:10:44

SpringBoot+Vue打造图书阅读与商城一体化系统实战

我自己做线上图书项目已经不是第一次了&#xff0c;SpringBoot加Vue这个技术组合更是用了很多年。之前帮人做过一个纯商城版的图书销售系统&#xff0c;也见过不少同学把阅读器和商城分开做&#xff0c;结果系统上线后发现&#xff0c;用户买完书要去另一个地方看&#xff0c;体…

作者头像 李华