Git 与 GitHub
为什么需要 Git?
如果你写过一些需要频繁改动的文档,你一定不会对这样的文件命名感到陌生:
项目_草稿.docx
项目_修改版.docx
项目_最终版.docx
项目_绝对不改最终版.docx
项目_打死不改最终版_v2.docx
当你发现 绝对不改版 里有一段内容写坏了,想要找回第一天写的 草稿 里的某句话时,往往已经找不到了。如果这时候还要和三四个同学一起改同一份文件,大家互相传来传去,最后根本不知道谁改了什么,甚至会把别人的心血不小心覆盖掉。
Git 就是为了终结这种混乱而诞生的。 简单来说,Git 是一个版本控制系统。你只需要把每次更改的内容告诉 Git,它就能帮你自动、高效地管理文件的每一次修改。既方便,又因为 Git 会对历史进行智能压缩存储,不会像"每个版本存一个文件"那样占用大量磁盘空间。
安装 Git
- 进入官网,选择 “Git for Windows/x64 Setup” 下载。下载可能较慢,读者可以参考 爱的魔法 加快下载速度。

- 一路点下一步,到“Choosing the default editor”这一步时,推荐选择“Visual Studio Code”。

- 一路点下一步,直到安装完成。此时,右键文件管理器中任一文件夹的空白部分,应该会出现“Open Git Bash here”选项(Windows 11 用户需要点击“显示更多选项”来发现这个选项)。

- 点击“Open Git Bash here”。如果出现一个如下图所示的黑窗口,证明 Git 安装成功。

使用 Git
创建仓库
仓库(Repository,简称 Repo)就是 Git 用来保存你所有文件历史记录的“小基地”。你可以把任何一个普通文件夹变成 Git 仓库。接下来让我引导你一步步创建第一个 Git 仓库。
- 选择一个合适的地方,新建一个空文件夹,这就是我们的仓库所在的文件夹;
- 在这个空文件夹右键,选择 “Open Git Bash here”,打开 Git Bash。
- 输入以下命令:
git init如果你是第一次使用 Git,那么 Git 大概会输出以下信息:
hint: Using 'master' as the name for the initial branch. This default branch name
hint: will change to "main" in Git 3.0. To configure the initial branch name
hint: to use in all of your new repositories, which will suppress this warning,
hint: call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
hint:
hint: Disable this message with "git config set advice.defaultBranchName false"
Initialized empty Git repository in /home/git-test-user/git/.git/上面的输出告诉我们:
Initialized empty Git repository in /home/git-test-user/git/.git/这说明当前目录已经顺利初始化,成为了一个 Git 仓库!此时文件夹下会生成一个隐藏的 .git 文件夹,这就是 Git 用来记录版本历史的核心数据库,请不要手动修改或删除它。
配置你的身份
在第一次提交之前,Git 需要知道你的名字和邮箱。这些信息会被附加在提交记录里,方便日后查看"这段代码是谁写的"。请依次运行:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"第一次提交变更
在动手敲命令之前,我们需要先搞懂 Git 里的两个核心概念:暂存区(Staging Area) 和 提交(Commit)。
我们可以把 Git 的工作方式类比为“拍照发朋友圈”:
- 工作区(Working Directory):就是你当前的文件夹。你在里面新建、修改或删除文件的过程,就像是在布景和摆姿势。
- 暂存区(Staging Area):就像是打开相机胶卷,选择要上传的照片。你可以选一张,也可以选多张。选中的文件就是被
git add标记的文件。 - 提交(Commit):相当于点击“发送朋友圈”。一旦点击提交,这一刻文件夹的状态就会被永久按下快门,生成一个独一无二的“历史记录版本”。
也就是说:修改文件(准备) → git add(挑选) → git commit(拍照保存)。
了解了这个流程,我们来动手操作一遍:
新建测试文件
最简单的方式是直接在 Git Bash 里输入下面的命令,它会创建 README.md 并写入 Hello World!:
echo "Hello World!" > README.md查看仓库状态
想知道现在文件夹里有什么变化,可以随时运行:
git status输出:
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)你会看到 README.md 显示为红色(Untracked files),表示 Git 注意到了这个新文件,但它目前还是草稿,尚未被放入暂存区。
将文件添加到暂存区
使用以下命令把 README.md 放到暂存区:
git add README.md此时再次运行 git status:
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md你会发现文件名变成了绿色(Changes to be committed),说明它已经准备好提交了。
提交变更到本地仓库 (git commit)
使用 git commit 命令正式把暂存区里的变更永久保存下来。为了以后能看懂这次提交改了什么,我们需要用 -m 参数附上一句简单明确的提交说明:
git commit -m "feat: 新建 README 文件"按下回车,看到:
[master (root-commit) 6b83eb4] feat: 新建 README 文件
1 file changed, 1 insertion(+)
create mode 100644 README.md就代表我们的第一个提交创建成功了!
查看提交历史
运行
git log你会看到一条包含你的名字、邮箱、提交时间和提交说明的清晰记录。
commit 6b83eb430a3d1e3e1dcf02ef7f006b0deedad6d6 (HEAD -> master)
Author: SakiMidare <sakimidare@outlook.com>
Date: Sat Aug 8 13:54:22 2026 +0800
feat: 新建 README 文件第二次提交变更
Git 的工作流是可重复的:修改 → 暂存 → 提交。现在给 README.md 加点内容,完整走一遍第二次提交。在 Git Bash 里运行(>> 表示"追加到文件末尾"):
echo "Hello Git!" >> README.md先看看当前状态:
git statusOn branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")README.md 显示为 "modified"(被修改)。想确认具体改了什么,运行:
git diffdiff --git a/README.md b/README.md
index 557db03..53fa24f 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
Hello World!
+Hello Git!以 + 开头的行表示新增的内容,以 - 开头的行表示被删除的内容。确认改动无误后,和第一次一样提交:
git add README.md
git commit -m "docs: 更新 README"再用 git log 查看历史,现在有两条记录了。加上 --oneline 参数可以让每条记录只占一行,历史一目了然:
git log --oneline7bc301e (HEAD -> master) docs: 更新 README
6b83eb4 feat: 新建 README 文件最上面是最新的提交。HEAD -> master 中的 HEAD 表示"当前所在的位置",也就是你当前提交正停留在这里。
什么是 GitHub?
如果说 Git 是你电脑里的“本地相册”,那么 GitHub 就是“代码界的朋友圈”。
GitHub 是目前全球最大的开源代码托管平台,基于 Git 构筑。通过 GitHub,你可以:
- 云端备份:把本地代码同步到云端,换台电脑也能继续工作,再也不用担心硬盘损坏。
- 开源交流:浏览、学习、使用全球优秀开发者开源的软件和代码。
- 多人协作:和团队成员在同一个项目中并行开发、提交代码、互评审查。
将代码推送到 GitHub
接下来,我们把刚才在本地创建并提交的仓库,同步到 GitHub 云端。
注册与登录 GitHub
- 打开 GitHub。
- 点击右上角 Sign up 注册账号(如果已有账号直接点击 Sign in 登录)。
- 按照提示完成邮箱验证。
将本地 SSH 公钥上传到 GitHub 上
我们可以把 SSH 密钥想象成一对密码锁:
- 私钥(Private Key):保存在你本地电脑上,绝对不能给别人看。
- 公钥(Public Key):上传到你的 GitHub 账号里,可以公开。
只要两边对上了,以后你在这台电脑上推拉代码时,GitHub 就能自动确认你的身份,再也不需要每次都输入密码或进行网页验证。
创建 SSH 密钥对的步骤请参考 SSH 远程登录,如果已创建密钥对,则忽略这一步。
创建完成之后,请查看你的公钥:
cat ~/.ssh/id_ed25519.pub复制完整输出内容(一般是一个字符串和一个邮箱),粘贴到 GitHub 设置 → SSH Key → Add new SSH Key 的 Key 输入框中,标题可以随便取名(见下):

点击 “Add SSH Key” 并验证通过。
如果配置完成后,运行
ssh -T git@github.com输出
Hi <用户名>! You've successfully authenticated, but GitHub does not provide shell access.而不是
git@github.com: Permission denied (publickey).证明我们的 SSH Key 配置成功,可以用这个 Key 来访问 GitHub 上的仓库了!
在 GitHub 上新建远程仓库
- 登录后,点击页面右上角的
+号,选择 New repository。

填写仓库信息:
- Repository name(仓库名称):填入与本地文件夹一致的名称(例如
first-repo)。 - Description(可选描述):简单写一句项目介绍。
- Public / Private(公开/私有):初学者建议选择 Public(所有人可见)。
- 不要 勾选 Add a README file、.gitignore 或 Choose a license(因为我们本地已经创建过文件了,保持远端完全空白)。
- Repository name(仓库名称):填入与本地文件夹一致的名称(例如
点击底部的绿色按钮 Create repository。

连接本地仓库与远程仓库
创建成功后,GitHub 会展示一个页面,其中包含了关键的命令指南:

我们想要把本地的仓库推送到 GitHub 上,请在 Git Bash 中依次进行:
关联远程仓库地址
因为我们刚刚已经配置好了 SSH 密钥,这里直接使用 SSH 协议——Git 会自动用你的密钥完成身份验证,无需输入密码。执行:
git remote add origin git@github.com:你的用户名/你的仓库名.git添加远程仓库地址。
重命名默认分支为 main
git branch -M main推送至远程
git push -u origin main-u(即 --set-upstream)表示"建立关联":它让本地的 main 分支记住对应的远程分支。这样以后修改完代码,直接运行 git push 即可,不需要再写 origin main。如果输出:
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 248 bytes | 248.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To github.com:用户名/仓库.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.说明你的第一个仓库已经推送到了 GitHub 上了!

GitHub 常用操作
克隆与拉取
看教程、复制别人的开源项目时,git clone 可以把远程仓库完整下载到本地:
git clone git@github.com:用户名/仓库名.gitgit pull 则会把远程仓库的最新改动同步到本地(多人协作时,动手前先 pull 一下是好习惯):
git pullStar 与 Explore
打开任意项目主页,右上角的 Star 按钮相当于"收藏 + 点赞"。给喜欢的项目点亮星标后,它们会出现在你的个人主页,方便日后回看。
想发现优质项目,可以逛逛 GitHub 顶部的 Explore 页面和 Trending,看看最近大家都在研究什么,是新生学习代码的好入口。
Fork 与 Pull Request
Fork 会把别人的仓库完整复制到你的 GitHub 账号下,之后你可以像操作自己的仓库一样修改它。通常的流程是:先 Fork,再 git clone 到本地修改,最后 git push 推回你自己账号下的副本。
如果想让原作者采纳你的改动,就点击仓库页面的 New Pull Request 发起一个 Pull Request,请求对方把你的改动合并进原项目。这也是"参与开源"的完整链路:
Fork → Clone → 修改 → Push → Pull RequestIssue
Issue 是项目的“意见箱”:报告 bug、提问、提需求都可以在 Issues 页面发起。对新手来说,从给开源项目提 Issue 开始交流,比直接上手改代码更友好。
Release
很多项目会在 Release 页面提供正式的发布包(比如某个软件的安装程序)。比起克隆源码自己构建,直接从这里下载通常更方便。
GitHub Pages
GitHub 可以为仓库生成一个免费的静态网站。把 HTML 页面推送到仓库的指定分支后,在仓库的 Settings → Pages 里开启即可。很多人的个人主页、项目介绍页就是这么做的。
撤销与回滚
写代码哪有不犯错的。Git 最大的好处之一就是:改坏了,总有办法回得去。下面按"错误的严重程度"从轻到重,介绍三种最常用的撤销方法。
场景一:文件改坏了,但还没 git add
此时文件只在工作区里,改动还没被"拍照"。用 git restore 把文件恢复到上一次提交时的样子,丢弃全部未暂存的修改:
git restore README.md运行后再 git status,你会发现改动消失了,一切就像什么都没发生一样。
场景二:git add 加错文件了,但还没 git commit
文件已经进了暂存区,但还没有提交。用 git restore --staged 把它从暂存区移出去,文件内容不会被改动:
git restore --staged README.md场景三:已经 git commit 了,想回到某个旧版本
这要分两种情况处理,区别在于提交有没有推送(push)到 GitHub。
情况 A:还没推送到远程仓库,可以用 git reset 把提交历史"倒回去"。HEAD~1 表示"当前提交的前一个提交":
git reset --hard HEAD~1运行后,最新这条提交会被删除,文件也恢复到它之前的内容。
情况 B:已经推送到 GitHub,请改用 git revert。它不会删除历史,而是新增一条"反向"的提交来抵消之前的改动。这样改动是向前叠加的,对参与协作的每个人都是安全的:
git revert HEAD命令执行后会打开编辑器让你确认提交说明,保存关闭后撤销即完成,最后 git push 推上去即可。
注意事项
.gitignore 与安全提醒
有些文件不应该被提交到仓库,比如密码、密钥、包含私人信息的配置文件(如 token.txt、.env)。你可以创建一个名为 .gitignore 的文本文件,把不想跟踪的文件或文件夹写进去(每行一个规则):
token.txt
.env之后运行 git add . 时会自动跳过它们。除了直接写文件名,.gitignore 还支持通配符、目录和取反规则:
# 忽略所有以 .log 结尾的文件
*.log
# 忽略整个文件夹
node_modules/
# 只忽略项目根目录下的 secret.txt(子目录里的同名文件不受影响)
/secret.txt
# 用 ! 取反,重新允许某个文件(需要先有匹配它的忽略规则)
!keep.log不要提交大文件
Git 擅长管理文本文件,但不适合存放大型二进制文件(视频、安装包、数据集、模型权重等)。这类文件一旦提交进历史,仓库体积会迅速膨胀,导致 clone、pull、push 都变得很慢,而且删除后依然会残留在历史记录里。
如果确实需要分享大文件,可以:
- 用云盘、网盘分享,或使用 Git 的 LFS(Large File Storage) 扩展;
- 或者干脆把大文件放在仓库外的路径,用
.gitignore忽略掉。
提交前检查改动
提交前养成先看一眼"我到底改了什么"的习惯,可以避免把不该提交的文件一起提交进去。运行:
git status查看有哪些文件被改动,再用 git diff 查看文件的具体改动内容:
git diff确认无误后再 git add、git commit。这样提交历史才会干净、可读,日后回看时也能快速定位。
下一步
到这里你已经能独立完成"本地提交 → 云端备份"的完整流程。
本文所介绍的 Git 功能只是冰山一角。多人协作常用的分支功能和处理冲突等知识并未提及。需要更深入的学习时,可以参考以下资料:
- Pro Git 中文版:Git 官方同源书籍,免费在线阅读,最权威也最系统。
- 廖雪峰 Git 教程:中文经典入门教程,通俗易懂。
- GitHub 官方 Git 手册:配合 GitHub 使用的官方指南。
- Git 官方文档:命令与选项的完整参考。
附录:常用命令速查表
| 命令 | 作用 |
|---|---|
git init | 在当前文件夹初始化一个仓库 |
git status | 查看当前仓库状态(哪些文件被改动) |
git add <文件> | 把文件放入暂存区 |
git add . | 把所有改动放入暂存区 |
git commit -m "说明" | 提交暂存区内容并附上说明 |
git log | 查看提交历史 |
git log --oneline | 查看提交历史(每条只占一行) |
git diff | 查看工作区里未暂存的具体改动 |
git restore <文件> | 丢弃工作区的改动,恢复该文件 |
git restore --staged <文件> | 把文件从暂存区移出(不改动内容) |
git reset --hard <版本> | 回退到指定版本,丢弃之后的提交与改动(仅限未推送的本地提交) |
git revert <版本> | 新增一条反向提交来撤销改动(适合已推送的提交) |
git push | 推送本地提交到远程仓库 |
git push --force | 强制推送,用本地历史覆盖远端(慎用) |
git pull | 拉取远程仓库的最新改动 |
git clone <地址> | 把远程仓库克隆到本地 |
正在加载评论...