尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Git全栈实战:从本地初始化到远程仓库推送与协作排错

Git全栈实战:从本地初始化到远程仓库推送与协作排错 代码写完了项目在本地跑起来了这只是开发旅程的一半。真正让一个项目“活”起来、能跟团队协作、能从一台电脑换到另一台电脑继续开发的是把代码传到远程仓库这一步。我见过太多新人对Git又怕又烦命令记不住报错看不懂一个fatal就能卡住半天。这篇教程就用来解决这个问题从Git安装、基础配置讲起带你把一个本地项目完整推到远程仓库顺便把日常协作和报错排查的坑都填平。适合刚接触全栈开发、准备把练习项目或毕业设计托管到Gitee、GitLab的同学也适合已经在用但经常被命令绕晕的初级工程师。1. 动手前的准备Git安装与全局配置1.1 Git是什么为什么全栈开发离不开它Git是一个分布式版本控制工具简单说它就像给代码打游戏存档每一次提交都是一个存档点出问题了能回退写错了能对比多人协作时能看到谁改了什么。全栈开发里前端、后端、数据库脚本往往都在同一个仓库里管理没有Git几个人同时改同一个文件就会出现“你覆盖了我”的惨剧。我遇到过一些同学把整个项目文件夹复制好几份来“手动备份”项目_final、项目_final2、项目_再也不改了。这不是版本管理这是给自己埋雷。Git的价值不是帮你备份而是让每一次改动都有记录、有原因、可回溯。这个思路贯穿我们后面所有的操作。1.2 在Windows、macOS、Linux上安装Git不同系统安装方式不一样我只说最实用的方案Windows直接去官网下载安装包一路下一步。安装时注意勾选“Git Bash Here”和“Git GUI Here”这样右键菜单里就有Git Bash入口后面操作都建议在Git Bash里敲命令比cmd舒服得多。macOS终端执行brew install git如果没有Homebrew装一下就行一条命令的事。LinuxUbuntu/Debian系sudo apt update sudo apt install git -y。装完验证一下git --version看到类似git version 2.39.2这样的输出就算成功。装了却没反应的同学大概率是环境变量没配好Windows下可以在“系统属性-环境变量-Path”里手动加上Git的bin目录。1.3 配置用户名和邮箱否则提交会报错安装只是第一步接下来必须告诉Git“你是谁”。这一步经常被跳过后果就是后面第一次commit时直接报错git config --global user.name 你的名字 git config --global user.email 你的邮箱这两条命令会写进全局配置文件Windows通常在C:\Users\你的用户名\.gitconfigLinux/macOS在~/.gitconfig。提交记录里会带上这些信息团队协作时一眼就能看出哪次提交是谁做的。我用--global意思是这台机器上所有仓库都默认用这个身份。如果你电脑上同时有个人项目和工作项目需要不同身份可以在某个仓库目录下单独执行不带--global的配置覆盖全局配置。建议配置完后执行git config --list看一眼确认配置生效别等到提交完才发现邮箱写错了。1.4 配置SSH密钥免去每次输密码的麻烦本地仓库要和远程仓库通信有HTTPS和SSH两种方式。HTTPS每次push都要输用户名密码虽然有些平台支持记住密码但换台电脑、换网络环境就麻烦了。SSH密钥配对可以做到免密操作我更推荐。生成密钥终端执行ssh-keygen -t ed25519 -C 你的邮箱命令会提示你保存位置默认直接回车然后会让你输入密码短语这个可以留空也可以设置每次使用密钥时输入。完成后查看公钥cat ~/.ssh/id_ed25519.pub把输出的内容整段复制然后登录你的Gitee、GitHub或GitLab在“设置-SSH公钥”页面粘贴保存。最后验证一下ssh -T gitgitee.com看到类似“Hi xxx! Youve successfully authenticated”的提示说明密钥配置成功。这里有一个细节不同平台验证的域名不一样GitHub是gitgithub.comGitLab是自己部署的域名别拿Gitee的密钥去验证GitHub会一直报Permission denied。2. 把本地项目变成Git仓库初始化与第一次提交2.1 先搞懂工作区、暂存区、本地仓库三者的关系很多新手卡在add和commit上是因为不理解这两个命令到底在做什么。我用购物来类比工作区你电脑上正在编辑的项目文件夹相当于超市货架东西随时能改。暂存区执行git add之后改动进入暂存区相当于购物车还没结账可以继续往里面加东西也可以把不要的拿出来。本地仓库执行git commit之后改动正式形成一条记录相当于在收银台完成支付东西是你的了有据可查。理解了这三层你就明白为什么流程永远是git add再git commit先把要存档的改动挑出来放进购物车再统一结算。没有add直接commit是无效的Git会提示“nothing to commit”。2.2 初始化仓库以及.gitignore文件的必要性假设你有一个项目文件夹叫my-project先进入这个目录cd my-project git init执行完目录下会出现一个隐藏的.git文件夹这就是Git的“数据库”所有版本记录都在里面。此时仓库是空的还没有任何提交。在提交之前有一件事必须做创建.gitignore文件。这个文件用来告诉Git“哪些文件不要跟踪”。不同项目需要忽略的内容不同# 依赖目录 node_modules/ target/ venv/ # IDE配置 .idea/ .vscode/ *.iml # 系统文件 .DS_Store Thumbs.db # 日志和临时文件 *.log *.tmp为什么必须做这一步我见过新人把node_modules整个提交上去了几千个小文件仓库瞬间爆炸队友拉代码拉得怀疑人生。忽略这些文件不是“偷懒”而是让仓库只保存源码和配置依赖可以通过构建工具还原。2.3 第一次提交git add、git commit、git log接下来就是正式的提交流程。先看看当前仓库状态git status这会列出哪些文件是新增的、哪些被修改过。确认无误后把全部改动加入暂存区git add ..表示当前目录下的所有文件也可以指定具体文件比如git add src/main.py。然后执行提交git commit -m init: 初始化项目搭建基础框架-m后面的是提交信息这是给这次提交起的“注释”千万不能随便写。我自己用过一个规则前缀标明类型正文说明做了什么。比如feat: 增加用户登录接口、fix: 修复订单金额计算错误、docs: 更新README文档。Git本身不限制你写什么但团队协作时清晰的提交信息能省下大量沟通时间。提交完以后查看提交历史git log你会看到一条记录包含commit的哈希值、作者、时间和提交信息。这个哈希值就是版本号后续回退、对比都靠它。到这里你的项目已经在本地成功建立起第一个版本存档了。3. 打通本地与远程关联仓库并完成推送3.1 在远程平台创建空仓库这一步的难点往往不在操作而在选择。Gitee国内访问快、注册方便GitHub是全球最大的代码托管社区GitLab通常用于企业内网可以私有化部署。如果只是个人学习和练习Gitee或GitHub都行教程以Gitee为例流程在其他平台也大同小异。登录后点击“新建仓库”填写仓库名称选择公开还是私有。关键一步创建时别勾选“初始化仓库”选项别自动添加README、.gitignore、license。为什么远程仓库一旦初始化就会生成一次独立的提交记录而你的本地仓库也有自己的提交历史两边没有共同祖先首次推送就会遇到“两个不相关历史合并”的问题新手很容易卡在这里。创建成功后页面上会给出两种仓库地址HTTPS地址和SSH地址。既然我们前面配好了SSH密钥这里就复制SSH地址形如gitgitee.com:你的用户名/项目名.git。3.2 添加远程地址并检查关联回到本地项目目录把远程仓库地址绑定到本地仓库git remote add origin gitgitee.com:你的用户名/项目名.git这里的origin是远程仓库的默认别名相当于给这个地址起了一个短名字。后续所有跟远程仓库打交道的操作都用origin代替一长串URL。检查一下是否绑定成功git remote -v会出现两行分别对应fetch和push的地址看到地址正确就说明关联成功。如果输错了地址可以用git remote set-url origin 新地址修改或者git remote remove origin删除后重新添加。如果你是从零开始创建项目先创建远程仓库再在本地初始化也是可以的只要你绑定了正确的地址流程完全一致。3.3 执行推送理解-u参数的作用绑定完成后执行git push -u origin main这里有两个需要注意的细节。第一个是分支名。Git初始化时默认分支名可能是master老版本或main新版本。远程仓库创建时默认分支一般也是main。如果你的分支名和远程不一致比如本地叫master、远程叫main推送会失败。解决办法是统一分支名或者用git branch -M main强制重命名当前分支。第二个是-u参数。它的全称是--set-upstream功能是建立本地分支和远程分支的跟踪关系。执行一次之后后续再推送就直接git push不用每次指定远程名和分支名。第一次推送没有加-u也能推但后面每次都得写完整命令比较麻烦。推送成功后刷新远程仓库页面应该能看到项目文件和提交记录了。到这一步一个本地项目就完整上传到远程仓库了。3.4 远程仓库已有文件时的处理方案如果你创建远程仓库时不小心勾选了初始化或者团队已经有同事推了一些代码本地和远程的提交历史是“两座孤岛”直接push会被拒绝报错信息类似于failed to push some refs提示远程有本地没有的提交。这时候正确的做法是先拉取远程内容合并两个历史git pull origin main --allow-unrelated-histories--allow-unrelated-histories的意思是允许合并两个没有共同祖先的提交历史。拉取合并后本地就有了远程的README文件你的本地提交也在然后就能正常推送了。也有新人图省事直接用git push -f origin main强制覆盖远程这个操作我强烈不建议它会直接抹掉远程仓库的记录如果远程有别人提交的代码你等于帮别人把代码删了后果很严重。3.5 在IDE里完成推送现在很多编辑器都集成了Git操作比如IntelliJ IDEA。打开项目后点击右上角的Git按钮或者VCS - Git菜单就能看到Commit和Push。操作顺序和命令行一样先Commit勾选要提交的文件填提交信息再Push填远程仓库地址IDEA会自动读取你命令行里配置好的远程地址。如果你在IDEA里Push时发现找不到远程仓库多半是这个项目初始化时没有绑定远程地址。解决办法菜单栏Git - Manage Remotes手动添加origin地址即可。IDEA的图形界面虽然直观但底层执行的仍然是Git命令建议先熟练命令行再去用IDE的图形化操作遇到问题才不会懵。4. 日常协作中的高频操作分支、合并与提交修改4.1 分支是什么以及为什么要用分支分支是Git最强大的功能也是最被新人低估的功能。简单理解分支就是从主线上分出来的“平行宇宙”你在分支上改代码不会影响主线等测试没问题再合并回去。真实开发场景中一个项目往往有多个人同时开发。如果所有人都直接往main分支推代码冲突会频繁到让人崩溃。规范的做法是main分支保持稳定能随时发布开发新功能时从main拉一个feature/xxx分支在分支上开发确认功能稳定、代码评审通过后再合并回main。创建并切换分支git checkout -b feature/login这条命令等价于git branch feature/login加git checkout feature/login。查看当前分支git branch带*号的是当前所在分支。commit、push都在分支上操作互不干扰。4.2 合并分支的正确姿势功能开发完切回main分支执行合并git checkout main git merge feature/login如果合并过程中没有冲突Git会生成一个合并提交随心所欲地改完了事。如果有冲突git status会标出冲突文件打开文件后你会看到类似这样的内容 HEAD 你当前分支的代码 要合并进来的分支的代码 feature/login HEAD和之间是当前分支main的内容和 feature/login之间是待合并分支feature/login的内容。你需要手动判断保留哪一部分或者把两边结合改造一下然后删除这些标记行保存文件重新git add和git commit冲突就解决了。我个人的建议是合并之前先git pull origin main把最新的主分支代码拉下来在自己本地先解决冲突别等推到远程再被动应对。在本地冲突解决错了还能改推到远程后处理起来就麻烦得多。4.3 git commit --amend修改最近一次提交这个命令解决的是“提交后悔”的问题在热词里也经常出现。它有两个典型使用场景第一个场景提交信息写错了。比如本来想写fix: 修复登录bug结果写成了fix: 修复登bug执行git commit --amend -m fix: 修复登录bugGit不会新增一条提交而是把最近一次提交的信息直接替换掉。第二个场景提交完了发现漏了一个文件。你可以先git add遗漏的文件再执行git commit --amend这样“漏文件”这个改动会被合并到上一次提交里不会形成一条孤零零的“补充提交”。有一点必须提醒--amend只应该用在还没有推送到远程的本地提交上。如果这次提交已经推到远程了amend会生成一个全新的commit哈希相当于制造了一条“分叉历史”其他人已经拉取过旧提交的话后续合并会非常混乱。一个简单的判断标准这个提交只有你自己看得见可以amend别人已经拉取过了就老老实实新建一个修正提交。4.4 git pull与git push的配合以及git fetch的定位很多新人把git pull理解成“从远程下载代码”这个理解没错但不完整。git pull实际上是两个操作的组合git fetch从远程下载数据git merge把下载的数据合并到当前分支。了解拆解对你排查问题很有帮助。比如遇到“拉了代码合并不上去”的情况可以先执行git fetch origin git statusgit fetch只是把远程的最新提交下载到本地你的工作区没有变化。然后用git status查看本地落后远程多少个提交。如果不想被merge带来的自动提交干扰也可以用git pull --rebase它的思路是把本地的提交“垫到”远程最新提交的后面历史更干净但对新手来说理解成本较高先掌握pull以后再深入rebase。还有一个常用的小工具git stash。如果你正在开发一半突然要切到别的分支修个紧急bug又不想把没写完的代码提交上去执行git stash就能把当前改动暂存起来工作区恢复干净。切过去修完bug再切回来执行git stash pop改动就回来了。这个命令我在日常开发里使用频率极高。4.5 打标签给上线版本做个记号和提交历史不同标签tag是给某个特定提交起的“别名”通常用在上线发布的版本上。开发完成、测试通过准备发版时git tag v1.0.0 git push origin v1.0.0以后不管代码改了多少轮都能通过v1.0.0这个标签随时找到当时发布的代码。查看所有标签用git tag删除本地标签用git tag -d v1.0.0删除远程标签用git push origin :refs/tags/v1.0.0。5. 常见报错速查别让错误提示把你带偏5.1 高频报错分类原因和解决办法Git的报错英文居多新手容易望而生畏。其实Git报错信息写得还算良心多数都在提示原因。我把实际工作中见过最多的报错整理成一张速查表报错信息出现原因解决办法fatal: not a git repository (or any of the parent directories): .git当前目录没有初始化Git仓库切换到项目根目录执行git init或者确认执行命令的路径是否正确fatal: remote origin already exists已经添加过远程仓库地址用git remote set-url origin 新地址修改而不是重复添加Permission denied (publickey)SSH公钥未配置或地址写错检查SSH密钥是否已添加到平台验证命令ssh -T gitgitee.com! [rejected] ... failed to push some refs远程有本地没有的提交先git pull origin main --rebase同步远程再git pushfatal: refusing to merge unrelated histories本地和远程仓库历史无共同祖先首次关联时使用git pull origin main --allow-unrelated-historiesfatal: origin does not appear to be a git repository远程仓库名写错或没有添加用git remote -v查看已配置的远程地址确认拼写5.2 一个隐蔽的“非Git”报错软件源仓库报错热词里有这么一条e: 仓库 https://community-packages.deepin.com/beige beige release 没有 Release 文件。这个报错经常混在Git问题里被拿出来问实际上它和Git一点关系都没有。这是Linux系统软件源apt源配置出错的提示属于操作系统层面的问题。排查时要先确认报错是哪个工具抛出来的Git的报错通常在git命令后出现apt的报错则出现在apt update或安装软件时。很多新手一看到“仓库”两个字就往Git上想这个思路会把人带偏。先分辨报错来源再针对性解决能节省大量排查时间。5.3 奇怪的Git命令是怎么回事热词里有这样一条长命令git -c diff.mnemonicprefixfalse -c core.quotepathfalse --no-optional-locks pull。看着吓人其实这是IDE比如Android Studio在调用Git时内部自动生成的命令-c表示临时修改某个配置项--no-optional-locks表示不执行可选的锁操作。你在命令行里正常写git pull就行不用也不用管这些底层细节。反过来也是一个提醒遇到IDE报错不必纠结IDE显示的完整命令核心还是理解Git本身的执行逻辑。5.4 我的排查习惯三个步骤定位问题在实际操作中我排查Git问题的顺序基本固定。第一步看完整报错信息不要只看第一行重点看带fatal或者!的行第二步执行git status看当前仓库状态很多时候问题出在本地仓库本身跟远程无关第三步实在不确定就git log --oneline --graph --all看提交历史图理清分支和提交的走向。这套流程处理了90%以上的困惑比乱试命令有效得多。6. 从开发到上线代码仓库与发布流程的衔接6.1 一个项目里其实有不止一种“仓库”说到“仓库”初学的同学容易把所有仓库混为一谈。在真实的发布流程里至少会接触三类仓库代码仓库Git管理的源码仓库负责版本控制和团队协作对应Gitee、GitHub、GitLab、Gogs。依赖仓库管理构建产物的仓库比如Java项目的Maven仓库常见的是Nexus或阿里云Maven公共仓库负责把依赖包和构件统一管理分发。镜像仓库管理容器镜像的仓库比如Docker Hub、Harbor负责保存打包好的应用镜像。全栈开发里经常听到“Maven配置阿里云仓库”配置的就是依赖仓库的地址目的是让构建工具更快地下载依赖而“Docker仓库”则是把应用容器化之后存放镜像的地方。它们的职责各有侧重代码仓库管的是源代码依赖仓库管的是jar包、npm包镜像仓库管的是可运行环境。只有把这三类仓库区分开看项目架构时才不会一头雾水。6.2 标签驱动的发布节奏在“从开发到上线”的流程中代码仓库承担的关键职责是确定发布版本。团队完成一个迭代后在测试通过的提交上打v1.x.x标签发布脚本或CI/CD流水线以此标签为准拉取代码、构建产物、生成镜像最后部署到服务器。标签的好处是可以随时回溯。生产环境出问题了直接在仓库里git checkout v1.0.0就能拿到当时的完整代码定位问题和发布时的环境关系。这也是为什么我建议把打标签当成发布流程的固定动作而不是想起来才打一次。6.3 托管平台的统计功能值得每天看一眼热词里提到“GitLab仓库代码量和注释率统计”这类功能在Gitee、GitHub、GitLab上都有。代码量统计能反映项目规模变化注释率则能在一定程度上体现代码可维护性。实话讲注释率不是越高越好写废话注释不如让代码本身更清晰但趋势曲线确实能暴露一些隐患比如某段代码注释率骤降往往意味着有人在赶进度没来得及写说明。我自己的习惯是合并分支后去看一眼仓库的动态和提交记录确认团队的每个改动都有明确提交信息。这个过程花不了两分钟但对培养规范意识帮助非常大。6.4 团队协作建议让提交记录成为项目的“日志”代码仓库不只是存放代码的地方它还是项目最忠实的日志。分支命名建议统一比如feature/订单模块、fix/登录超时、hotfix/支付崩溃合并代码前先把自己分支上的提交记录整理干净该amend的amend该拆分的拆分别留一堆“update”、“aa”、“1”这样的无用提交。提交信息遵守“动词对象”的结构比如feat: 新增商品列表接口、fix: 修复库存扣减并发问题。这些规范在单人项目里看不出什么但进入团队协作后好的提交记录是做Code Review、排查线上事故、交接项目时最有价值的资产比任何文档都准确因为它是代码演进过程的真实记录。我最后再分享一个小习惯每次提交前先看一眼git status和git diff确认什么东西会被提交、改动是否在预期范围内。这个习惯花不了三十秒但能挡住绝大部分“把不应该提交的文件放进版本管理”的问题。Git不会替你做这个判断它只负责忠实地记录控制台上的一切。真正的版本管理意识是从第一次提交时就开始养成的。
返回列表