十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GitHub 新手入门:从建仓到协作,30分钟掌握提交与PR

GitHub 新手入门:从建仓到协作,30分钟掌握提交与PR 不知道你有没有遇到过这种场景本地写了一堆代码想传到 GitHub 上结果卡在git push报错一个接一个百度一搜全是碎片答案越看越懵。我当年入门的时候也是这样明明“提交代码”在别人嘴里就一句话的事真到自己操作光 SSH key 就折腾了大半天。这篇文章就是冲着这个问题来的。我会用 30 分钟的时间线带你跑通 GitHub 最核心的三件事建仓创建仓库、提交commit push、协作分支 Pull Request。不堆概念不聊虚的每条命令都是我在实际项目里用过的每个报错也都是踩过坑后总结出来的。适合刚接触 GitHub 的开发者也适合那些用过一段时间但一直是“会点不会串”状态的朋友。看完你能独立把一个本地项目放到 GitHub 上并且能参与基本的团队协作流程。1. 先花两分钟把概念理顺GitHub 到底在解决什么问题1.1 Git 管版本GitHub 管协作很多新手会把 Git 和 GitHub 混为一谈其实它们是两回事。Git 是一个分布式版本控制工具装在你本地负责记录每一行代码的修改历史。GitHub 是一个基于 Git 的代码托管平台你可以把它理解成一个云端仓库把本地的版本历史同步上去这样即使电脑丢了代码和每一次改动记录都还在。为什么需要这个组合你想想以前写论文的经历最终版.doc、最终版_修改版.doc、最终版_打死不改版.doc……代码开发如果也这样搞文件会迅速失控。Git 用一套精密的快照机制解决了这个问题每次提交都是一次快照想回退到任意一个历史版本都只需要一条命令。GitHub 则在这个基础上加了一层社交协作能力让多个开发者可以围绕同一个代码库并行工作互不干扰。1.2 GitHub 的核心价值不只是“存代码”如果你是个人开发者GitHub 可以当免费云盘用存点自己的脚本、笔记、博客源码都很舒服。但 GitHub 真正强大的地方在于开源生态。你写了一个工具传到 GitHub 上全世界的人都能看到别人可以给你提 issue问题反馈、提 Pull Request合并请求甚至 fork复制一份到自己的仓库下继续改。这个模式催生了大量经典项目。举个例子你在 GitHub 上搜索一些热门的 AI 模型库或者效率工具往往能找到功能完整、文档规范的开源实现。国内很多开发者也会把自己整理的“动手学大模型”课程资料、面试题库、软件包归档放到 GitHub 上别人可以直接拿来学习或者二次开发。这就是 GitHub 作为“开发者社区基础设施”的价值代码、文档、讨论、知识沉淀都在同一个地方。1.3 30 分钟的学习路线怎么分配给你一个可执行的时间表照着做就行前 5 分钟注册账号、安装 Git、配置 SSH 免密登录中间 10 分钟创建一个仓库把本地项目成功推上去建仓 提交最后 15 分钟模拟一次真实的协作流程建分支、改代码、提 Pull Request、合并这个顺序是有讲究的。先解决“把代码传上去”这个最痛点的问题建立信心再进入协作场景理解分支和合并的逻辑。很多人一上来就啃《Pro Git》那本厚书反而学不下去。我的建议是先跑通再深挖用操作驱动学习。2. 开工准备注册账号、安装 Git、配置 SSH 免密2.1 注册 GitHub 账号时的几个细节进入 GitHub 官网点右上角的 Sign up 就能注册。邮箱建议用稳定可收信的比如 Gmail、Outlook 或者公司邮箱。用户名一旦定了后面所有仓库的地址都会带上它比如 github.com/你的用户名/仓库名所以选一个和自己英文名、团队名、品牌名一致的后续不用再改。注册时还会让你选订阅计划个人用 Free 免费版就完全够了不需要填信用卡。有些朋友在注册时会遇到验证图片加载不出来这通常是网络波动导致的可以稍后再试或者检查一下本机 DNS 是否正常。登录之后建议先做一件事把右侧的“公共资料”补全。头像、个人简介、主页链接这些信息虽然不影响技术操作但在后面参与开源项目时维护者会点进你的主页看你的背景一个信息完整的账号更容易获得信任。2.2 安装 Git 并验证是否成功到 Git 官网下载对应操作系统的安装包。Windows 用户安装时默认选项直接下一步即可但有几个选项要特别注意安装路径不要带中文空格默认编辑器建议选 Vim 保持默认或者你熟悉的编辑器PATH 环境变量钩子选默认的 “Git from the command line and also from 3rd-party software”安装完打开终端Windows 用 Git BashmacOS 用自带的终端输入git --version能输出类似git version 2.39.2这样的信息就说明装好了。如果你电脑上还有 Visual Studio、IntelliJ IDEA 这类 IDE它们自带的 Git 版本可能比较老建议用命令行版本为准后面配置和操作都统一一个环境。2.3 SSH Key 的生成与配置一次配置长期省心连接 GitHub 有两种常用协议HTTPS 和 SSH。HTTPS 每次 push 都需要输入用户名和密码或者用个人访问令牌非常麻烦。SSH 是密钥对的机制公钥放 GitHub私钥留在本地配对成功之后就可以免密操作。在终端里执行ssh-keygen -t ed25519 -C 你的注册邮箱一路回车即可默认路径是~/.ssh/id_ed25519。如果你的系统不支持 ed25519 算法比较老的机器可以用ssh-keygen -t rsa -b 4096 -C 你的注册邮箱生成之后查看公钥内容cat ~/.ssh/id_ed25519.pub复制输出的那一整段字符串然后在 GitHub 页面右上角头像 → Settings → SSH and GPG keys → New SSH key粘贴进去保存。验证是否配置成功ssh -T gitgithub.com如果看到Hi 用户名! Youve successfully authenticated恭喜免密登录已经通了。这一步值得花时间做对后面每次 push 都受益。2.4 设置本机提交身份为什么 commit author 会报错很多人遇到commit author is not之类的提示根源就是本机 Git 没配置用户信息。Git 每次提交都会在 commit 记录里写入作者和邮箱。如果这个邮箱和你 GitHub 绑定的邮箱不一致GitHub 就不会把这次提交关联到你的账号上严重一点会直接拒绝推送。配置命令git config --global user.name 你的GitHub用户名 git config --global user.email 你的GitHub注册邮箱--global表示全局生效也就是这台电脑上所有仓库都用这个身份。如果想针对某个仓库单独设置去掉--global在项目目录下执行即可。查看当前配置用git config --list。这里有个小坑有些人会有多个邮箱一个工作一个私人结果提交记录里一会儿是 A 邮箱一会儿是 B 邮箱GitHub 的贡献图就显示不全。我的建议是统一用一个主邮箱或者给不同的项目仓库单独配身份。3. 建仓实操从网页点几下到本地git init3.1 浏览器里点几下先做一个空仓库登录 GitHub点击页面右上角的加号图标选择 New repository。需要填Repository name仓库名建议全小写英文用短横线分隔比如my-blog、todo-appDescription一句话描述项目可选Public / Private公开仓库所有人都能看到私有仓库只有你授权的人能看到。个人练习建议先用 Private做好之后想展示再改 Public这页下面有几个初始化选项Add a README file、Add .gitignore、Choose a license。对于初学者我的建议是第一次先什么都别勾选创建一个完全空白、没有任何文件的仓库。为什么因为你要亲手把本地项目通过命令推上去这样才能理解仓库和项目的关联过程。如果是练习 GitHub 操作可以先勾上 README这样仓库一创建就有一个默认文件方便测试 clone。创建完成后页面会跳到仓库首页上面有一个仓库地址分 HTTPS 和 SSH 两种。复制 SSH 形式的地址形如gitgithub.com:用户名/仓库名.git后面要用。3.2 本地项目与远程仓库建立关联的四个步骤当你已经有一个本地项目文件夹里面攒了一堆代码想把它放到 GitHub 上操作分四步cd 你的项目目录 git init git add . git commit -m first commitgit init会在当前目录初始化一个 Git 仓库生成一个隐藏的.git文件夹本地版本管理从此开始。git add .把所有文件加入暂存区git commit把暂存区的内容正式提交一条记录。接下来把本地仓库和远程仓库关联起来git remote add origin gitgithub.com:用户名/仓库名.git git branch -M main git push -u origin maingit remote add origin是把远程仓库地址绑定为名为 origin 的远程源。git branch -M main是把当前分支重命名为 mainGitHub 默认主分支叫 main。git push -u origin main是推送到远程并建立追踪关系加了-u之后以后在本地直接用git push就行不用每次指定分支。如果之前建仓库时勾了 README本地执行git push时大概率会收到一个 non-fast-forward 错误因为远程和本地各自的提交历史没有关联。解决办法是把远程内容先拉下来合并git pull origin main --allow-unrelated-histories这个选项允许两个完全无关的历史进行合并是新手最常遇到的合并场景。如果仓库不是空的建议直接在本地先建好文件再和远程关联能少踩不少坑。3.3 README、LICENSE、.gitignore 到底怎么选这三个文件几乎是每个正经仓库必备的。README.md 是仓库的脸面。GitHub 会自动渲染这个文件显示在仓库的代码列表下方。内容一般包括项目是做什么的、怎么安装、怎么运行、目录结构说明。写清楚 README别人看你的代码会非常省力这也是开源项目协作的基础。LICENSE 是开源许可证。如果你建了公开仓库但没有声明许可证代码默认是“保留所有权利”的状态别人不能合法地复制、修改、分发。所以不是开了源就等于别人能用得先声明许可证。个人项目推荐常见的 MIT License简短自由适合大多数情况。如果你不确定用哪个可以到 choosealicense.com 看看说明。.gitignore 是用来告诉 Git“这些文件不用加入版本控制”的。比如 Python 项目的__pycache__、虚拟环境venvNode 项目的node_modulesIDE 的.idea、.vscode文件夹。这些文件要么体积巨大要么是本地环境相关信息提交到仓库里既拖慢 clone 速度又容易泄露本地配置。GitHub 官网的模板库提供了各种语言的现成.gitignore你建仓库的时候可以按项目类型选择。3.4 仓库结构的一个实用建议新手经常犯的错是把仓库当垃圾桶什么文件都往里扔。我的建议是一个仓库聚焦一件事。你想做个人博客就单独一个仓库想整理面试题笔记单独一个仓库想练手爬虫脚本再单独一个仓库。不要搞出一个叫test的仓库里塞了十个不知道什么用的文件夹三个月后你自己都看不懂。另外仓库内部至少区分三类内容源码、文档、配置。源码按语言习惯组织比如 Python 常见的src/目录文档集中在docs/或者 README配置文件放根目录。这样别人在看项目时候的认知负担会小很多你自己做维护也轻松。4. 提交实操从git add到git push的完整闭环4.1 每次提交前先看一眼git status很多人在提交代码之前不看状态直接一个git add . git commit就完事结果把不该提交的文件也带进去了。我强烈建议你把git status变成肌肉记忆。这条命令会告诉你当前工作区里哪些文件被修改了、哪些是新增的、哪些已经被暂存了。git status输出里会有两列Changes to be committed已在暂存区的、Changes not staged for commit已修改但还没 add 的。你只需要快速扫一眼确认没有意外文件再进行下一步。养成这个习惯能避免 80% 的误提交事故。4.2 理解暂存区为什么不能一把梭Git 的提交过程分为工作区、暂存区、版本库三层。工作区就是你看到的文件暂存区是提交的前置缓冲区你git add就是把文件放进这个缓冲区执行git commit才真正生成一份快照存入版本库。这也意味着你完全可以分批次提交。改了一堆文件其中两个相关题目可以组成一条提交另外三个属于另一个功能那就git add 文件1 文件2先提交第一组再git add 文件3 文件4 文件5提交第二组。这样提交历史就清晰很多以后查 bug、回滚版本都方便。常用命令是这两个git add . # 添加所有变动 git add 指定文件路径 # 精确添加单个或多个文件练习阶段我用git add .比较多但正式项目里我更喜欢精确到文件。因为一次提交只做一件事是 commit message 规范化的前提。4.3 commit 消息怎么写以后才会感谢自己git commit -m 提交信息是大多数人的写法但-first commit、-update、-fix这类信息基本等于没写。三个月后回看提交历史你根本不知道那次 update 更新了什么。业界常用的约定是 Conventional Commits语义化提交格式是type(scope): subject其中 type 常见的有type含义feat新增功能fix修复 bugdocs文档变更style格式调整不影响代码逻辑refactor重构不新增功能也不修 bugtest增加或修改测试chore构建、依赖等琐碎变更subject 用一句话说清楚这件事英文建议用祈使句比如feat: add user login page。中文也可以用关键是清晰。比如你修复了一个登录超时 bug提交信息可以写成git commit -m fix: 修复登录状态过期后未跳转的问题这样生成的提交历史不仅是给机器看的更是给未来的你和同事看的。很多团队还会用 commit message 自动生成 changelog格式统一就格外重要。4.4git push与-u参数到底是什么意思git push -u origin main这条命令里origin是远程源的别名main是本地分支名-u是--set-upstream的简写意思是设置上游追踪。设好之后这条分支的默认远程和远程分支就固定了以后直接敲git push就行。如果不用-u每次推送都得写完整的git push origin main少打几个字倒不是重点重点是-u建立了本地分支和远程分支之间的对应关系这会影响后面git pull、git status对分支异同的判断。所以第一次推分支时养成带上-u的习惯。如果你的分支名还是老的masterGitHub 也会自动帮你把默认分支重命名为main。建议本地也统一用main避免主分支名歧义。要是建仓时间早本地一直叫master可以用之前提到的git branch -M main一次性改名。4.5 一条命令回退到任意历史版本提交历史是用git log查看的。默认输出很长可以加参数简化git log --oneline --graph --decorate--oneline每条提交只显示一行--graph显示分支图--decorate标注当前分支指针。这是我最常用的查看命令。如果想撤销某次提交有两种方式。git reset直接移动指针适合还没有推送到远程的本地提交git revert是生成一条反向提交适合已经推送到远程的情况因为它不会改写历史别人 pull 的时候更安全。# 回退上一个提交保留工作区改动 git reset HEAD~1 # 撤销某个已经在远程的提交 git revert 提交ID回退之前务必确认本地没有未保存的改动否则可能造成工作区内容丢失。这里的核心逻辑是已推送的提交不要用 reset用 revert未推送的随便 reset。记住了协作项目里不再有“随便”二字。5. 协作实操分支、合并与 Pull Request5.1 分支为什么能实现“并行开发”分支是 Git 最强大的设计之一你可以把它理解为平行宇宙。主线main保持不变开发者在各自的分支上独立开发新功能互不影响。功能完成后再合并回主线。这个机制解决了多人在同一个仓库里协作的根本矛盾如果所有人都直接在 main 上提交今天你推一下、明天我推一下一有冲突整个仓库就乱了。分支让每个人有了自己的工作空间什么时候合并、什么时候放弃都掌握在自己手里。常用的分支操作git branch 新分支名 # 创建分支 git switch 分支名 # 切换分支也可以用 git checkout 分支名 git switch -c 新分支名 # 创建并切换 git branch -d 分支名 # 删除分支我自己实际开发中习惯每个功能开一个分支比如feature/login、bugfix/fix-timeout。分支名带上前缀feature、bugfix、docs一眼就知道这个分支的用途。5.2 一次完整的多人在线协作流程假设你和同事小张一起维护一个项目。现在要加一个新功能完整流程是这样的第一步小张把最新代码拉到本地并创建功能分支git pull origin main git switch -c feature/add-export第二步小张在功能分支上正常写代码、提交、推送远程git add . git commit -m feat: 增加数据导出功能 git push -u origin feature/add-export第三步小张在 GitHub 仓库页面点 Compare pull request把feature/add-export合并到main。同时你作为项目维护者收到这个 Pull Request 通知可以点开查看改动内容评论、提意见最后点 Merge pull request 合并。这个过程中的关键点是大家永远不要直接往 main 上推代码所有改动都通过 Pull Request 进入主分支。Pull Request 既是代码审查的工具也是留痕凭证。如果有问题维护者可以在合并前要求修改这就避免了很多低级错误进入主分支。5.3 Fork 与 Pull Request开源项目的贡献方式如果你不是仓库的协作者是外人想给一个开源项目贡献代码正确的姿势是 fork。Fork 的意思是复制一个原仓库到你自己的 GitHub 账户下你在自己 fork 出来的副本上修改然后再向原仓库提 Pull Request。流程是打开目标项目点右上角 Forkclone 你自己的 fork 到本地配置一个 upstream remote 指向原仓库方便拉取最新代码建分支、改代码、push 到你自己的 fork在 GitHub 上向原仓库提 Pull Request配置 upstream 的命令git remote add upstream 原仓库地址 git fetch upstream git merge upstream/main这样即使原项目每天都在更新你也能随时同步到最新版本不会因为基于旧代码而提不出合格的 PR。这个流程在各类安全应急响应平台、开源工具、公益项目贡献场景中非常常用本质是一样的先产生一份独立副本改好再申请合入。5.4 冲突到底怎么解决才能不发怵合并时遇到冲突conflict是每个用 Git 的人必经之路。所谓冲突其实不复杂两个分支都修改了同一块内容Git 无法判断哪个是正确结果就让你人工裁决。我模拟一个最简单的场景。小张在分支上把 README 第一行改成了“Hello from feature”你在 main 上把第一行改成了“Hello from main”。合并时 Git 会报错并在 README 文件中插入冲突标记 HEAD Hello from main Hello from feature feature/add-export HEAD和之间是当前分支内容和 分支名之间是另一分支内容。你要做的就是用编辑器打开这个文件删掉冲突标记把内容改成你想要的最终版本然后git add README.md git commit -m merge: 解决README首行冲突冲突并不可怕可怕的是不看冲突内容直接乱加文件。我见过有人把一个整文件都删掉的结果合并上去之后模块直接缺失。解决办法也很简单冲突文件用 IDE 自带的合并工具打开会自动分栏显示左右两边直观很多。6. 高频问题排查实录我踩过的坑希望你跳过6.1 GitHub 打不开、下载慢怎么处理国内访问 GitHub 偶尔会出现网页加载慢、clone 卡住、下载大文件半天没反应的情况。这里分享几个我实测有效的处理方案按推荐顺序排列第一优先考虑换 DNS。部分网络环境下默认 DNS 解析 GitHub 的地址会产生错误的解析结果你把它改成1.1.1.1或8.8.8.8对应 IPv4和2606:4700:4700::1111对应 IPv6很多时候问题就缓解了。修改 DNS 后需要刷新缓存命令行先执行ipconfig /flushdnsWindows或sudo killall -HUP mDNSRespondermacOS。第二使用 GitHub 镜像站点。GitHub 之外有一些社区维护的只读镜像站可以加速大文件下载。搜索“GitHub 镜像下载”能找到相关服务但注意镜像站一般只适合下载 release 附件不适合日常 push 代码。下载 zip 包时可以试试。第三clone 时加参数减少数据量git clone --depth1 仓库地址--depth1是浅克隆只拉取最近一次提交历史提交全部不下载。对于只需要代码内容的人来说这一招效果立竿见影。如果之后想看完整历史再执行git fetch --unshallow补全。第四clone 改成git clone -c http.lowSpeedLimit0 -c http.lowSpeedTime999999如果是因为网络中大文件传输超时中断这个参数可以避免因为低速而断连。不过这只是缓解手段根源还得看网络环境。6.2git push -u origin main一直提交不上去这个问题的成因很多我按出现频率排个序认证失败最常见如果你用的是 HTTPS 方式Git 不会接受你的账号密码明文必须使用 Personal Access TokenPAT。到 GitHub 页面Settings → Developer settings → Personal access tokens → Generate new token勾选repo权限生成后复制一次只显示一次然后 push 时用户名填你的 GitHub 用户名密码那一栏粘贴 token。分支名不一致本地是master远程是main。看git branch确认本地分支名需要改名就执行git branch -M main。本地和远程有分叉历史如果你本地和远程各自有不同的提交记录会被拒收。执行git pull origin main --allow-unrelated-histories合并后再 push。文件太大超过限制GitHub 单文件最大 100MB超过会拒绝。如果仓库里有大数据文件要考虑用 Git LFS 管理或者干脆不要纳入版本控制直接更新.gitignore。排查的时候别慌对着git push的报错信息看关键字基本都能定位。Git 的报错虽然英文但已经写得相当直白了把关键短语复制到搜索框里搜一下比自己瞎试强百倍。6.3commit author is not报错的根源与修复这个提示的完整语境通常是你在 GitHub 提交评论或 PR 时系统提示提交的作者不是仓库的协作者。核心原因是git config里的邮箱和你 GitHub 账号绑定的邮箱不一致GitHub 无法认定这个人是你。解决办法分两步。先改本机配置git config --global user.email 你的GitHub账户邮箱 git config --global user.name 你的GitHub用户名如果历史提交已经带着错误邮箱推上去了可以修改最近一次提交的作者信息git commit --amend --author正确用户名 正确邮箱 --no-edit对于更早的历史提交就要用git filter-branch或者git rebase批量改写操作复杂且影响远程共享历史务必在确认确实需要时再动。我给你的实践建议是新机器配置 Git 后第一件事就是用一个待提交项目跑一次git log确认作者信息没问题。这个习惯值得培养。6.4 IDEA 提交 Git 的报错与提交窗口消失在 IntelliJ IDEA 里操作 Git经常碰到两个问题。一是提交窗口找不到了。其实它只是被隐藏了用快捷键Alt 9Windows/Linux或者Cmd 9macOS可以调出 Git 工具窗口或者点左下角的方块图标在列表里把它勾出来。提交相关的窗口在顶部菜单VCS → Commit...里也能找到。二是提交时遇到Cant commit changes due to a conflict。这说明本地有未处理的冲突文件。IDEA 会弹出一个对话框列出冲突文件你双击每个冲突文件右侧会显示冲突区域手动选择保留左侧、右侧还是两者都要处理后标记为已解决才能继续提交。IDEA 的图形化合并工具比命令行友好很多新手遇到冲突建议优先用 IDE 解决。6.5 常见报错速查表报错提示主要原因解决办法Permission denied (publickey)SSH key 未添加或没配对ssh -T gitgithub.com测试检查公钥是否已配置fatal: remote origin already exists远程源已存在用git remote -v查看git remote set-url origin 新地址修改fatal: Not a git repository没执行git init或目录不对cd到项目根目录执行git initRepository not found远程地址不存在或权限不足检查仓库地址是否拼对、私有库是否有访问权限src refspec main does not match any本地不存在 main 分支且没有提交先git add . git commit再 pushfatal: unable to access ... OpenSSL SSL_read网络波动或代理不对检查网络状态关闭不必要的代理设置或换 DNS 后重试Updates were rejected because the remote contains work远程有本地没有的提交git pull合并后再 pusherror: You have not concluded your merge上一次 merge 没处理完先解决冲突或git merge --abort终止再重启这张表不能覆盖所有情况但覆盖了绝大多数新手的起步场景。遇到表里没有的先复制报错关键词用英文去 GitHub 官方文档或 Stack Overflow 搜通常答案就在前几条。动手能力比阅读能力更重要。我见过太多人收藏了几十篇 Git/GitHub 教程但自己从没建过一个仓库最后写代码写了好几年还只会用“压缩包 u 盘”同步代码。我在实际项目中最大的体会是GitHub 熟练度不是学出来的是用出来的。哪怕你今天只创建了一个存放笔记的私有仓库只是把一个 README 文件推了上去也算真正迈出了第一步。最后再分享一个小技巧给常用命令设置别名能显著提升操作手感。在终端执行git config --global alias.st status git config --global alias.lg log --oneline --graph --decorate git config --global alias.cm commit设置之后git st就能看状态git lg就能看提交图。这些小工具看着不起眼但日积月累省下来的时间相当可观。希望这篇精炼版教程能帮你跨过 GitHub 入门的那道坎赶紧打开终端建一个仓库试试吧。
返回列表