Git 与 GitHub:区别是什么,它们如何协作
Git 是一个运行在你电脑上的版本控制程序,用来保存项目的修改历史。GitHub 是托管 Git 仓库的云端服务,并提供 pull request、代码评审、任务和 CI 等团队协作工具。可以只用 Git 而不用 GitHub,但没有 Git 就没有 GitHub。
Git 与 GitHub 经常被混为一谈,但它们属于不同层次。Git 是你安装在电脑上的版本控制程序,它记录项目的每一个已保存状态,让你可以随时回到其中任何一个。GitHub 是网络服务,保存 Git 仓库的副本,并围绕这些仓库构建了团队协作的工具。最简单的记忆方法是:Git 是引擎,GitHub 则是放置这台引擎的车库和服务。
什么是 Git
Git 是分布式版本控制系统。Linus Torvalds 于 2005 年为开发 Linux 内核而创建了它,此后它成为行业标准。Git 完全在本地运行:历史记录保存在项目内的隐藏文件夹 .git 中,大多数操作都不需要互联网。
“分布式”一词是关键。项目中的每位参与者都在电脑上保存着完整的仓库副本,包括全部历史,而不只是最新的文件。即使服务器消失了,也可以从任何一台工作机器上恢复项目。
Git 本身能做的事情:
- 用提交(commit)记录修改,即带有作者、日期和说明的项目快照;
- 显示每一行是谁、在什么时候、为什么修改的(
git log、git blame); - 在分支中并行开发,并将它们合并;
- 撤销错误,而不丢失其他工作;
- 通过
git push、git pull和git fetch与其他仓库交换历史。
Git 是命令行工具。图形客户端以及编辑器中的 Git 面板(VS Code、IntelliJ IDEA)只是同一批命令的外壳。
什么是 GitHub
GitHub 是托管 Git 仓库的云平台,现属于微软。你在那里创建仓库,用 git push 把本地代码上传,它就对同事、雇主乃至整个互联网(如果仓库是公开的)可见。
但 GitHub 的价值不止于存储。围绕仓库,它提供了 Git 本身没有的功能:
- Pull request:请求把某个分支合并进来,并逐行讨论和评审代码;
- Issues:与项目关联的任务和缺陷报告;
- GitHub Actions:CI/CD,每次 push 时自动运行测试、构建和部署;
- 访问管理:谁可以读取、写入,谁可以合并到受保护的分支;
- 开发者主页:活动图和公开项目,招聘人员会查看;
- GitHub Pages:直接从仓库免费托管静态网站。
“git com”“git hub”之类的搜索通常指的就是这项服务,其网址是 github.com。Git 官方网站是 git-scm.com,安装程序从那里下载。
Git 与 GitHub 对比表
| 标准 | Git | GitHub |
|---|---|---|
| 它是什么 | 版本控制程序 | 托管仓库的网络服务 |
| 运行位置 | 你的电脑 | 云端,通过浏览器和 API 访问 |
| 是否需要互联网 | 不需要,除非与远程仓库交换内容 | 需要 |
| 许可证 | 开源(GPLv2),免费 | 专有服务,有免费和付费套餐 |
| 界面 | 命令行,图形客户端 | 网站、GitHub Desktop 应用、命令行工具 gh |
| 主要任务 | 版本历史、分支、合并 | 团队协作、评审、CI、代码发布 |
| 能否单独使用 | 可以,完全独立 | 不能,GitHub 建立在 Git 之上 |
Git 与 GitHub 如何协同工作
两者之间的连接是 remote,即远程仓库。本地仓库保存着 GitHub 上仓库的地址,并使用一个简短的名称,默认为 origin。之后的交换通过三个命令完成:
git push:把你新的提交发送到服务器;git fetch:下载别人的提交,但不改动你的文件;git pull:下载并立即合并到当前分支(本质上是fetch+merge或rebase)。
需要注意:在你推送之前,GitHub 看不到你的代码。提交只存在于本地,直到执行第一次 git push。这也是新手常犯的错误:“我已经提交了,但 GitHub 上什么都没有”。
典型路径:从本地项目到 GitHub
# 1. 在本地创建仓库
cd my-project
git init
git add .
git commit -m "First commit"
# 2. 在 github.com 上创建空仓库(不要勾选 README),
# 复制它的地址并添加为 remote
git remote add origin git@github.com:username/my-project.git
# 3. 将分支重命名为 main 并推送
git branch -M main
git push -u origin main
参数 -u(完整形式 --set-upstream)会把本地分支 main 与远程分支关联。之后只需输入 git push 和 git pull,无需额外参数。
反向路径:从 GitHub 上的仓库开始
如果项目已经在 GitHub 上,就不用重新创建,而是直接克隆:
git clone https://github.com/username/my-project.git
cd my-project
该命令会下载完整历史,并自动配置名为 origin 的 remote。
身份验证:SSH 还是 HTTPS
自 2021 年起,GitHub 在通过 Git 使用 HTTPS 时不再接受账户密码。有两种可行的方式。
HTTPS + Personal Access Token。 令牌在账户设置中创建(Settings → Developer settings),并代替密码输入。为了不必每次都输入,Git 会使用凭据管理器——在 Windows 上它随 Git for Windows 一起安装。
SSH 密钥。 这是雇主通常希望你会自己配置的方式:
# 生成密钥
ssh-keygen -t ed25519 -C "you@example.com"
# 输出公钥,并把它添加到 GitHub:
# Settings → SSH and GPG keys → New SSH key
cat ~/.ssh/id_ed25519.pub
# 检查连接
ssh -T git@github.com
连接成功时,GitHub 会显示你的用户名的问候语,并说明不提供 shell 访问——这是正常的。此时仓库地址应使用 git@github.com:user/repo.git 格式,而不是 https://。
如果仓库是通过 HTTPS 连接的,只需一条命令即可切换为 SSH:
git remote set-url origin git@github.com:username/my-project.git
GitHub、GitLab 等:区别在哪里
GitHub 并不是唯一的 Git 托管平台。它们都使用相同的 Git,因此仓库可以从一个平台迁移到另一个,历史不会丢失。它们的区别在于围绕代码提供的工具。
| 服务 | 特点 | 何时选择 |
|---|---|---|
| GitHub | 最大的开源社区,GitHub Actions,Copilot | 作品集、开源项目、大多数初创公司 |
| GitLab | 开箱即用的 CI/CD,可部署在自己的服务器上(self-hosted) | 需要把代码放在自有基础设施中的公司 |
| Bitbucket | 与 Jira 及 Atlassian 产品集成 | 身处 Atlassian 生态的团队 |
| Gitea、Forgejo | 轻量的开源自托管方案 | 小团队、家庭服务器 |
在 GitLab 中,合并请求称为 merge request;在 GitHub 中称为 pull request。实质相同:提出来自某个分支的修改,并在合并前讨论。术语不同,但 Git 命令完全一致。
一个本地仓库可以同时配置多个 remote,例如把项目同时镜像到 GitHub 和 GitLab:
git remote add gitlab git@gitlab.com:username/my-project.git
git push gitlab main
git remote -v
如果我一个人工作,需要 GitHub 吗
从技术上讲不需要:Git 本地运行得很好。但即使是单人项目,远程仓库也有三个明显的好处:
- 备份。 笔记本电脑坏了,代码和全部历史仍然保存在服务器上。
- 多设备工作。 在家和在办公室之间,通过
push和pull同步。 - 作品集。 在初级岗位的筛选中,招聘者常常先看 GitHub 主页,而不是简历:有没有真实的项目、有没有清晰的提交说明、有没有 README。
新手应该从哪里开始
不必同时学习 Git 和 GitHub,顺序很重要。先掌握本地的工作循环:git init、git status、git add、git commit、git log,以及分支和合并。当这些操作能够独立完成时,再注册 GitHub,配置 SSH,学习 push、pull、fetch。最后一步是团队流程:fork、为任务创建分支、pull request、评审。
雇主会在你的 GitHub 上看什么
绿色的活动方块并不是最重要的。经验丰富的评审者会在几分钟内关注以下几点:
- 清楚的提交说明,而不是“fix”“123”“修改”;
- 小而合乎逻辑的提交,而不是一次性的“上传项目”;
- 说明如何运行项目的 README;
- 一个
.gitignore文件:仓库中没有node_modules、包含密码的.env或 IDE 配置文件; - 即使在练习项目中,也使用分支和 pull request,这表明你熟悉团队工作流程。
新手常见错误
“fatal: not a git repository”
你在仓库之外运行了 Git 命令。进入项目文件夹,或执行 git init。这与 GitHub 注册无关,是本地错误。
“Permission denied (publickey)”
SSH 密钥未生成、未添加到 GitHub,或没有加载到 ssh-agent 中。检查 ssh -T git@github.com 以及账户设置中的密钥列表。
推送时出现“rejected … (fetch first)”
服务器上有你本地没有的提交,例如你在 GitHub 上创建仓库时勾选了 README。先获取这些修改:git pull --rebase origin main,然后再次 git push。在不清楚会覆盖谁的工作之前,不要使用 --force。
公开仓库中的机密信息
一旦密码或 API 密钥进入提交,即使之后删除文件,它仍然保留在历史中。必须立即重新生成该密钥,并且事先把 .env 添加到 .gitignore。
总结
Git 是保存在你电脑上的版本控制工具,GitHub 则是把这些仓库放在云端、并围绕它们组织团队协作的服务。GitLab、Bitbucket 等都是 GitHub 的替代品,而不是 Git 的替代品:它们底层使用同样的提交、分支和命令。先从本地 Git 开始,然后添加 remote 并配置 SSH。将本地仓库连接到 GitHub、push、pull 和 fetch 在 Git 课程中有实践讲解。
常见问题
GitHub 是免费的吗?
是的,免费套餐允许创建无限数量的公开和私有仓库。付费套餐为团队增加高级功能,以及为私有项目提供更多的 GitHub Actions 运行时长。
没有命令行能使用 GitHub 吗?
可以,通过 GitHub Desktop 或编辑器内置的 Git 面板。但这些工具执行的仍是同样的 Git 命令,了解它们在解决冲突时依然很有用。
有了 GitHub 账户还需要安装 Git 吗?
需要。账户提供存储空间,而在本地处理代码——提交、分支、push——都要通过已安装的 Git 完成。
如何把仓库从 GitHub 迁移到 GitLab?
添加一个新的 remote,并推送所有分支和标签:git push gitlab --all 和 git push gitlab --tags。由于两个平台都使用 Git,历史会完整迁移。
公开仓库和私有仓库有什么区别?
公开仓库任何人都能在互联网上看到,私有仓库只有你和受邀的成员可以看到。作品集需要使用公开仓库。