本文面向零基础读者,通过以下 9 个章节,帮助大家从零开始掌握 Git 与 GitHub 的核心操作:从认识 Git 的基本概念、安装并配置 Git Bash,到常用命令实战、在 GitHub 上创建仓库并上传代码,再到远程更新、团队权限交付以及常见上传问题排查。每个章节都配有可跟做的步骤和命令示例,学完即可上手日常的版本管理与协作开发。
引言
无论是刚开始接触编程的学生,还是已经工作但仍对版本管理感到陌生的开发者,「代码怎么保存历史版本」「怎么和同事一起改同一个项目而不互相覆盖」「怎么把本地代码传到 GitHub」都是绕不开的问题。Git 是当前最主流的分布式版本控制系统,GitHub 则是基于 Git 的代码托管与协作平台,二者结合构成了现代软件开发中最基础的协作流程。
本文不假设你有任何 Git 或 GitHub 使用经验,从概念认知、环境安装开始,逐步带你掌握常用命令、仓库创建、代码上传、远程更新、团队权限交付以及常见上传问题排查。每个操作都以“能跟着做”为目标,尽量使用短命令和清晰步骤,帮助你在完成教程后可以独立完成日常的版本管理与团队协作场景。
SEO 摘要
这是一篇面向零基础读者的 Git 与 GitHub 入门教程,涵盖 Git 是什么、Git Bash 下载安装与配置、Git 常用命令速查、GitHub 创建远程仓库、本地代码上传到 GitHub、远程代码更新、Git 团队协作与权限交付,以及 Git 上传失败、认证失败、合并冲突等常见问题排查方法。文章按 9 个章节循序渐进展开,每个操作都配有直接可执行的命令和说明,适合刚开始接触版本控制与 GitHub 代码托管的开发者和学生系统学习。关键词:Git、GitHub、Git Bash、Git 常用命令、远程仓库、团队协作。
目录
- 认识 Git 与 GitHub
- 环境准备:下载与安装 Git Bash
- Git 常用命令速查
- 在 GitHub 创建远程仓库
- 本地仓库关联并上传到 GitHub
- 更新代码与远程更新
- 团队协作与权限交付
- 常见上传问题排查
- 总结与学习建议
1. 认识 Git 与 GitHub
什么是 Git
Git 是一个分布式版本控制系统,最初由 Linus Torvalds 为 Linux 内核开发而创建。它的核心作用是帮助你记录代码的每一次变更:谁在什么时候、因为什么原因修改了哪些文件,都能被清晰地追踪和回溯。
Git 还高效地存储仓库历史。截至2025年,当前版本 其中 Linux 内核的源代码为 1.7 GB。 Git 仅在 5.5 GB 内存中存储了 Linux 项目的完整历史(140 万次提交)。
Git 的核心项目只是命令行工具,但 Git 却爆发了流行 得益于Git的托管服务,如GitLab、GitHub等,2010年代初。
自从Git诞生以来,许多图形界面、编辑器集成, 并且已经开发了命令行工具,使使用 Git 更加便捷。 你喜欢的开发工具可能已经内置了Git集成。
理解 Git 最直观的类比是「游戏存档」:每当你完成一个阶段的修改,就可以保存一个“存档”(在 Git 里叫提交 commit)。如果之后改出了问题,随时可以回到之前的存档。但与游戏存档不同的是,Git 天生支持多人协作——不同的人可以同时修改同一个项目,之后再把这些修改合并到一起,而不会轻易覆盖彼此的工作。
和早期的集中式版本控制工具(如 SVN)相比,Git 的最大特点是“分布式”:每台电脑上都保存着完整的历史记录,即使服务器暂时不可用,你也能在本地查看历史、提交修改,等网络恢复后再同步到远程。
Git 的核心概念
要顺利使用 Git,需要先理解四个基本区域和两个重要对象:
- 工作区(Working Directory):你在电脑上实际查看和编辑的文件夹,所有新建或修改的文件最初都在这里。
- 暂存区(Staging Area):一个“待提交清单”。通过
git add命令,你可以把想要保存的修改先放入暂存区,确认无误后再统一提交。这样就能精准控制“哪些修改算作这一次提交”。 - 本地仓库(Local Repository):真正保存提交历史的地方。执行
git commit后,暂存区的内容就会永久记录到本地仓库中。 - 提交(commit):一次“存档”,包含修改内容、作者、时间以及一条说明信息。每个提交都有一个唯一的哈希值作为标识。
- 分支(branch):一条独立的开发线。你可以从主线(通常是 main)拉出一条分支来开发新功能,完成后合并回主线,期间互不干扰。
下面这张流程图展示了代码从“编辑”到“入库”的完整路径:
什么是 GitHub
GitHub 是一个基于 Git 的代码托管与协作平台。你可以把它理解为“代码的云端仓库”:本地用 Git 管理历史,再把整个仓库上传到 GitHub,方便备份、分享和多人协作。
除了托管代码,GitHub 还提供了一系列协作工具:
- Issue:用于记录问题、需求或讨论,是任务管理的基础。
- Pull Request(PR):请求别人把你分支上的修改合并到主分支,是团队协作的核心机制。
- Actions:自动化工作流,可以在推送代码后自动执行测试、构建、部署等任务。
- 权限管理:精细控制谁能查看、修改或管理某个仓库。
Git 与 GitHub 的关系
很多初学者会把二者混为一谈,这里明确区分一下:
- Git 是工具:运行在你电脑上的命令行程序,负责本地的版本管理,不依赖网络也能工作。
- GitHub 是平台:托管在云端,存储你的 Git 仓库,让代码可以跨设备同步、被他人访问。
简单来说,你可以在完全不使用 GitHub 的情况下用 Git 管理本地版本;而 GitHub 上托管的每一个仓库,究其本质都是一个 Git 仓库。二者配合使用,才能实现“本地管理 + 远程协作”的完整闭环。
2. 环境准备:下载与安装 Git Bash
下载 Git
Git 的官方下载地址是 git-scm.com,进入网站后它会根据你的操作系统推荐对应版本:
- Windows:下载
.exe安装包。 - macOS:可以选择安装包,也可以直接使用系统自带的
git(在终端输入git --version检查)。 - Linux:通常使用包管理器安装,例如 Ubuntu 下执行
sudo apt install git。
Windows 下安装 Git Bash
下载完成后双击安装包,一路按照向导操作即可。下面是几个关键步骤的说明:
- 组件选择:保持默认即可,确保勾选了 “Git Bash Here” 和 “Git GUI Here”,方便日后在任意文件夹快速打开 Git 命令行。
- 默认编辑器:推荐选择 Vim 或 VS Code。如果对 Vim 不熟悉,可以先选 VS Code,避免以后合并提交时遇到编辑器操作困难。
- PATH 环境变量:建议选择 “Git from the command line and also from 3rd-party software”,这样可以在系统终端中直接使用 Git 命令。
- 换行符配置:Windows 上推荐选择 “Checkout Windows-style, commit Unix-style line endings”,能有效减少跨平台协作时的换行符警告。
安装完成后,Git Bash 就是你的 Git 命令行工具,界面和操作方式与 Linux 终端非常接近。
验证安装
打开 Git Bash(或任意终端),输入以下命令查看版本号:
git--version如果能正常显示类似git version 2.x.x的信息,说明安装成功。
初次使用配置用户名与邮箱
每次提交都会记录作者信息,因此首次使用前需要配置用户名和邮箱。这两项信息并不会用于登录验证,只是作为提交者的身份标识。在 Git Bash 中执行:
gitconfig--globaluser.name"你的名字"gitconfig--globaluser.email"你的邮箱"建议这里的邮箱与你的 GitHub 账号邮箱保持一致,这样提交记录才能正确关联到 GitHub 账户。配置完成后可用git config --list检查是否生效。
3. Git 常用命令速查
这一章按使用场景分类整理高频命令。每个命令后面都有简要说明,建议边看边在自己的仓库中实际操作一遍。
仓库初始化与克隆
# 初始化本地仓库:把当前文件夹交给 Git 管理gitinit# 克隆远程仓库:把 GitHub 上的项目完整下载到本地gitclone<仓库地址>git init会在当前目录生成一个隐藏的.git文件夹,里面存储着所有版本历史。git clone则一步到位:自动初始化仓库、关联远程、拉取所有文件和历史。
查看状态与历史
# 查看工作区与暂存区的当前状态gitstatus# 查看提交历史(详细版 / 精简版)gitloggitlog--oneline# 查看文件被修改了哪些内容gitdiffgit status是最常用的命令之一,它会告诉你“哪些文件被改过、哪些已暂存、哪些还没被跟踪”。git diff默认显示“工作区相对于暂存区”的差异;如果想看“暂存区相对于上次提交”的差异,可以加参数git diff --cached。
暂存与提交
# 把所有修改添加到暂存区gitadd.# 只添加指定文件gitadd<文件名># 把暂存区内容正式记录到本地仓库gitcommit-m"提交说明"一个完整的最小工作流是:修改文件 →git add .→git commit -m "说明"。提交信息要写得简洁明确,例如“修复登录页样式问题”,方便日后追溯。
分支操作
# 查看所有分支gitbranch# 创建新分支gitbranch<分支名># 切换到指定分支(两种写法均可)gitcheckout<分支名>gitswitch<分支名># 把另一个分支合并到当前分支gitmerge<分支名>日常开发中,建议不要在 main 分支上直接开发,而是新建功能分支,完成后合并回 main。例如:git branch feature-login创建“登录功能”分支,再git switch feature-login切换过去开发。
远程相关
# 查看已配置的远程仓库地址gitremote-v# 给本地仓库添加一个名为 origin 的远程地址gitremoteaddorigin<仓库地址># 把本地提交推送到远程gitpush# 拉取远程更新并合并到本地gitpullorigin是远程仓库的默认别名,可以理解为“这个地址的代称”,后续用git push origin main即可指代把 main 分支推到那个远程地址。
撤销与回退
# 撤销工作区里对某个文件的修改(回到暂存区/最近提交的状态)gitrestore<文件名># 回退提交记录gitreset# 用一个新的提交撤销某个历史提交gitrevert<提交号>这三条命令的破坏性依次递减:git restore只丢工作区修改;git reset会移动提交历史;git revert不修改历史,而是在最前面新增一条“反向提交”,对于已经推送到远程的提交,推荐使用git revert而不是reset。
4. 在 GitHub 创建远程仓库
注册并登录 GitHub 账号
打开 github.com,点击 Sign up 注册账号。填写用户名、邮箱和密码后,按提示完成邮箱验证即可。用户名会出现在仓库地址中(如github.com/你的用户名/仓库名),建议起一个简洁易记的名字。
创建仓库
登录后点击页面右上角的 “+” 号,选择 “New repository”,进入创建页面后需要填写:
- Repository name(仓库名):项目名称,建议使用英文短横线命名,如
my-first-repo。 - Description(描述):可选,一句话说明项目用途。
- 可见性:Public(公开,所有人可见)或 Private(私有,仅自己和被邀请的人可见)。
是否初始化 README、.gitignore、License
创建页面下方有三个可选项:
- README:勾选后会自动生成一个
README.md文件,通常用于展示项目介绍和使用说明。即使不勾选,之后也可以随时手动添加。 - .gitignore:用于声明哪些文件不需要被 Git 跟踪(如编译产物、日志、本地配置)。GitHub 提供了多种语言模板可以直接选择。
- License:开源许可证,规定别人如何使用你的代码。纯学习项目可以先不选,以后再补。
重要提示:如果勾选了“初始化 README”,远程仓库会自带内容。后续把本地已有项目推上去时,需要先拉取或使用--allow-unrelated-histories参数,避免历史不一致。本教程的第 5 章会以“不勾选初始化”的方式演示最顺畅的上传流程。
获取仓库地址:HTTPS 与 SSH
创建完成后,在仓库页面点击绿色的 “Code” 按钮,可以看到两种地址:
- HTTPS:以
https://github.com/...开头。使用方便,但推送时需要凭据(账号 + Personal Access Token)。 - SSH:以
git@github.com:...开头。配置公钥后免密推送,更安全顺畅,适合频繁操作。
新手建议先从 HTTPS 开始,等熟悉后再切换到 SSH。两种地址都可以随时在仓库页面查看和切换。
5. 本地仓库关联并上传到 GitHub
这一章覆盖最常见的三种场景。请根据自己的情况选择对应小节。
场景一:已有本地仓库,推送到新建的远程仓库
如果你已经用git init在本地创建了仓库,并且有了至少一次提交,那么只需三步:
# 1. 给本地仓库关联远程地址gitremoteaddorigin<仓库地址># 2. 把本地分支改名为 main(如果原本就是 main 可跳过)gitbranch-Mmain# 3. 首次推送,并建立本地与远程的跟踪关系gitpush-uorigin main完成后,远程 GitHub 上就能看到你推送的全部文件和提交历史。-u参数会记住“本地 main 对应远程 origin/main”,以后再推送时直接git push即可。
场景二:从零开始,先创建本地仓库再上传
如果本地项目还没有被 Git 管理,完整流程如下:
# 1. 项目文件夹中初始化仓库gitinit# 2. 添加所有文件到暂存区gitadd.# 3. 完成第一次提交gitcommit-m"first commit"# 4. 关联远程仓库gitremoteaddorigin<仓库地址># 5. 改名 main 并推送gitbranch-Mmaingitpush-uorigin main其中<仓库地址>就是上一章创建仓库后复制的那串 HTTPS 或 SSH 地址。
场景三:已有远程仓库,克隆到本地开发
如果远程仓库已经存在(无论是你自己的还是别人的),可以直接克隆到本地:
gitclone<仓库地址>克隆完成后会得到一个与仓库同名的文件夹,里面已经配置好了远程关联和分支跟踪关系。之后你只需正常修改文件,然后执行:
gitadd.gitcommit-m"说明"gitpush就可以把修改同步回远程仓库。
6. 更新代码与远程更新
本地更新后推送远程
这是最常规的同步方式:本地修改完成后,把最新提交推送到远程,让别人也能获取到。
gitadd.gitcommit-m"完成新功能"gitpush如果当前分支已经设置了-u跟踪关系,git push会直接推进到对应的远程分支;首次推送或新分支需要写成git push -u origin <分支名>。
拉取远程最新代码
当别人向远程仓库推送了更新,你需要把这些更新同步到本地:
# 拉取远程更新并自动合并到当前分支gitpullgit pull实际上是两条命令的组合:
git fetch:把远程的最新提交下载到本地,但不会自动合并,工作区不受影响。git merge:把下载下来的更新合并到当前分支。
如果你习惯“先看看远程更新了什么,再决定是否合并”,可以这样做:
# 只下载更新,不合并gitfetch# 查看远程分支与本地分支的差异gitdiffmain origin/main# 确认没问题后再合并gitmerge origin/main多人协作时保持同步
多人同时修改同一个仓库时,最容易出问题的就是“推送被拒”。一个稳妥的协作习惯是:每次推送前先拉取。
gitpull origin maingitpush origin main这样在本地先把远程的最新更新合入,再推送自己的修改,可以大幅减少冲突。
解决合并冲突的基本流程
当两个人修改了同一个文件的同一区域时,Git 无法自动判断该保留哪一份,就会产生冲突(conflict)。冲突发生时,Git 会在文件中用类似下面的标记标出冲突区域:
<<<<<<< HEAD 你本地的修改 ======= 远程的修改 >>>>>>> origin/main解决步骤如下:
- 定位冲突文件:运行
git status,冲突文件会显示在 “Unmerged paths” 列表中。 - 手动修改:打开冲突文件,删除
<<<<<<<、=======、>>>>>>>标记,并按业务需求保留正确内容。 - 重新暂存提交:
gitadd<解决冲突的文件>gitcommit-m"解决合并冲突"- 继续推送:
git push。
7. 团队协作与权限交付
GitHub 仓库权限角色
GitHub 为组织仓库提供了多级权限,从高到低依次为:
- Owner:拥有者,拥有仓库的最高管理权,可以删除仓库、转移所有权。
- Admin:管理员,几乎拥有全部管理权,但不能删除仓库或转移所有权。
- Maintain:维护者,可以管理 Issue、PR,但不能进行敏感设置。
- Write:写权限,可以推送代码到受保护分支之外的分支。
- Triage:只读 + 处理 Issue 和 PR 的权限,不能推送代码。
- Read:只读,可以查看代码但不能修改。
个人仓库的权限模型相对简单:仓库所有者拥有全部权限,其他人通过“添加协作者”获得指定权限。
添加协作者
在仓库页面依次进入Settings → Collaborators(或Settings → Access → Collaborators,不同版本入口略有差异),点击 “Add people”,输入对方的 GitHub 用户名或邮箱,即可邀请他成为协作者。被邀请人接受后,就能按照分配的权限访问仓库。
通过 Organizations 管理团队
如果项目属于一个组织(Organization),权限管理会更系统化。在组织下可以创建多个Team(团队),把成员加入团队后,再为团队分配不同仓库的权限。这样当有新成员加入或有人离职时,只需调整团队成员,而不用逐个修改仓库协作者。
协作工作流:Fork + Pull Request
对于开源项目或没有直接写权限的仓库,标准的协作方式是Fork + Pull Request:
- Fork:进入别人的仓库,点击右上角 “Fork”,把它复制一份到自己的账号下。
- Clone:把 fork 后的仓库克隆到本地。
- 开发:创建分支、修改代码、提交并推送到自己的仓库。
- 创建 Pull Request:进入原仓库,点击 “New pull request”,选择你的分支,提交合并请求并说明修改内容。
- 等待合并:原仓库维护者会审核你的改动,通过后合并,或提出修改意见。
「权限交付」场景
“权限交付”通常指项目从一个人或团队交接给另一个人或团队时,需要完成的权限转移操作:
- 转移仓库所有权:进入Settings → Danger Zone → Transfer ownership,输入新所有者的账户名即可转移。转移后原所有者将成为普通管理员。
- 交接管理员权限:如果不想转移所有权,只把对方设为 Admin 或 Maintain 即可。
- 移除协作者:进入 Collaborators 页面,点击成员右侧的移除按钮,即可收回其访问权限。
交接项目时,除了修改仓库权限,别忘了同步转移文档、密钥、Issue 任务等附属资源。
8. 常见上传问题排查
上传代码到 GitHub 时遇到报错很正常。下面按“症状 → 原因 → 解决方法”的方式逐一排查。
推送被拒绝:git push 提示 rejected
原因:远程仓库包含你本地没有的提交,直接推送会覆盖远程历史,Git 出于安全考虑拒绝执行。
解决:先拉取远程更新,再重新推送。
gitpull origin main# 如果出现非合并提示,可以使用 rebase 方式gitpull origin main--rebasegitpush origin main认证失败:Authentication failed
原因:GitHub 自 2021 年起不再支持用账号密码直接推送 HTTPS 仓库,必须使用 Personal Access Token(PAT)或 SSH 密钥。
解决:
- HTTPS 方式:在 GitHub 的Settings → Developer settings → Personal access tokens中生成一个 token,复制后在推送输入密码时粘贴它代替密码。
- SSH 方式:生成 SSH 公钥并添加到 GitHub 后,改用 SSH 地址。
远程仓库地址错误
原因:git remote add时地址复制错误,或原地址失效。
解决:先检查当前配置,再修改。
# 查看当前远程地址gitremote-v# 修改 origin 的地址gitremote set-url origin<新地址>分支不一致:main 与 master
原因:Git 的历史默认分支是 master,而 GitHub 新建仓库默认分支是 main。本地旧仓库可能还在使用 master。
解决:统一分支名。
gitbranch-Mmaingitpush-uorigin main文件过大导致上传失败
原因:GitHub 对单文件大小有 100 MB 的硬性限制,超过会直接拒绝推送。
解决:大文件不要直接提交到仓库,改用 Git LFS(Large File Storage)管理。先安装 LFS 并跟踪大文件:
gitlfsinstallgitlfs track"*.zip"gitadd.gitattributesgitaddbigfile.zipgitcommit-m"使用 LFS 管理大文件"gitpush origin main合并冲突
出现 conflict 时的解决步骤已在第 6 章详细说明:定位冲突文件 → 手动修改并删除冲突标记 → 重新git add和git commit。
中文乱码与换行符警告
- 中文乱码:Windows 终端中可执行
git config --global core.quotepath false,让中文文件名正常显示。文件内容乱码则需检查编辑器是否使用 UTF-8 编码保存。 - 换行符警告:Windows 与 Linux/macOS 的换行符不同,执行
git config --global core.autocrlf true(Windows)可让 Git 自动处理,减少跨平台协作时的警告。
FAQ:初学者最常遇到的 5 个问题
忘记配置用户名和邮箱怎么办?
- 检查当前配置:
git config --list - 补充全局配置:
git config --global user.name "你的名字"、git config --global user.email "你的邮箱" - 之后重新提交;如需修改最近一次提交的作者信息,可用
git commit --amend --reset-author。
- 检查当前配置:
误删本地仓库怎么办?
- 如果只是删除了
.git目录,但代码文件还在:重新git init,再关联远程git remote add origin <仓库地址>,然后拉取线上版本git pull origin main --allow-unrelated-histories。 - 如果整个文件夹都删了,但远程仓库还在:直接
git clone <仓库地址>重新拉取即可。 - 如果既没远程备份、也没本地备份,误删后一般无法找回,所以推送前尽量确认远程已有提交。
- 如果只是删除了
推送时提示 non-fast-forward 怎么办?
- 先拉取远程更新:
git pull origin main --rebase - 如出现冲突,按提示解决后执行
git add .和git rebase --continue - 最后重新推送:
git push origin main
- 先拉取远程更新:
首次推送提示 src refspec main does not match any 怎么办?
- 先确认本地已有提交:
git commit -m "first commit" - 再确认分支名是否是 main:
git branch - 若不存在 main 分支,执行
git branch -M main后再推送。
- 先确认本地已有提交:
HTTPS 推送时反复要求输入账号密码怎么办?
- 生成 Personal Access Token,用 token 代替密码输入
- 可启用凭证缓存:
git config --global credential.helper store - 更推荐配置 SSH Key,把公钥添加到 GitHub 后改用 SSH 地址推送。
9. 总结与学习建议
核心流程回顾
恭喜你读到这里!把整篇教程串联起来,一个完整的 Git + GitHub 工作流就是:
配置 Git(用户名邮箱) → 本地开发并提交(git add、git commit) → 关联远程仓库(git remote add) → 推送 GitHub(git push) → 拉取他人更新(git pull) → 团队协作(分支、PR、权限管理)常用命令速记表
最后用一张表把高频命令再梳理一遍,方便日后快速查阅:
| 场景 | 命令 | 说明 |
|---|---|---|
| 初始化 | git init | 把当前目录交给 Git 管理 |
| 克隆 | git clone <地址> | 下载远程仓库到本地 |
| 查看状态 | git status | 查看改动了哪些文件 |
| 暂存 | git add . | 添加所有修改到暂存区 |
| 提交 | git commit -m "说明" | 保存一次版本记录 |
| 推送 | git push | 把提交同步到远程 |
| 拉取 | git pull | 拉取远程更新并合并 |
| 分支 | git branch/git switch | 查看 / 切换分支 |
| 合并 | git merge <分支> | 合并其他分支 |
进阶学习方向
掌握本文内容后,你已经能完成绝大多数日常开发场景。如果希望继续深入,推荐以下方向:
- Git 分支模型(Git Flow):学习如何用规范的分支策略管理团队协作和新版本发布。
- Pull Request 规范:了解优秀 PR 的提交粒度、标题模板和代码评审方法。
- CI/CD 集成:使用 GitHub Actions 在推送代码后自动执行测试、构建和部署,让协作流程更自动化。
- Git 内部原理:了解 commit、blob、tree 等对象模型,能帮助你更从容地应对 rebase、reset 等高级操作。
记住,Git 是一门“用起来才记得住”的技能。现在就去创建一个测试仓库,把上面每条命令都亲手敲一遍吧。