Skip to content

Git 与 GitHub

为什么需要 Git?

如果你写过一些需要频繁改动的文档,你一定不会对这样的文件命名感到陌生:

项目_草稿.docx

项目_修改版.docx

项目_最终版.docx

项目_绝对不改最终版.docx

项目_打死不改最终版_v2.docx

当你发现 绝对不改版 里有一段内容写坏了,想要找回第一天写的 草稿 里的某句话时,往往已经找不到了。如果这时候还要和三四个同学一起改同一份文件,大家互相传来传去,最后根本不知道谁改了什么,甚至会把别人的心血不小心覆盖掉。

Git 就是为了终结这种混乱而诞生的。 简单来说,Git 是一个版本控制系统。你只需要把每次更改的内容告诉 Git,它就能帮你自动、高效地管理文件的每一次修改。既方便,又因为 Git 会对历史进行智能压缩存储,不会像"每个版本存一个文件"那样占用大量磁盘空间。

安装 Git

  1. 进入官网,选择 “Git for Windows/x64 Setup” 下载。下载可能较慢,读者可以参考 爱的魔法 加快下载速度。
  2. 一路点下一步,到“Choosing the default editor”这一步时,推荐选择“Visual Studio Code”。
  1. 一路点下一步,直到安装完成。此时,右键文件管理器中任一文件夹的空白部分,应该会出现“Open Git Bash here”选项(Windows 11 用户需要点击“显示更多选项”来发现这个选项)。
  2. 点击“Open Git Bash here”。如果出现一个如下图所示的黑窗口,证明 Git 安装成功。

使用 Git

创建仓库

仓库(Repository,简称 Repo)就是 Git 用来保存你所有文件历史记录的“小基地”。你可以把任何一个普通文件夹变成 Git 仓库。接下来让我引导你一步步创建第一个 Git 仓库。

  1. 选择一个合适的地方,新建一个空文件夹,这就是我们的仓库所在的文件夹;
  2. 在这个空文件夹右键,选择 “Open Git Bash here”,打开 Git Bash。
  3. 输入以下命令:
sh
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 需要知道你的名字和邮箱。这些信息会被附加在提交记录里,方便日后查看"这段代码是谁写的"。请依次运行:

sh
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!

sh
echo "Hello World!" > README.md

查看仓库状态

想知道现在文件夹里有什么变化,可以随时运行:

sh
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 放到暂存区:

sh
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 参数附上一句简单明确的提交说明:

sh
git commit -m "feat: 新建 README 文件"

按下回车,看到:

[master (root-commit) 6b83eb4] feat: 新建 README 文件
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

就代表我们的第一个提交创建成功了!

查看提交历史

运行

sh
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 里运行(>> 表示"追加到文件末尾"):

sh
echo "Hello Git!" >> README.md

先看看当前状态:

sh
git status
On 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"(被修改)。想确认具体改了什么,运行:

sh
git diff
diff --git a/README.md b/README.md
index 557db03..53fa24f 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 Hello World!
+Hello Git!

+ 开头的行表示新增的内容,以 - 开头的行表示被删除的内容。确认改动无误后,和第一次一样提交:

sh
git add README.md
git commit -m "docs: 更新 README"

再用 git log 查看历史,现在有两条记录了。加上 --oneline 参数可以让每条记录只占一行,历史一目了然:

sh
git log --oneline
7bc301e (HEAD -> master) docs: 更新 README
6b83eb4 feat: 新建 README 文件

最上面是最新的提交。HEAD -> master 中的 HEAD 表示"当前所在的位置",也就是你当前提交正停留在这里。

什么是 GitHub?

如果说 Git 是你电脑里的“本地相册”,那么 GitHub 就是“代码界的朋友圈”。

GitHub 是目前全球最大的开源代码托管平台,基于 Git 构筑。通过 GitHub,你可以:

  1. 云端备份:把本地代码同步到云端,换台电脑也能继续工作,再也不用担心硬盘损坏。
  2. 开源交流:浏览、学习、使用全球优秀开发者开源的软件和代码。
  3. 多人协作:和团队成员在同一个项目中并行开发、提交代码、互评审查。

将代码推送到 GitHub

接下来,我们把刚才在本地创建并提交的仓库,同步到 GitHub 云端。

注册与登录 GitHub

  1. 打开 GitHub
  2. 点击右上角 Sign up 注册账号(如果已有账号直接点击 Sign in 登录)。
  3. 按照提示完成邮箱验证。

将本地 SSH 公钥上传到 GitHub 上

我们可以把 SSH 密钥想象成一对密码锁:

  • 私钥(Private Key):保存在你本地电脑上,绝对不能给别人看。
  • 公钥(Public Key):上传到你的 GitHub 账号里,可以公开。

只要两边对上了,以后你在这台电脑上推拉代码时,GitHub 就能自动确认你的身份,再也不需要每次都输入密码或进行网页验证

创建 SSH 密钥对的步骤请参考 SSH 远程登录,如果已创建密钥对,则忽略这一步。

创建完成之后,请查看你的公钥:

sh
cat ~/.ssh/id_ed25519.pub

复制完整输出内容(一般是一个字符串和一个邮箱),粘贴到 GitHub 设置 → SSH Key → Add new SSH Key 的 Key 输入框中,标题可以随便取名(见下):

点击 “Add SSH Key” 并验证通过。

如果配置完成后,运行

sh
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 上新建远程仓库

  1. 登录后,点击页面右上角的 + 号,选择 New repository

  1. 填写仓库信息:

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

连接本地仓库与远程仓库

创建成功后,GitHub 会展示一个页面,其中包含了关键的命令指南:

我们想要把本地的仓库推送到 GitHub 上,请在 Git Bash 中依次进行:

关联远程仓库地址

因为我们刚刚已经配置好了 SSH 密钥,这里直接使用 SSH 协议——Git 会自动用你的密钥完成身份验证,无需输入密码。执行:

sh
git remote add origin git@github.com:你的用户名/你的仓库名.git

添加远程仓库地址。

重命名默认分支为 main

sh
git branch -M main

推送至远程

sh
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 可以把远程仓库完整下载到本地:

sh
git clone git@github.com:用户名/仓库名.git

git pull 则会把远程仓库的最新改动同步到本地(多人协作时,动手前先 pull 一下是好习惯):

sh
git pull

Star 与 Explore

打开任意项目主页,右上角的 Star 按钮相当于"收藏 + 点赞"。给喜欢的项目点亮星标后,它们会出现在你的个人主页,方便日后回看。

想发现优质项目,可以逛逛 GitHub 顶部的 Explore 页面和 Trending,看看最近大家都在研究什么,是新生学习代码的好入口。

Fork 与 Pull Request

Fork 会把别人的仓库完整复制到你的 GitHub 账号下,之后你可以像操作自己的仓库一样修改它。通常的流程是:先 Fork,再 git clone 到本地修改,最后 git push 推回你自己账号下的副本。

如果想让原作者采纳你的改动,就点击仓库页面的 New Pull Request 发起一个 Pull Request,请求对方把你的改动合并进原项目。这也是"参与开源"的完整链路:

Fork → Clone → 修改 → Push → Pull Request

Issue

Issue 是项目的“意见箱”:报告 bug、提问、提需求都可以在 Issues 页面发起。对新手来说,从给开源项目提 Issue 开始交流,比直接上手改代码更友好。

Release

很多项目会在 Release 页面提供正式的发布包(比如某个软件的安装程序)。比起克隆源码自己构建,直接从这里下载通常更方便。

GitHub Pages

GitHub 可以为仓库生成一个免费的静态网站。把 HTML 页面推送到仓库的指定分支后,在仓库的 Settings → Pages 里开启即可。很多人的个人主页、项目介绍页就是这么做的。

撤销与回滚

写代码哪有不犯错的。Git 最大的好处之一就是:改坏了,总有办法回得去。下面按"错误的严重程度"从轻到重,介绍三种最常用的撤销方法。

场景一:文件改坏了,但还没 git add

此时文件只在工作区里,改动还没被"拍照"。用 git restore 把文件恢复到上一次提交时的样子,丢弃全部未暂存的修改:

sh
git restore README.md

运行后再 git status,你会发现改动消失了,一切就像什么都没发生一样。

场景二:git add 加错文件了,但还没 git commit

文件已经进了暂存区,但还没有提交。用 git restore --staged 把它从暂存区移出去,文件内容不会被改动:

sh
git restore --staged README.md

场景三:已经 git commit 了,想回到某个旧版本

这要分两种情况处理,区别在于提交有没有推送(push)到 GitHub

情况 A:还没推送到远程仓库,可以用 git reset 把提交历史"倒回去"。HEAD~1 表示"当前提交的前一个提交":

sh
git reset --hard HEAD~1

运行后,最新这条提交会被删除,文件也恢复到它之前的内容。

情况 B:已经推送到 GitHub,请改用 git revert。它不会删除历史,而是新增一条"反向"的提交来抵消之前的改动。这样改动是向前叠加的,对参与协作的每个人都是安全的:

sh
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 忽略掉。

提交前检查改动

提交前养成先看一眼"我到底改了什么"的习惯,可以避免把不该提交的文件一起提交进去。运行:

sh
git status

查看有哪些文件被改动,再用 git diff 查看文件的具体改动内容:

sh
git diff

确认无误后再 git addgit commit。这样提交历史才会干净、可读,日后回看时也能快速定位。

下一步

到这里你已经能独立完成"本地提交 → 云端备份"的完整流程。

本文所介绍的 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 <地址>把远程仓库克隆到本地
本页贡献者
在 GitHub 上编辑此页
1 位 提交历史

正在加载评论...

Missing Semester for Artificial Intelligence