张宁的个人博客
莫道君行早,更有早行人。
好好上网
业余无线电
效率提升
软硬件知识
新能源汽车
S1:短波频率
关于
张宁的个人博客
上一篇
下一篇
Git 与 GitHub 入门教程:从零理解版本管理、主线与分支(1/2)
张宁的个人博客
2026-01-12
阅读 4
软件&硬件
> 本文面向 Git 初学者,介绍 Git 与 GitHub 的基本概念、Windows 下的常见操作、主线与分支的工作原理,以及版本发布和恢复方法。示例使用 **NuliBlog** 作为项目名称,其他项目也可以采用相同方法。 ## 目录 1. Git 与 GitHub 是什么 2. 版本管理的核心概念 3. 主线与分支如何工作 4. Windows 下使用 Git 5. 第一次使用:配置 Git 6. 创建本地仓库并完成首次提交 7. 创建 GitHub 远程仓库并关联 8. 日常开发:检查、暂存、提交和同步 9. 使用分支开发并合并到主线 10. Tag 与 Release:管理正式版本 11. 查看差异、撤销修改和恢复版本 12. GitHub Desktop 图形界面 13. .gitignore 与项目安全 14. Git 常用命令速查 15. Git 命令中的英文单词与参数说明 16. NuliBlog 推荐工作流程 ------------------------------------------------------------------------ ## 1. Git 与 GitHub 是什么 Git 和 GitHub 经常一起使用,但它们不是同一个东西。 | 名称 | 是什么 | 主要作用 | | --- | --- | --- | | **Git** | 分布式版本控制工具 | 在本地记录代码修改、提交版本、创建分支、合并和恢复历史版本 | | **GitHub** | 在线 Git 仓库托管与协作平台 | 在云端保存仓库,管理分支、Pull Request、Issue 和 Release | | **Git Bash** | Git for Windows 提供的命令行环境 | 在 Windows 中输入 Git 命令 | | **GitHub Desktop** | Git 的图形化客户端 | 通过界面查看修改、提交版本、切换分支和同步远程仓库 | 可以简单理解为: - Git 负责版本管理。 - GitHub 负责云端托管和协作。 - Git Bash 和 GitHub Desktop 是操作 Git 的两种界面。 **Commit 和 Push 不一样:** - `git commit`:把改动保存为本地版本记录。 - `git push`:把本地提交上传到 GitHub。 只执行 Commit,不执行 Push,GitHub 网站上不会出现这次新提交。 ## 2. 版本管理的核心概念 | 概念 | 英文 | 含义 | | --- | --- | --- | | 仓库 | Repository / Repo | 项目文件及其版本历史所在的位置 | | 主线 | Main | 通常作为项目主要基准的分支;团队可约定它代表稳定版本 | | 分支 | Branch | 从某个提交分出的一条独立开发路线 | | 提交 | Commit | 一次正式的版本记录,包含代码变化和提交说明 | | 工作区 | Working Tree | 本地电脑上当前实际编辑的项目文件 | | 暂存区 | Staging Area / Index | 提交前的准备区,决定下一次 Commit 包含哪些改动 | | 合并 | Merge | 将一个分支的提交整合到当前分支 | | 拉取请求 | Pull Request / PR | 在 GitHub 上申请把一个分支合并到另一个分支的协作流程 | | 远程仓库 | Remote | 托管在 GitHub 等平台上的仓库地址 | | 标签 | Tag | 指向某个特定提交的版本标记,例如 `v1.0.0` | | 发布 | Release | GitHub 基于 Tag 创建的版本发布页面,可附带说明和下载文件 | | HEAD | HEAD | 指示当前检出位置的引用,通常指向当前分支 | ### 2.1 一次修改如何成为一个版本 ``` text 工作区(编辑文件) | | git add v 暂存区(选择本次要提交的改动) | | git commit v 本地仓库(形成一个 Commit) | | git push v GitHub 远程仓库(云端同步) ``` Git 通过提交对象和提交之间的关系保存项目历史。它不是每次都简单复制一整个项目文件夹。 ### 2.2 Git 中的三个区域 1. **工作区**:正在编辑的文件。 2. **暂存区**:已经选择、准备提交的改动。 3. **本地仓库**:已经通过 Commit 保存的历史版本。 例如,修改了 `style.css`,但还没有执行 `git add`,这个改动只在工作区;执行 `git add style.css` 后,改动进入暂存区;执行 `git commit` 后,改动成为一个正式提交。 ## 3. 主线与分支如何工作 ### 3.1 主线 main `main` 通常作为项目的主要开发基准。很多项目会约定 main 中的代码始终可以正常运行,经过测试的功能才合并到 main。 注意:**main 只是一个分支名称,不是 Git 强制规定的生产环境或正式版本。** 项目可以自行约定 main 的用途。 ### 3.2 分支 Branch 分支是从某个提交分出的一条独立开发路线。可以为不同功能建立不同分支: | 分支名称 | 用途 | | --- | --- | | `main` | 稳定主线 | | `feature/article-toc` | 开发文章目录功能 | | `feature/mobile-layout` | 优化移动端布局 | | `feature/markdown-editor` | 开发 Markdown 编辑功能 | | `bugfix/fontawesome-render` | 修复图标显示问题 | | `docs/deployment-guide` | 更新部署文档 | ### 3.3 分支不是复制出来的多个项目文件夹 假设本地项目目录是: ``` text D:\Projects\NuliBlog\ index.php style.css post.php header.php .git\ ``` 其中: - `NuliBlog` 是实际存放项目源文件的文件夹。 - `.git` 是 Git 的版本管理数据库,保存提交历史、分支引用等信息。 在 main 上创建功能分支: ``` bash git switch -c feature/article-toc ``` Git 不会再复制一个 `NuliBlog` 文件夹。两个分支最初都指向同一个提交,本地仍然只有一套工作区文件。 当你在 `feature/article-toc` 分支中修改 `style.css` 和 `post.php` 时,修改的仍然是当前这套 `NuliBlog` 文件。 ### 3.4 切换分支时,Git 如何改变本地文件? 假设: ``` text main -> Commit A feature/article-toc -> Commit A ``` 两个分支都从 Commit A 开始。 在功能分支修改并提交后: ``` text main -> Commit A feature/article-toc -> Commit B ``` Commit A 和 Commit B 都保存在 Git 历史中。此时执行: ``` bash git switch main ``` Git 会根据 main 指向的 Commit A 更新工作区文件,因此本地文件显示为 A 版本。 再执行: ``` bash git switch feature/article-toc ``` Git 会根据功能分支指向的 Commit B 更新同一个工作区,因此本地文件显示为 B 版本。 **Git 不需要在切换分支时临时备份 main。** 已经 Commit 的历史版本保存在 `.git` 数据库中;分支只是指向不同提交的引用。 ### 3.5 修改后还没有 Commit,能不能直接切换分支? 不一定。 如果修改与目标分支没有冲突,Git 有时允许切换,并保留未提交修改;如果切换可能覆盖本地修改,Git 通常会拒绝切换。 因此,不要把 `git switch main` 当成撤销修改的命令。 如果确定要放弃当前未提交修改,可以在确认后使用: ``` bash git restore . ``` 这条命令将当前目录下已跟踪文件的工作区内容恢复为暂存区版本。若之前没有暂存改动,暂存区通常与当前 HEAD 一致。 如果已经执行过 `git add`,先撤销暂存,再恢复工作区: ``` bash git restore --staged . git restore . ``` 也可以将已跟踪文件的暂存区和工作区都恢复到当前提交: ``` bash git restore --source=HEAD --staged --worktree . ``` > **警告:** 上述恢复操作会丢弃相应的未提交修改。执行前先运行 `git status`,必要时备份。它们不会自动删除未跟踪文件。 如果暂时不确定是否要放弃修改,可以先使用 Stash 暂存起来: ``` bash git stash push -u -m "暂存文章目录修改" ``` 以后需要继续时: ``` bash git switch feature/article-toc git stash pop ``` `stash` 会临时保存工作区改动;`-u` 表示同时包含未跟踪文件。`stash pop` 会尝试恢复并移除对应的暂存记录,若发生冲突,需要人工处理。 ## 4. Windows 下使用 Git ### 4.1 Git Bash Git Bash 是 Git for Windows 安装时提供的命令行环境。 ``` bash git --version ``` 如果显示类似 `git version 2.x.x.windows.1`,说明 Git 已安装并可以从当前终端调用。 Git Bash 中 D 盘路径通常写成: ``` bash cd /d/Projects/NuliBlog ``` 这里的 `cd` 是 Shell 命令,不是 Git 子命令,意思是切换当前目录。 ### 4.2 Windows PowerShell 如果 Git 安装时正确配置了 PATH,也可以直接在 PowerShell 中运行 Git 命令: ``` powershell Set-Location "D:\Projects\NuliBlog" git --version ``` `Set-Location` 是 PowerShell 命令,用于切换目录,不属于 Git。 本指南中的 Git 命令一般可以在 Git Bash 和 PowerShell 中使用。路径切换命令则根据终端类型选择。 ## 5. 第一次使用:配置 Git Git 需要知道提交者的名称和邮箱。这些信息会写入 Commit 历史。 ### 5.1 设置提交者名称 ``` bash git config --global user.name "Developer" ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `config` | 子命令 | 读取或修改 Git 配置 | | `--global` | 选项 | 将配置写入当前系统用户级配置,对该用户的多个仓库生效 | | `user.name` | 配置键 | 提交记录中的作者名称 | | `"Developer"` | 参数值 | 示例名称,可替换为希望显示的名称 | ### 5.2 设置提交者邮箱 ``` bash git config --global user.email "developer@example.com" ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `config` | 子命令 | 管理 Git 配置 | | `--global` | 选项 | 设置当前系统用户级配置 | | `user.email` | 配置键 | 提交记录中的作者邮箱 | | `"developer@example.com"` | 参数值 | 示例邮箱;可使用 GitHub 账号已验证的邮箱或 GitHub 提供的 noreply 邮箱 | ### 5.3 设置新仓库的默认主分支名称 ``` bash git config --global init.defaultBranch main ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `config` | 子命令 | 管理配置 | | `--global` | 选项 | 写入用户级配置 | | `init.defaultBranch` | 配置键 | 指定新初始化仓库的默认分支名 | | `main` | 参数值 | 默认分支名称,不是 Git 子命令 | 这项设置只影响之后新建的仓库,不会自动重命名已经存在的分支。 ### 5.4 检查配置 ``` bash git config --global --list ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `config` | 子命令 | 管理配置 | | `--global` | 选项 | 查看用户级配置 | | `--list` | 选项 | 列出配置项 | 输出中应能看到 `user.name`、`user.email` 和 `init.defaultBranch` 等配置。 ## 6. 创建本地仓库并完成首次提交 以下以 `D:\Projects\NuliBlog` 为示例路径。请根据实际项目位置替换路径。 ### 6.1 进入项目目录 Git Bash: ``` bash cd /d/Projects/NuliBlog ``` PowerShell: ``` powershell Set-Location "D:\Projects\NuliBlog" ``` `cd` 是 Shell 命令,表示 change directory(切换目录);`Set-Location` 是 PowerShell 的目录切换命令。它们都不是 Git 子命令。 ### 6.2 初始化仓库 ``` bash git init ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `init` | 子命令 | initialize 的缩写,初始化一个新的 Git 仓库 | 成功后通常会提示已在当前目录初始化空仓库,并创建隐藏的 `.git` 目录。 > 执行前先确认当前目录。不要在错误的上级目录运行 `git init`,否则可能把不相关的大量文件纳入同一个仓库。 ### 6.3 查看仓库状态 ``` bash git status ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `status` | 子命令 | 显示当前分支、工作区修改、暂存区内容和未跟踪文件 | ### 6.4 把文件加入暂存区 ``` bash git add . ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `add` | 子命令 | 将文件改动加入暂存区 | | `.` | 路径参数 | 当前目录;通常递归包含当前目录下的文件和子目录 | `git add .` 不会立即生成版本记录。再次运行 `git status`,相关文件会显示为待提交状态。 建议先建立 `.gitignore`,并检查状态,避免把密码、密钥、数据库备份、缓存或其他不应提交的文件加入暂存区。 ### 6.5 创建第一次提交 ``` bash git commit -m "Initial commit: NuliBlog" ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `commit` | 子命令 | 创建一次正式版本记录 | | `-m` | 选项 | message 的缩写,指定提交说明 | | `"Initial commit: NuliBlog"` | 参数值 | 本次提交说明;引号用于把含空格的文字作为一个整体传入 | 成功后会显示提交编号、修改文件数量等信息。 ## 7. 创建 GitHub 远程仓库并关联 本地仓库建立后,可以在 [GitHub](https://github.com/) 网站创建远程仓库。 1. 点击右上角 `+`,选择 **New repository**。 2. 仓库名称可以填写 `NuliBlog` 或其他合适名称。 3. 初期可以选择 **Private**,确认内容适合公开后再考虑改为 Public。 4. 如果本地已经有首次提交,创建远程仓库时建议不要自动添加 README、.gitignore 或 License,以免两边产生不同的初始提交。 5. 点击 Create repository,复制仓库 HTTPS 地址。 ### 7.1 添加远程仓库地址 ``` bash git remote add origin https://github.com/用户名/NuliBlog.git ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `remote` | 子命令 | 管理远程仓库地址 | | `add` | 操作参数 | 添加一个新的远程仓库配置 | | `origin` | 远程别名 | 本地给远程仓库起的名字;通常把默认 GitHub 仓库命名为 origin | | `https://github.com/...` | URL 参数 | 远程仓库 HTTPS 地址,必须替换成真实地址 | `origin` 是惯用别名,不是 GitHub 用户名,也不是 Git 子命令。 ### 7.2 检查远程地址 ``` bash git remote -v ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `remote` | 子命令 | 查看或管理远程仓库 | | `-v` | 选项 | verbose 的缩写,显示详细地址信息 | 通常会看到 `origin` 对应的 fetch 和 push 地址。 ### 7.3 确保主分支名为 main ``` bash git branch -M main ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `branch` | 子命令 | 列出、创建、重命名或删除分支 | | `-M` | 选项 | 强制重命名当前分支;如果目标名称已存在,可能覆盖同名目标引用 | | `main` | 参数 | 目标分支名称,不是 Git 子命令 | ### 7.4 首次推送到 GitHub ``` bash git push -u origin main ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `push` | 子命令 | 将本地提交推送到远程仓库 | | `-u` | 选项 | `--set-upstream` 的简写,设置上游跟踪关系 | | `origin` | 远程别名 | 指定目标远程仓库 | | `main` | 分支参数 | 指定要推送的本地分支 | 成功后刷新 GitHub 仓库网页,应能看到项目文件和提交历史。 首次通过 HTTPS 推送时,Git Credential Manager 可能引导浏览器登录和授权。不要把访问令牌写进命令、文档或代码文件。 ## 8. 日常开发:检查、暂存、提交和同步 建议每次修改项目后,按”先检查,再暂存,再提交,最后推送”的顺序操作。 ### 8.1 查看修改状态 ``` bash git status ``` 显示当前分支、修改文件、未跟踪文件和暂存状态。 ### 8.2 查看尚未暂存的具体差异 ``` bash git diff ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `diff` | 子命令 | difference 的缩写,比较差异;默认比较工作区与暂存区 | 输出中通常以 `+` 表示新增行,以 `-` 表示删除行。 ### 8.3 暂存全部当前目录改动 ``` bash git add . ``` 将当前目录下的新增和修改加入暂存区。建议先检查 `git status` 和 `git diff`。 ### 8.4 只暂存指定文件 ``` bash git add style.css ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `add` | 子命令 | 添加改动到暂存区 | | `style.css` | 路径参数 | 要暂存的文件;替换成实际文件路径 | ### 8.5 创建提交 ``` bash git commit -m "ui: refine article table style" ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `commit` | 子命令 | 创建版本提交 | | `-m` | 选项 | 指定提交说明 | | `"ui: refine article table style"` | 参数值 | 本次提交说明 | 常见提交说明前缀: - `feat:` 新增功能 - `fix:` 修复问题 - `ui:` 界面样式调整 - `docs:` 文档修改 - `refactor:` 代码重构 - `test:` 测试相关修改 ### 8.6 推送到 GitHub ``` bash git push ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `push` | 子命令 | 将当前分支尚未推送的本地提交上传到远程跟踪分支 | 当前分支通常需要已经配置上游分支。首次推送新分支时一般使用 `git push -u origin 分支名`。 ### 8.7 拉取 GitHub 最新版本 ``` bash git pull ``` | 命令片段 | 类型 | 含义 | | --- | --- | --- | | `git` | 程序命令 | 启动 Git | | `pull` | 子命令 | 获取远程更新并整合到当前分支 | `git pull` 通常可理解为先 Fetch,再通过 Merge 或 Rebase 整合更新,具体方式可能受 Git 配置影响。它不是单纯下载文件。
文章关键词
git
github
入门
版本管理
主线管理
分支管理
发表评论
让交流带来新的灵感
取消回复
友善表达,认真交流