[{"title":"Python 变量和数据类型","permalink":"/zh/tutorials/python/variables-data-types/","summary":"介绍 Python 变量的基本概念与常见数据类型，包括整数、浮点数、字符串、布尔值以及类型转换方法。","content":" 什么是变量 # 在 Python 中，变量的本质是：用来存储数据的名字（标签）\n例如：\nx = 10 name = \u0026#34;Evan Wu\u0026#34; 把整数 10 赋值给变量 x，把字符串 \u0026ldquo;Evan Wu\u0026rdquo; 赋值给变量 name。\n= 表示“把右边的值绑定/赋给左边的变量”\nPython 常见数据类型 # 整数（int） # a = 10 # 用于表示整数 浮点数（float） # b = 3.14 # 用于表示小数 字符串（str） # c = \u0026#34;hello\u0026#34; # 用于表示文字 布尔值（bool） # d = True e = False # 用于表示“对（True） / 错（False）” 查看变量类型 # 使用 type()：\nx = 10 print(type(x)) 输出：\n\u0026lt;class \u0026#39;int\u0026#39;\u0026gt; 变量类型转换 # 字符串 → 数字 int()\nx = \u0026#34;10\u0026#34; y = int(x) 数字 → 字符串str()\nx = 10 y = str(x) ","section":"tutorials","type":"tutorials","date":"2026-06-22","externalUrl":null},{"title":"Python 输入输出和运算符","permalink":"/zh/tutorials/python/input-output-operators/","summary":"Python 输入输出和运算符，介绍 print、input、input 默认字符串、类型转换，以及常见算术、比较、赋值和逻辑运算符的用法。","content":"这一节学习 Python 基础语法中的两个重要内容：\n输入输出 运算符 输入输出用于让程序和用户交互，运算符用于计算、比较和逻辑判断。后面学习条件语句、循环和项目实战时都会反复用到它们。\n输入和输出 # 程序最基础的交互方式是：\n用户输入数据，程序输出结果。\n在 Python 中，常用的是：\nprint()：输出内容 input()：接收用户输入 输出：print() # print() 用来把内容输出到屏幕上。\n最常见的例子是：\nprint(\u0026#34;Hello Python\u0026#34;) 也可以输出变量：\nname = \u0026#34;Evan\u0026#34; print(name) 输出：\nEvan 输入：input() # input() 用来接收用户输入。\nname = input(\u0026#34;请输入你的名字：\u0026#34;) # 接收用户输入并存入变量name print(name) 运行时，程序会等待用户输入内容。\ninput() 获取的是字符串 # 这是新手很容易踩坑的地方：\n笔记 input() 得到的内容默认都是字符串 str。\n例如：\nage = input(\u0026#34;请输入你的年龄：\u0026#34;) print(type(age)) 即使你输入的是：\n18\n输出仍然是：\n\u0026lt;class 'str'\u0026gt;\n所以，如果要进行数字计算，需要先 转换类型。\nage = int(input(\u0026#34;请输入你的年龄：\u0026#34;)) print(age + 1) 如果输入 18，输出就是：\n19\n运算符 # 运算符不仅可以用来进行算数计算，还可以进行比较或逻辑判断。\nPython 中常见运算符包括：\n算术运算符 比较运算符 赋值运算符 逻辑运算符 算术运算符 # 常见算术运算符：\n运算符 含义 示例 + 加法 10 + 3 - 减法 10 - 3 * 乘法 10 * 3 / 除法 10 / 3 // 整除 10 // 3 % 取余 10 % 3 ** 次方 2 ** 3 算术运算符用于数学计算。\na = 10 b = 3 print(a + b) # 13 print(a - b) # 7 print(a * b) # 30 print(a / b) # 3.3333333333333335 比较运算符 # 比较运算符用于比较两个值，结果通常是布尔值 True 或 False。\n常见比较运算符：\n运算符 含义 \u0026gt; 大于 \u0026lt; 小于 \u0026gt;= 大于等于 \u0026lt;= 小于等于 == 等于 != 不等于 a = 10 b = 5 print(a \u0026gt; b) # True print(a \u0026lt; b) # False print(a == b) # False print(a != b) # True 赋值运算符 # 赋值运算符用于给变量赋值。\n常见赋值运算符：\n运算符 含义 = 赋值 += 加后赋值 -= 减后赋值 *= 乘后赋值 /= 除后赋值 //= 整除后赋值 %= 取余后赋值 x += 5 等价于：x = x + 5\n逻辑运算符 # 逻辑运算符用于组合多个条件。\nPython 常见逻辑运算符：\n运算符 含义 and 并且 or 或者 not 取反 and 两个条件都为 True，结果才是 True。\nor 只要有一个条件为 True，结果就是 True。\nnot not 会把结果反过来。\nis_finished = False print(not is_finished) 输出： True\n示例 # 下面这个例子结合了输入、输出、类型转换和运算符，可以尝试在 VS Code 中运行。\nname = input(\u0026#34;请输入你的名字：\u0026#34;) age = int(input(\u0026#34;请输入你的年龄：\u0026#34;)) next_year_age = age + 1 is_adult = age \u0026gt;= 18 print(f\u0026#34;你好，{name}\u0026#34;) print(f\u0026#34;你今年 {age} 岁，明年 {next_year_age} 岁\u0026#34;) print(f\u0026#34;你是否成年：{is_adult}\u0026#34;) ","section":"tutorials","type":"tutorials","date":"2026-06-22","externalUrl":null},{"title":"教程","permalink":"/zh/tutorials/","summary":"","content":"","section":"tutorials","type":"tutorials","date":"2026-06-22","externalUrl":null},{"title":"Git 远程仓库","permalink":"/zh/tutorials/git/remote-repository/","summary":"本文详细介绍 Git 远程仓库管理方法，涵盖 remote 查看、添加、修改、删除以及 push、pull、fetch 等核心操作，帮助开发者高效管理代码仓库。","content":" 1. 查看远程仓库 # git remote -v 可能显示：\norigin git@example.com:user/project.git (fetch) origin git@example.com:user/project.git (push) origin 是远程仓库的常用默认名称。\n2. 添加远程仓库 # git remote add origin 远程仓库地址 例如：\ngit remote add origin git@example.com:user/project.git 3. 修改远程仓库地址 # git remote set-url origin 新地址 4. 删除远程仓库配置 # git remote remove origin 这只会删除本地远程配置，不会删除服务器上的仓库。\n5. 推送代码 # 第一次推送：\ngit push -u origin main 之后可以直接执行：\ngit push 6. 获取远程更新 # git fetch fetch 会下载远程提交和分支信息，但通常不会直接修改当前工作区。\n查看远程主分支：\ngit log origin/main --oneline 7. 拉取代码 # git pull 通常可以理解为：\ngit fetch 加上 git merge 使用变基方式拉取：\ngit pull --rebase 具体采用哪种方式，应遵循团队规范。\n8. 推送本地分支 # git push -u origin feature/login 建立跟踪关系后可以直接：\ngit push 9. 删除远程分支 # git push origin --delete feature/login 10. 清理失效远程分支 # git fetch --prune 该命令会清理本地保存的、远程已经不存在的分支引用。\n","section":"tutorials","type":"tutorials","date":"2026-06-21","externalUrl":null},{"title":"VS Code 安装与 Python 开发环境配置","permalink":"/zh/tutorials/python/vscode-python-env/","summary":"本文介绍 VS Code 的安装和 Python 开发环境配置，包括安装 Python 插件、选择 Python 解释器，以及在 VS Code 中运行第一个 Python 文件。","content":"上一篇已经完成了 Python 的安装，这一篇继续配置写 Python 代码的工具：VS Code。\nVS Code 是一个常用的代码编辑器，适合用来学习和编写 Python 程序。它本身不是 Python，但可以通过安装 Python 插件，让我们更方便地写代码、运行代码和查看错误提示。\n一、下载安装 VS Code # 首先进入 VS Code 官网，下载适合自己电脑系统的版本。\n常见系统包括：\nWindows macOS Linux 下载完成后，按照安装程序提示一步一步安装即可。\n如果是 Windows 系统，安装过程中可以勾选一些常用选项，比如：\n添加到 PATH 添加“通过 Code 打开”到右键菜单 创建桌面快捷方式 这些选项不是必须的，但勾选后使用起来会更方便。\n安装完成后，打开 VS Code。\n二、安装 Python 插件 # 打开 VS Code 后，点击左侧的“扩展”按钮。\n也可以使用快捷键：\nCtrl + Shift + X 在搜索框中输入：\nChinese # 安装中文语言包（安装完成后点右下角弹出的重启，或者手动重启） Python # 安装Python插件 Python 插件可以让 VS Code 支持 Python 代码提示、运行、调试和解释器选择。\n安装完成后，VS Code 就具备了基本的 Python 开发能力。\n三、创建 Python 学习文件夹 # 建议单独创建一个文件夹，用来存放 Python 学习代码。\n例如可以创建一个文件夹：\npython-study 然后在 VS Code 中打开这个文件夹：\nFile → Open Folder 或者中文版界面中选择：\n文件 → 打开文件夹 打开文件夹后，可以在左侧文件区域新建一个 Python 文件：\nhello.py 注意：Python 文件的后缀是 .py。\n四、选择 Python 解释器 # Python 解释器可以理解为“运行 Python 代码的程序”。\nVS Code 只是写代码的地方，真正运行代码的还是 Python 解释器。\n如果 VS Code 自动弹出选择解释器的提示，直接选择你已经安装好的 Python 版本即可。\n也可以手动选择：\nCtrl + Shift + P 然后输入：\nPython: Select Interpreter 接着选择你电脑中已经安装好的 Python 版本。\n如果能看到类似这样的选项：\nPython 3.14.6 就可以选择它。\n五、写第一个 Python 文件 # 打开刚才创建的 hello.py 文件，输入下面的代码：\nprint(\u0026#34;Hello, Python!\u0026#34;) 这行代码的作用是输出一段文字。\n六、运行 Python 文件 # 运行 Python 文件有两种常见方式。\n方法一：点击运行按钮 # 打开 hello.py 文件后，点击右上角的运行按钮。\n运行后，下方终端会显示：\nHello, Python! 如果能看到这行内容，说明 VS Code 的 Python 环境已经配置成功。\n方法二：使用终端运行 # 也可以在 VS Code 下方终端中输入命令运行。\nWindows 可以使用：\npython hello.py macOS 或 Linux 可以使用：\npython3 hello.py 运行成功后，同样会看到：\nHello, Python! 七、常见问题 # 1. VS Code 找不到 Python # 可以先确认电脑是否已经安装 Python。\n在终端输入：\npython --version 或者：\npython3 --version 如果能显示 Python 版本，说明 Python 已经安装成功。\n然后回到 VS Code，重新选择解释器：\nCtrl + Shift + P → Python: Select Interpreter 2. 运行按钮没有出现 # 可能是 Python 插件没有安装成功，或者当前文件不是 .py 文件。\n可以检查两点：\n是否安装了 Microsoft 发布的 Python 插件 文件名是否以 .py 结尾 例如：\nhello.py 不要写成：\nhello.txt 3. 终端提示 python 不是命令 # 这种情况通常说明系统没有正确识别 Python 命令。\n可以尝试：\npy hello.py 或者：\npython3 hello.py 如果还是不行，需要回到 Python 安装部分，检查是否正确安装 Python，或者是否配置了环境变量。\n4. 代码没有输出结果 # 先检查代码是否写对：\nprint(\u0026#34;Hello, Python!\u0026#34;) 注意：\nprint 后面要有小括号 输出的文字要放在引号里面 符号尽量使用英文符号 八、总结 # 这篇文章主要完成了 VS Code 的安装和 Python 开发环境配置。\n主要步骤包括：\n安装 VS Code 安装 Python 插件 创建 Python 学习文件夹 新建 .py 文件 选择 Python 解释器 运行第一个 Python 程序 完成这些步骤后，就可以正式使用 VS Code 学习 Python 了。\n","section":"tutorials","type":"tutorials","date":"2026-06-21","externalUrl":null},{"title":"Git 合并与冲突解决","permalink":"/zh/tutorials/git/merge-conflict-resolution/","summary":"搞懂 Git 合并与冲突处理机制，掌握 merge、fast-forward、冲突解决流程以及减少冲突的实战方法。","content":"在多人协作开发中，Git 合并（merge）是非常高频的操作。但只要涉及多人修改同一份代码，就很容易遇到一个问题：冲突（Conflict）。\n本文将系统讲清 Git 合并的几种方式、冲突是怎么产生的、如何解决冲突，以及如何尽量减少冲突。\n合并与冲突常用命令 # 操作 命令 合并分支 git merge 分支名 Fast-forward 合并（默认） git merge 分支名 创建合并提交 git merge --no-ff 分支名 1. 什么是合并分支？ # Git 合并（merge）是指把一个分支的代码变化，整合到另一个分支中。\n例如：\nfeature/login → main 表示把登录功能分支的代码合并到主分支。\n常见场景：\n功能开发完成合并到 main bugfix 修复合并回开发分支 release 分支合并上线 合并的本质是：把两个分支的提交历史整合到一起。\n2. Fast-forward 合并 # 如果主分支在功能分支创建后没有新提交，Git 可能直接把主分支指针向前移动。\n这种方式称为 Fast-forward。\n示例：\nA---B main \\ C---D feature/login 合并后：\nA---B---C---D main Fast-forward 的特点：\n不产生 merge commit 历史是线性的 简洁，但不适合复杂协作 3. 创建合并提交 # 如果两个分支都产生了新提交，Git 通常会创建一个新的合并提交（merge commit）。\nA---B---C------M main \\ / D---E--F feature/login # M 是 merge commit，表示一次完整的合并记录。 可以使用：\ngit merge --no-ff feature/login 明确要求创建合并提交。\n4. 为什么会产生冲突？ # 冲突的本质是：\n两个分支修改了同一文件的同一位置\n例如：\nmain: hello world feature: hello Git Git 不知道该保留哪个版本，就会报冲突。\n5. 冲突标记 # 当发生冲突时，文件中会出现：\n\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; HEAD hello world ======= hello Git \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; feature/login 含义：\nHEAD：当前分支内容 =======：分隔线 feature/login：要合并进来的内容 6. 解决冲突的方法 # 手动修改为最终需要的内容：\nhello Git 删除所有冲突标记后执行：\ngit add 冲突文件 git commit 也可以填写明确说明：\ngit commit -m \u0026#34;\u0026#34; 7. 查看冲突文件 # # 查看冲突文件状态 git status # 查看冲突来源 git diff # 只查看未合并冲突文件 git diff --name-only --diff-filter=U 8. 取消合并 # # 恢复到合并开始前的状态 git merge --abort 9. 减少冲突的方法 # 开始开发前同步最新代码 git pull； 功能分支不要长期存在； 一个分支只负责一个明确功能； 避免多人修改同一文件的同一位置； 及时提交和推送； 大规模重构前提前沟通； 提交合并请求前同步目标分支。 ","section":"tutorials","type":"tutorials","date":"2026-06-20","externalUrl":null},{"title":"macOS 安装 Homebrew","permalink":"/zh/tutorials/install-homebrew-macos/","summary":"macOS 安装 Homebrew 的完整入门教程，一步一步教你快速完成安装与验证。","content":" 什么是 Homebrew？ # Homebrew 是 macOS 上的包管理工具，可以用来安装各种开发工具，比如：\nPython Node.js Git 安装 Homebrew # 打开「终端 Terminal」，复制下面命令并粘贴运行：\n/bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; 安装过程中会：\n下载文件 安装工具 可能要求输入电脑密码 按提示操作即可\n验证是否安装成功 # 安装完成后，输入：\nbrew --version 如果看到版本号，例如：\nHomebrew 5.x.x 说明安装成功\n常用命令 # brew install \u0026lt;package-name\u0026gt; # 安装软件 brew list # 查看已安装软件 brew update # 更新 Homebrew Homebrew 是 macOS 上常用的包管理工具，类似 Linux 系统中的 apt 或 yum。安装完成后，可以通过 brew install 快速安装和管理各种开发工具、编程语言和运行环境。\n","section":"tutorials","type":"tutorials","date":"2026-06-20","externalUrl":null},{"title":"安装 Python","permalink":"/zh/tutorials/python/install/","summary":"Python 安装完整教程，详细介绍 Windows、macOS 与 Linux 上的 Python 安装步骤，同时讲解 pip 安装与虚拟环境配置，帮助开发者快速搭建 Python 开发环境。","content":"Python 是当前最流行的编程语言之一，广泛用于 Web 开发、数据分析、人工智能与自动化脚本。要开始 Python 开发，第一步就是正确完成 Python install（安装 Python）。\n本文将系统讲解 Windows、macOS 和 Linux 上的 Python 安装方法，并补充环境配置与常见问题解决方案。\n安装前准备 # 安装 Python 前的准备\n在开始安装之前，建议确认以下几点：\n操作系统版本是否支持最新 Python（建议 Python 3.10+） 是否已有旧版本 Python（避免冲突） 是否需要管理员权限（Linux/macOS 通常需要 sudo） Windows 安装 Python # 1. 下载 Python # 访问 Python 官方网站下载：\nhttps://www.python.org/downloads/windows/\nActive Python releases 根据自己的需要选择合适的版本下载安装。建议选择 Stable Releases 版本安装。\n2. 安装步骤 # 下载完成后点击安装包会弹出终端页面：\n1. 启用长路径支持 # 这是 Windows 在提示路径长度限制（260字符）。\n建议选择 y 开启长路径支持，否则未来 pip 安装复杂依赖可能失败。\n2. 配置 PATH 环境变量 # 建议选择 y，否则需要手动配置 PATH 环境变量。\n3. 安装 Python（CPython） # 输入 Y 并回车，开始安装 Python。\n4. 查看安装完成信息 # 该界面用于说明 Python Launcher 的使用方法，例如运行 Python、切换版本等。\n不需要查看文档，直接按回车（选择 N）即可完成安装\n3. 验证安装 # 打开命令提示符（CMD）输入：\npython --version 或： python -V\n如果输出类似：\n说明安装成功。\nmacOS 安装 Python # macOS 推荐使用 Homebrew 安装 Python，这是最简单的方式。\n如果还没有安装 Homebrew，可以先参考： Homebrew 安装教程\nbrew install python 验证安装\npython3 --version python3 -V 笔记 macOS 默认使用 python3，而不是 python。\nLinux 安装 Python # # 更新系统 sudo apt update # 安装 Python sudo apt install python3 python3-pip -y # 验证安装 python3 --version pip3 --version 笔记 Linux 默认使用 python3，不是 python\npip 安装与使用 # pip 是 Python 的包管理工具，用于安装第三方库。\n# 安装库 pip install requests # 查看已安装库 pip list # 升级 pip python -m pip install --upgrade pip 笔记 在 macOS / Linux 中，如果系统区分 Python 版本，可能需要使用 pip3，但在 Python 3 环境下 pip 和 pip3 通常是等价的。\n虚拟环境 # 虚拟环境用于隔离项目依赖，避免冲突。\n# 创建名为 myenv 的虚拟环境 python -m venv myenv 激活虚拟环境：\n# Windows myenv\\Scripts\\activate # macOS / Linux source myenv/bin/activate 退出虚拟环境：\ndeactivate 常见问题（FAQ） # python 和 python3 有什么区别？ # python：可能指 Python 2 或系统默认版本\npython3：明确指 Python 3\npip 命令找不到？ # 尝试：\npython -m ensurepip --upgrade ","section":"tutorials","type":"tutorials","date":"2026-06-20","externalUrl":null},{"title":"Python 教程（从零开始学习 Python）","permalink":"/zh/tutorials/python/","summary":"系统整理 Python 入门学习路径，包括基础语法、常用数据结构和实战项目，适合零基础学习者。","content":"这是一个面向新手的 Python 学习系列。\n我会从 0 开始记录 Python 的学习过程，包括 Python 是什么、Python 能做什么、环境安装、基础语法、常见错误和小项目练习。\n这个系列的目标不是一开始就讲很复杂的内容，而是一步一步把 Python 基础打牢。\nPython 是什么？ # Python 是一门编程语言。\n简单理解，编程语言就是人与计算机沟通的工具。我们可以通过 Python 写代码，让计算机帮我们完成一些任务，比如计算数据、处理文件、整理表格、制作小工具等。\nPython 的语法比较清晰，代码可读性强，所以很适合编程新手入门。\n例如：\nprint(\u0026#34;Hello, Python!\u0026#34;) 这行代码的作用是在屏幕上输出一句话。\nPython 能做什么？ # Python 的应用范围很广，常见方向包括：\n自动化办公：批量处理文件、Excel 表格、报表等 数据分析：整理数据、统计数据、绘制图表 爬虫入门：获取网页上的公开数据 Web 开发：开发网站、接口和后台系统 人工智能：机器学习、深度学习等方向 小工具开发：计算器、密码生成器、文件整理工具等 对于新手来说，前期不需要急着学所有方向。先掌握基础语法，再通过小项目练习，才是比较稳的路线。\n这个系列适合谁？ # 这个系列适合：\n没有编程基础的新手 想学习 Python 的初学者 想用 Python 提高学习或办公效率的人 想通过小项目练习编程的人 想为后续学习数据分析、爬虫或 AI 打基础的人 学习路线 # ▼ 从零开始学习 Python - 系列专栏 ✦ 1：安装 Python ✦ 2：VS Code 安装与 Python 开发环境配置 ✦ 3：Python 变量和数据类型 ✦ 4：Python 输入输出和运算符 学习建议 # 建议按照顺序学习，不要跳过基础部分。\n编程最重要的是：\n多写代码，而不是只看教程。\n","section":"tutorials","type":"tutorials","date":"2026-06-20","externalUrl":null},{"title":"Git 分支管理","permalink":"/zh/tutorials/git/branch-management/","summary":"Git 分支管理的核心命令，理解分支的作用，并学会查看、创建、切换、重命名、删除和清理已合并分支。","content":"在 Git 中，分支是日常开发里非常重要的概念。无论是开发新功能、修复 Bug、多人协作，还是发布版本，几乎都会用到分支管理。\nGit 分支管理常用命令 # 操作 命令 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支 git branch -a 创建分支 git branch 分支名 创建并切换分支 git switch -c 分支名 切换分支 git switch 分支名 重命名当前分支 git branch -m 新分支名 重命名指定分支 git branch -m 旧分支名 新分支名 删除本地已合并分支 git branch -d 分支名 强制删除本地分支 git branch -D 分支名 删除远程分支 git push origin --delete 分支名 查看已合并分支 git branch --merged 查看未合并分支 git branch --no-merged 推送本地分支到远程 git push -u origin 分支名 1. 什么是 Git 分支 # Git 分支可以理解为一条独立的开发线。\n假设当前项目的主分支是 main，线上代码稳定运行。现在你要开发一个新功能，如果直接在 main 分支上修改代码，可能会影响稳定版本。\n更好的做法是创建一个新分支，比如：\n# 创建一个名为 feature/login 的新分支 git branch feature/login 然后在这个分支上开发登录功能。这样你的修改不会影响 main 分支。等功能开发完成并测试通过后，再把这个分支合并回 main。\n简单来说：\nmain 分支：保存稳定代码 feature 分支：开发新功能 bugfix 分支：修复问题 release 分支：准备发布版本 分支的核心作用是：让不同任务可以并行开发，互不干扰。\n使用分支可以带来几个明显好处：\n隔离开发环境\n新功能、Bug 修复、实验代码都可以放到独立分支中，不影响主分支。 方便多人协作\n不同开发者可以在不同分支上工作，最后通过合并代码完成协作。 降低发布风险\n主分支可以保持稳定，未完成的功能不会直接进入正式版本。 方便代码回溯\n每个分支都有清晰的开发记录，方便查看某个功能的提交历史。 在实际项目中，分支管理是 Git 工作流的基础。理解分支后，后面的提交、合并、冲突解决、版本发布都会更容易掌握。\n2. 查看 Git 分支 # 在操作分支之前，首先要知道当前仓库有哪些分支，以及自己正处在哪个分支上。\n2.1 查看本地分支 # 使用下面的命令可以查看本地所有分支：\ngit branch 示例输出：\ndev * main feature/login 其中带 * 的分支表示当前所在分支。\n上面的结果表示当前位于 main 分支，本地还有 dev 和 feature/login 两个分支。\n2.2 查看远程分支 # 如果想查看远程仓库中的分支，可以使用：\ngit branch -r 示例：\norigin/main origin/dev origin/feature/login 这里的 origin 通常表示远程仓库名称。\n2.3 查看本地和远程所有分支 # 如果想同时查看本地分支和远程分支，可以使用：\ngit branch -a 示例：\n* main dev remotes/origin/main remotes/origin/dev 这个命令在多人协作项目中特别常用，因为你可以快速确认本地和远程分别有哪些分支。\n2.4 查看当前所在分支 # 除了 git branch，也可以使用：\ngit status 示例：\nOn branch main nothing to commit, working tree clean 这表示当前位于 main 分支，并且工作区是干净的。\n3. 创建 Git 分支 # 创建分支是 Git 分支管理中最常见的操作之一。\n3.1 创建新分支 # 使用下面的命令创建一个新分支：\ngit branch 分支名 例如：\ngit branch feature/login 笔记 这个命令只会创建分支，不会自动切换到新分支。\n创建后可以执行：\ngit branch 查看分支是否创建成功。\n3.2 创建并切换到新分支 # 实际开发中，更常用的是创建分支后立即切换过去。\n推荐使用：\ngit switch -c 分支名 例如：\n# 创建新分区feature/login，并切换到feature/login分支 git switch -c feature/login 这条命令等价于：\ngit branch feature/login git switch feature/login 如果你使用的是旧版本 Git，也可以使用：\ngit checkout -b feature/login 不过现在更推荐使用 git switch，因为它的语义更清晰，专门用于切换分支。\n3.3 从指定提交创建分支 # 有时候你不想从当前分支最新提交创建分支，而是想从某个历史提交创建分支，可以这样写：\ngit switch -c 分支名 commit-id 例如：\ngit switch -c fix/old-version a1b2c3d 这表示从 a1b2c3d 这个提交创建一个新分支。\n3.4 创建分支后推送到远程 # 本地创建分支后，如果要让其他人也能看到，需要推送到远程仓库：\ngit push -u origin feature/login 其中：\norigin：远程仓库名称 feature/login：要推送的分支名 -u：建立本地分支和远程分支的关联 建立关联后，以后在这个分支上可以直接使用：\ngit push 或：\ngit pull 不需要每次都写完整远程分支名。\n4. 切换 Git 分支 # 切换分支表示从当前开发线切换到另一条开发线。\n4.1 使用 git switch 切换分支 # # 切换到 dev 分支 git switch dev # 确认当前分支 git branch 4.2 使用 git checkout 切换分支 # 旧写法是：\ngit checkout 分支名 git checkout 既可以切换分支，也可以恢复文件，功能比较多，容易让初学者混淆。因此现在更推荐使用 git switch 来切换分支。\n4.3 切换分支前要注意什么？ # 切换分支前，最好先执行：\ngit status 查看工作区是否有未提交的修改。\n如果当前分支有未提交修改，Git 可能会阻止切换分支，避免你的修改被覆盖。\n常见处理方式有三种：\n第一种，提交当前修改：\ngit add . git commit -m \u0026#34;保存当前修改\u0026#34; 第二种，临时保存修改：\ngit stash 第三种，确认不需要这些修改后丢弃：\ngit restore . 在真实项目中，不建议在不清楚修改内容的情况下直接丢弃代码。切换分支前先看 git status 是一个很好的习惯。\n5. 重命名 Git 分支 # 分支名称写错了，或者团队命名规范变化了，可以对分支进行重命名。\n5.1 重命名当前分支 # 如果你当前就在需要重命名的分支上，可以使用：\ngit branch -m 新分支名 5.2 重命名指定分支 # 如果你不在目标分支上，也可以指定旧分支名和新分支名：\ngit branch -m 旧分支名 新分支名 5.3 重命名远程分支 # Git 没有直接“重命名远程分支”的单个命令。通常做法是：\n# 先重命名本地分支： git branch -m old-branch new-branch # 然后删除远程旧分支： git push origin --delete old-branch # 再推送新的分支名： git push -u origin new-branch 如果这个分支已经被多人使用，重命名前最好先和团队确认，避免影响其他人的本地分支。\n6. 删除 Git 分支 # 当一个功能分支已经合并，或者某个临时分支不再需要时，可以删除它。\n6.1 安全删除本地分支 # 删除已经合并或不再需要的本地分支：\ngit branch -d 分支名 笔记 -d 是安全删除。如果这个分支还没有被合并，Git 会提示错误，防止误删代码。\n6.2 强制删除本地分支 # 如果确定分支不需要了，即使没有合并，也可以强制删除：\ngit branch -D 分支名 笔记 -D 会强制删除分支，使用前要确认分支上的提交不再需要。\n6.3 删除远程分支 # 删除远程分支使用：\ngit push origin --delete 分支名 删除远程分支后，其他人的本地仓库可能还会看到旧的远程分支引用，可以执行：\ngit fetch -p 清理已经不存在的远程分支引用。\n6.4 删除分支前建议先确认是否已合并 # 删除分支前，可以先查看它是否已经合并：\ngit branch --merged 如果分支已经合并到当前分支，删除风险较低。\n如果没有合并，执行：\ngit branch --no-merged 可以查看尚未合并的分支。\n7. 常见分支类型 # 好的分支命名可以让团队协作更清晰。看到分支名，就能大致知道这个分支是做什么的。\n7.1 实际项目中常见的分支命名包括： # main：主分支，通常保存稳定代码 dev：开发分支，日常开发集成使用 feature/xxx：新功能分支 bugfix/xxx：Bug 修复分支 hotfix/xxx：线上紧急修复分支 release/xxx：发布准备分支 test/xxx：测试或实验分支 7.2 分支命名建议 # 推荐遵循以下规则：\n使用英文小写 单词之间用短横线连接 使用类型前缀，比如 feature、bugfix、hotfix 名称要能表达分支用途 避免使用无意义名称，比如 test1、abc、new\n推荐示例：\nfeature/user-login bugfix/cart-price hotfix/payment-timeout release/v1.2.0 不推荐示例：\ntest new aaa zhangsan fix 清晰的分支命名能降低沟通成本，尤其适合多人协作项目。\n10. Git 分支管理最佳实践 # Git 分支管理不需要复杂，日常开发中记住几个原则即可。\n10.1 主分支保持稳定 # main 或 master 分支通常用于保存稳定代码，不建议直接在主分支上开发新功能。\n推荐流程：\n从 main 创建功能分支 在功能分支开发 测试通过后合并回 main 合并完成后删除无用分支 10.2 一个分支只做一件事 # 每个分支最好只对应一个功能、一个 Bug 或一次发布任务。\n推荐：\nfeature/login bugfix/cart-price hotfix/payment-timeout 不推荐：\nfeature/login-and-payment-and-profile 这样可以让代码审查、测试和回滚都更清晰。\n10.3 合并后及时清理分支 # 功能分支合并后，如果确认不再使用，可以删除本地和远程分支。\n# 删除本地分支： git branch -d feature/login # 删除远程分支： git push origin --delete feature/login 10.4 删除前先确认是否已合并 # 删除分支前建议先查看：\n# 查看已合并分支 git branch --merged 未合并的分支不要随意强制删除，避免丢失提交。\n11. Git 分支管理常见问题 # 11.1 Git 创建分支后会自动切换吗？ # 不会。\ngit branch feature/login # 只创建分支，不会切换分支。 git switch -c feature/login # 创建并切换分支 11.2 git switch 和 git checkout 有什么区别？ # git switch 专门用于切换分支，语义更清晰。\ngit checkout 功能更多，既能切换分支，也能恢复文件。\n初学者更推荐使用 git switch。\n11.3 删除分支会删除代码吗？ # 如果分支已经合并，删除通常是安全的。\n如果分支没有合并，强制删除可能导致提交不容易找回。\n删除前建议先执行：\n# 查看已合并分支 git branch --merged 11.4 远程分支已经删除，本地还显示怎么办？ # 执行：\ngit fetch -p 它会清理本地已经失效的远程分支引用。\n","section":"tutorials","type":"tutorials","date":"2026-06-19","externalUrl":null},{"title":"Git 撤销与回退","permalink":"/zh/tutorials/git/undo-rollback/","summary":"按照实际开发场景梳理 Git 撤销与回退的常用命令，帮助你快速判断什么时候用 restore、commit \u0026ndash;amend、revert、reset 和 reflog。","content":"在使用 Git 时，经常会遇到这些问题：代码改错了想撤销、已经 git add 了想取消暂存、commit 写错了想修改、提交后想回退版本，甚至 reset 误操作后想恢复提交。\n这些情况都属于 Git 的“撤销与回退”，但不同场景要使用不同命令。本章会按照实际开发流程，系统讲清 restore、commit \u0026ndash;amend、revert、reset、reflog 的用法和区别。\n学习本章节前需要理解 Git 工作区、暂存区、本地仓库的概念，可以跳转至 Git 的核心概念\nGit 撤销与回退常用命令 # 场景 推荐命令 是否安全 是否改历史 撤销工作区未暂存修改 git restore \u0026lt;file\u0026gt; 安全 否 取消暂存 git restore --staged \u0026lt;file\u0026gt; 安全 否 修改最后一次提交信息 git commit --amend 谨慎 是 撤销某次已提交记录 git revert \u0026lt;commit\u0026gt; 安全 否 回退到某个提交 git reset --soft/mixed/hard 谨慎 是 reset 后想恢复 git reflog 救命命令 可恢复 撤销工作区未暂存的修改 # # 撤销工作区指定文件 file.txt 的修改 git restore file.txt # 撤销工作区所有未暂存修改 git restore . 警告 撤销操作会丢弃工作区未提交的修改，执行前应确认这些内容不再需要。\n取消暂存 # 如果不小心把不需要提交的文件加入了暂存区（staging area），可以使用下面的命令将其移出暂存区。\n# 取消暂存区指定文件 file.txt 的暂存 git restore --staged file.txt # 取消暂存区所有暂存文件 git restore --staged . 笔记 git restore --staged 只会把文件从暂存区移回工作区，不会删除你的代码修改。\n修改最后一次提交 # # 修改最后一次 commit message git commit --amend # 修改提交信息但不打开编辑器 git commit --amend -m \u0026#34;新的提交信息\u0026#34; # 把遗漏文件补进上一次提交，--no-edit 表示保留原提交信息。 git add missed-file.txt git commit --amend --no-edit 提示 如果这次提交已经 push 到远程仓库，不建议随意 amend，因为它会改写提交历史。\n撤销已提交内容 # git revert 不会删除原来的提交，而是生成一个新的提交，用来抵消指定提交的改动。\ngit revert \u0026lt;commit-id\u0026gt; # 撤销指定 Commit 适合：\n已经推送到远程的提交； 已经被团队共享的提交； 公共分支中的错误修改。 回退版本 # git reset 会移动当前分支的 HEAD 指针，可以用来回退到某个历史提交。\n1. soft 模式：保留暂存区和工作区 # git reset --soft \u0026lt;commit-id\u0026gt; # 回退到指定 Commit git reset --soft HEAD~1 # 从当前提交往回数 1 个提交（即上一次提交） 效果：\n移动分支位置； 保留暂存区； 保留工作区修改。 适合重新组织最近一次提交。\n2. mixed 模式：保留工作区，清空暂存区 # git reset --mixed \u0026lt;commit-id\u0026gt; # 回退到指定 Commit git reset --mixed HEAD~1 # 从当前提交往回数 1 个提交（即上一次提交） 等同于：\ngit reset \u0026lt;commit-id\u0026gt; # 回退到指定 Commit git reset HEAD~1 # 从当前提交往回数 1 个提交（即上一次提交） 效果：\n移动分支位置； 清空相应暂存状态； 保留工作区修改。 3. hard 模式：彻底回退 # git reset --hard \u0026lt;commit-id\u0026gt; # 回退到指定 Commit git reset --hard HEAD~1 # 从当前提交往回数 1 个提交（即上一次提交） 效果：\n移动分支位置； 重置暂存区； 重置工作区。 警告 git reset --hard 会丢弃目标提交之后的提交和工作区修改，谨慎使用。\nsoft、mixed、hard 对比表 # 命令 移动 HEAD 保留暂存区 保留工作区 风险 reset --soft 是 是 是 低 reset --mixed 是 否 是 中 reset --hard 是 否 否 高 git revert 和 git reset 的区别 # git revert 是新增一个提交来撤销旧提交；git reset 是移动 HEAD 指针来回退历史。\n对比项 git revert git reset 是否保留原提交 保留 可能不保留 是否生成新提交 是 否 是否改写历史 否 是 是否适合已 push 的提交 适合 不建议 是否适合本地未 push 提交 可以 适合 什么时候用 revert：提交已经推送到远程仓库，并且别人可能已经基于这个提交开发。\n什么时候用 reset：提交还在本地，没有 push，想整理提交历史或回到某个版本。\n恢复误删提交 # git reflog 会记录 HEAD 的移动历史，即使 commit 被 reset 掉，也通常可以通过 reflog 找回来。\n# 查看操作记录 git reflog # 找回 reset --hard 前的提交 git reset --hard \u0026lt;commit-id\u0026gt; # 更安全的恢复方式：新建分支 git branch recover-branch \u0026lt;commit-id\u0026gt; reflog 可以帮助恢复：\n错误 reset 的提交； 误删分支中的提交； 意外丢失的 HEAD 位置。 ","section":"tutorials","type":"tutorials","date":"2026-06-18","externalUrl":null},{"title":"Git 查看仓库状态与提交历史","permalink":"/zh/tutorials/git/status-and-log/","summary":"学习如何使用 Git 命令查看仓库状态、文件修改、提交历史、分支记录和本地操作记录。","content":"在使用 Git 管理代码时，经常会遇到这些问题：\n我现在在哪个分支？ 哪些文件被修改了？ 哪些文件还没有提交？ 最近提交了哪些内容？ 某一次提交到底改了什么？ 之前切换分支或回退版本的记录还能不能看到？ 这些问题都可以通过 Git 的查看类命令解决。\n本文会用比较通俗的方式，介绍如何查看 Git 仓库状态与提交历史。即使你刚开始学习 Git，也可以跟着一步一步理解。\n一、查看仓库当前状态 # 1. 查看完整状态：git status # 最常用的命令是：\ngit status 这个命令可以理解为：让 Git 告诉你当前仓库发生了什么。\n它会告诉你：\n当前在哪个分支 哪些文件被修改了 哪些文件已经加入暂存区 哪些文件还没有被 Git 管理 当前是否有内容需要提交 例如执行：\ngit status 可能会看到类似结果：\nOn branch main Your branch is up to date with \u0026#39;origin/main\u0026#39;. Untracked files: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to include in what will be committed) content/zh/tutorials/git/07-status-and-log.md nothing added to commit but untracked files present (use \u0026#34;git add\u0026#34; to track) 这段信息的意思是：\n你现在在 main 分支上。\n你的本地 main 分支和远程 origin/main 是同步的\nGit 发现了一个新文件content/zh/tutorials/git/07-status-and-log.md但是这个文件还没有被 Git 管理，也就是还没有执行 git add。\n当前没有可以提交的内容，因为新文件还没有加入暂存区。\n简单来说，git status 就像是查看仓库的“体检报告”。\n2. 简洁查看状态：git status -s # 如果你觉得 git status 输出太长，可以使用简洁版本：\ngit status -s 也可以写成：\ngit status --short 示例输出：\n?? content/zh/tutorials/git/07-status-and-log.md 这里的含义是：\n输出开头的 ?? 表示这是一个新文件，Git 还没有跟踪。\n3. 常见简洁状态说明 # 简介状态输出格式大致是：\nXY 文件名 其中：\nX 表示暂存区状态，也就是有没有执行过 git add。\nY 表示工作区状态，也就是文件在本地有没有继续修改。\n常见状态如下：\n状态 暂存区 工作区 含义 ?? 未跟踪 未跟踪 新文件，Git 还没有跟踪 A␠ 新增 无变化 新文件，已经加入暂存区 ␠M 无变化 修改 文件被修改了，但还没有加入暂存区 M␠ 修改 无变化 文件被修改了，并且已经加入暂存区 MM 修改 修改 文件加入暂存区后，又继续被修改了 ␠D 无变化 删除 文件被删除了，但还没有加入暂存区 D␠ 删除 无变化 文件删除操作已经加入暂存区 R␠ 重命名 无变化 文件重命名已经加入暂存区 C␠ 复制 无变化 文件复制已经加入暂存区 UU 冲突 冲突 文件有冲突，需要手动解决 为了看清楚状态码里的空格，上面用 ␠ 表示一个空格。实际执行 git status -s 时，不会显示 ␠ 这个符号。\n笔记 简单记忆：第一个位置表示暂存区，第二个位置表示工作区。字母出现在第一个位置，通常说明已经 git add；字母出现在第二个位置，通常说明还没有加入暂存区。\n这个命令适合在日常开发中快速看一眼当前仓库的变化以及状态。\n二、查看文件修改内容 # 1. 查看未暂存的修改：git diff # git status 只能告诉你“哪些文件变了”，但不会告诉你“具体哪里变了”。\n如果你想看具体修改内容，可以使用：\ngit diff 这个命令会显示工作区里还没有加入暂存区的修改。\n比如你修改了 README.md，运行：\ngit diff README.md 就可以看到这个文件具体新增了哪些内容、删除了哪些内容。\n可以这样理解：\ngit status 是看“哪些文件变了”。\ngit diff 是看“这些文件到底改了什么”。\n2. 查看已暂存的修改：git diff \u0026ndash;staged # 如果你已经执行过：\ngit add README.md 那么这个文件的修改就进入了暂存区。\n这时再执行：\ngit diff 可能看不到刚才的修改。\n因为 git diff 默认查看的是“还没有暂存”的内容。\n如果要查看已经暂存、准备提交的内容，可以使用：\ngit diff --staged 也可以使用：\ngit diff --cached 这两个命令作用基本一样。\n三、查看提交历史 # 1. 查看完整提交历史：git log # 想看之前提交过哪些内容，可以使用：\ngit log 这个命令会列出当前分支的提交历史。\n每条提交记录通常包括：\n提交 ID 提交作者 提交时间 提交说明 示例：\ncommit 5d6d3c6b2b1e2af7e5ac0402c38da73072d571de Author: Evan Wu \u0026lt;info@evansama.com\u0026gt; Date: Sat Jun 13 23:10:10 2026 +0800 new post 其中 commit 后面那一长串字符就是提交 ID，也叫 commit hash。\n以后如果你想查看某一次提交、回退到某一次提交，通常都会用到这个 ID。\n如果日志很多，可以使用 git log -5 查看最近五次提交。\n检查完毕按键盘上的 q 退出日志查看。\n2. 一行显示提交历史：git log \u0026ndash;oneline # 默认的 git log 信息比较多，不太适合快速浏览。\n更常用的是：\ngit log --oneline 示例：\na1619e7 new post 5d6d3c6 new post 3e316dd git index change 698384a git 安装文章更新 d3d9931 优化面包屑导航，文章更新 这样每次提交只显示一行。\n左边是简短版提交 ID，右边是提交说明。\n这个命令非常适合快速了解项目最近做了哪些修改。\n3. 查看某一次提交的详细内容：git show # 如果你想知道某一次提交到底改了什么，可以使用：\ngit show \u0026lt;commit-id\u0026gt; 例如：\ngit show a1b2c3d 这个命令会显示这次提交的详细信息，包括：\n谁提交的 什么时候提交的 提交说明是什么 修改了哪些文件 文件中具体改了哪些代码 如果只想看这次提交影响了哪些文件，可以使用：\ngit show --stat a1b2c3d 它会显示比较简洁的统计信息，比如哪些文件被修改，以及新增、删除了多少行。\n4. 查看某位作者的提交：git log \u0026ndash;author # 如果项目是多人协作开发，有时我们只想查看某个人提交过哪些内容。\n可以使用：\ngit log --author=\u0026#34;Evan Wu\u0026#34; 这条命令会筛选出作者名称中包含 Evan Wu 的提交记录。\n5. 查看某个文件的历史记录 git log \u0026ndash; 文件名 # 有时候我们不想看整个项目的提交历史，只想看某个文件的变化历史。\n比如只查看 README.md 的提交记录，可以使用：\ngit log -- README.md 如果想看这个文件每次提交具体改了什么，可以使用：\ngit log -p -- README.md 这里的 -p 表示显示详细修改内容。\n这个命令适合用来追踪某个文件为什么变成现在这样。\n四、查看分支和合并关系 # 1. 图形方式查看分支历史：git log \u0026ndash;oneline \u0026ndash;graph \u0026ndash;all # 如果项目中有多个分支，可以使用：\ngit log --oneline --graph --all 这个命令会用简单的字符图形显示提交之间的关系。\n示例：\n* 38029b8 separate search index by language * 1d45f9e Merge branch \u0026#39;blowfish-rebuild\u0026#39; |\\ | * 67d5cbe finalize blowfish rebuild | * e0e9b0e update gitignore for cloudflare pages deployment | * 8b60a89 configure blowfish homepage and basic layout | * 288bffb migrate site from papermod to blowfish | * 2fd59d0 init hugo modules for blowfish rebuild |/ * 3e960fd git/install.md update * c9a3c09 更新中文菜单，添加git教程文章 * 7966fe8 add new 这里的 * 表示一次提交。\n线条表示分支之间的关系。\n| 表示分支线 \\ 表示分支分出去或合并回来 |/ 表示分支合并回主线 如果你想知道某个分支是从哪里分出来的，或者两个分支什么时候合并过，这个命令很有用。\n2. 查看分支列表：git branch # 查看本地分支，可以使用：\ngit branch 示例：\n* main dev feature-login 带 * 的分支表示你当前所在的分支。\n如果想查看本地和远程的所有分支，可以使用：\ngit branch -a 如果想查看本地分支和远程分支的对应关系，可以使用：\ngit branch -vv 示例：\n* main a1b2c3d [origin/main] update README dev 7e6f5d4 [origin/dev] fix bug 这可以帮助你判断当前分支是否关联了远程分支。\n五、查看本地操作记录 # 1. 查看本地操作记录：git reflog # git log 查看的是提交历史。\n但有时候，我们还想知道自己最近做过哪些 Git 操作，比如：\n切换过哪些分支 回退过哪些版本 reset 到了哪里 commit 之后 HEAD 怎么移动过 这时可以使用：\ngit reflog 示例：\na1b2c3d HEAD@{0}: commit: update README 9f8e7d6 HEAD@{1}: checkout: moving from dev to main 7e6f5d4 HEAD@{2}: commit: fix bug 可以把 git reflog 理解为 Git 在本地记录的一份“操作日志”。\n它在误删提交、错误回退版本时特别有用。\n比如你不小心执行了错误的 reset，有时可以通过 git reflog 找回之前的提交位置。\n2. git log 和 git reflog 的区别 # 很多初学者会混淆 git log 和 git reflog。\n简单来说：\ngit log 主要看提交历史。\ngit reflog 主要看本地 HEAD 的移动记录。\n也就是说，git log 更像是项目的正式历史记录。\ngit reflog 更像是你本机上的 Git 操作记录。\n需要注意的是，git reflog 是本地记录，不一定会出现在别人的电脑上。\n六、常用命令汇总 # 命令 作用 git status 查看当前仓库状态 git status -s 用简洁方式查看仓库状态 git diff 查看还没有暂存的修改 git diff --staged 查看已经暂存的修改 git log 查看提交历史 git log --oneline 一行显示一条提交记录 git log --oneline --graph --all 用图形方式查看分支历史 git show \u0026lt;commit-id\u0026gt; 查看某次提交的详细内容 git show --stat \u0026lt;commit-id\u0026gt; 查看某次提交的文件修改统计 git log -- \u0026lt;file\u0026gt; 查看某个文件的提交历史 git log -p -- \u0026lt;file\u0026gt; 查看某个文件每次提交的具体修改 git branch 查看本地分支 git branch -a 查看所有分支，包括远程分支 git branch -vv 查看分支和远程分支的对应关系 git reflog 查看本地 HEAD 操作记录 git log -n 5 --oneline 查看最近 5 条提交 git log --author=\u0026quot;作者名\u0026quot; --oneline 查看某位作者的提交记录 git log --since=\u0026quot;1 week ago\u0026quot; --oneline 查看最近一周的提交 git log main --oneline 查看指定分支的提交历史 七、推荐日常使用命令 # 日常开发中，下面这几个命令最常用：\ngit status -s # 简洁查看当前仓库状态，比如哪些文件被修改、新增或删除。 git diff # 查看工作区中还没有加入暂存区的具体修改内容。 git log --oneline --graph --all # 用简洁的图形方式查看所有分支的提交历史和合并关系。 git branch -vv # 查看本地分支列表，以及它们对应的远程分支和最新提交信息。 它们可以帮助你快速了解：\n当前有哪些文件被修改了。\n这些文件具体改了什么。\n最近有哪些提交。\n当前分支和远程分支是否对应。\n总结 # 查看 Git 仓库状态与历史，是学习 Git 时非常基础也非常重要的一部分。\n如果你只是想知道当前项目有没有改动，可以使用：\ngit status 如果你想知道具体改了什么，可以使用：\ngit diff 如果你想查看提交历史，可以使用：\ngit log 如果你想查看某一次提交的详细内容，可以使用：\ngit show 如果你想查看本地操作记录，可以使用：\ngit reflog 掌握这些命令之后，你就可以更清楚地知道 Git 仓库当前处于什么状态，也能更方便地追踪项目的修改历史。\n","section":"tutorials","type":"tutorials","date":"2026-06-17","externalUrl":null},{"title":"Git 基础工作流","permalink":"/zh/tutorials/git/basic-workflow/","summary":"Git 基础工作流，包括文件修改、暂存、提交、推送以及规范化提交原则。","content":"Git 最常见的基础流程是：\ngit status # 查看当前仓库的文件状态（哪些修改未提交） git add . # 将所有修改的文件添加到暂存区 git commit -m \u0026#34;提交说明\u0026#34; # 提交暂存区内容到本地仓库，并写提交说明 git push # 将本地提交推送到远程仓库 修改文件 # 例如修改 README.md：\n# Git Demo 这是一个用于学习 Git 的项目。 查看当前状态 # git status Git 会显示哪些文件被修改、哪些文件未跟踪、哪些文件已经暂存。\n查看具体修改 # git diff 查看某个文件：\ngit diff README.md 提示 git diff 只管“修改内容”，不管“文件新增删除状态”。\n添加到暂存区 # 在 Git 中，将文件加入暂存区（staging area）有两种常见方式： 一种是指定具体文件，另一种是按目录或全部文件添加。\n# 只把 README.md 这个文件加入暂存区 git add README.md # 同时添加多个文件到暂存区 git add README.md app.js # 将当前目录下所有新增、修改的文件加入暂存区 git add . 提示 git add 只是“放入待提交列表”，不会真正提交 提交需要使用 git commit git add . 会一次性加入所有改动，适合快速开发，但要注意避免误提交 创建提交 # # 提交一次版本，并附带说明信息（\u0026#34;docs: 补充项目说明\u0026#34;） git commit -m \u0026#34;docs: 补充项目说明\u0026#34; 建议提交信息清楚表达本次修改内容。\n不推荐：\n修改 更新 处理一下 test 推荐：\nfeat: 新增用户登录功能 fix: 修复订单金额计算错误 docs: 补充项目启动说明 refactor: 重构用户查询逻辑 推送远程仓库 # git push 第一次推送某个分支时，可能需要建立跟踪关系：\ngit push -u origin main 工作流程图 # flowchart TD A[工作区 Working Directory] --\u003e B[git status\n查看整体变化] B --\u003e C[git diff\n查看未暂存的修改内容] C --\u003e D[git add\n加入暂存区] D --\u003e E[git diff --staged\n查看即将提交的内容] E --\u003e F[git commit\n生成版本提交] F --\u003e G[git push\n推送远程仓库] 一次提交只做一件事 # 推荐把不同类型的修改拆分成多个提交。\n例如：\nfeat: 新增登录页面 fix: 修复表单校验问题 docs: 更新登录模块说明 不建议把多个无关功能放在同一次提交中。\n每一次提交都应该“能让别人一眼看懂你做了什么”\n","section":"tutorials","type":"tutorials","date":"2026-06-15","externalUrl":null},{"title":"Git 创建仓库","permalink":"/zh/tutorials/git/create-repository/","summary":"本文讲解如何在本地初始化 Git 仓库并开始版本控制。","content":" 创建仓库 # 创建 Git 仓库主要有两种方式：\n初始化一个本地目录； 克隆已有远程仓库。 初始化本地仓库 # 创建目录：\nmkdir git-demo # 新建\u0026#34;git-demo\u0026#34;文件夹 cd git-demo # 切换到\u0026#34;git-demo\u0026#34;目录 初始化 Git：\ngit init 执行后，当前目录会变成 Git 仓库。\n查看隐藏文件：\nls -a 笔记 Windows下使用：\nGet-ChildItem -Force可以看到：\n.git 创建第一个文件 # 创建 README.md：\n# 创建一个 README.md 文件，并写入一行内容：# Git Demo echo \u0026#34;# Git Demo\u0026#34; \u0026gt; README.md 查看状态：\ngit status Git 会提示 README.md 是未跟踪文件。\n创建第一次提交 # 添加文件：\ngit add README.md 提交文件：\ngit commit -m \u0026#34;初始化项目\u0026#34; 查看历史：\ngit log --oneline 克隆远程仓库 # 如果远程仓库已经存在，可以执行：\ngit clone 远程仓库地址 例如：\ngit clone git@example.com:user/project.git 克隆到指定目录my-project：\ngit clone git@example.com:user/project.git my-project 克隆后，Git 会自动完成：\n创建项目目录； 下载项目文件； 下载提交历史； 配置远程仓库； 建立默认分支跟踪关系。 查看当前仓库根目录 # git rev-parse --show-toplevel 该命令可以显示当前 Git 仓库的根目录。\n","section":"tutorials","type":"tutorials","date":"2026-06-14","externalUrl":null},{"title":"Git 管理范围：理解工作区、暂存区与忽略规则","permalink":"/zh/tutorials/git/management-scope/","summary":"理解 Git 的管理范围，区分已跟踪文件、未跟踪文件、暂存区和 .gitignore 忽略规则。","content":"很多初学者在使用 Git 时，会遇到这样的问题：\n为什么有些文件会出现在 git status 里？ 为什么有些文件 Git 没有管理？ 为什么写了 .gitignore 之后，文件还是被提交了？ git add . 到底添加了什么？ 这些问题都和 Git 的管理范围 有关。\nGit 并不会自动管理电脑里的所有文件。它只会管理当前仓库目录中，被纳入版本控制的文件。理解 Git 管理哪些文件、忽略哪些文件，是学习 Git 的基础。\nGit 仓库从哪里开始？ # 一个 Git 仓库的核心标志是：\n.git/ 当你在某个目录执行：\ngit init Git 会在当前目录下创建一个 .git 文件夹。\n例如：\nmy-project/ ├── .git/ ├── README.md ├── index.html └── style.css 这时，my-project 就是一个 Git 仓库。\nGit 会管理这个仓库目录下的文件变化，但不会管理仓库目录外面的内容。\n例如：\nDesktop/ ├── my-project/ │ ├── .git/ │ ├── README.md │ └── index.html └── other-file.txt 这里的 other-file.txt 不在 my-project 仓库里面，所以不会被这个 Git 仓库管理。\n工作区是什么？ # 工作区就是你正在编辑的项目目录。\n例如：\nmy-project/ ├── README.md ├── index.html └── style.css 你在 VS Code、记事本、终端里修改这些文件，都是在修改工作区。\n工作区里的文件变化不一定会立刻进入 Git 历史。Git 需要你明确告诉它：哪些变化要加入下一次提交。\n这个动作就是：\ngit add Git 眼里的文件状态 # 在 Git 里，一个文件通常会处于下面几种状态。\n未跟踪文件 # 未跟踪文件指的是：文件存在于工作区，但还没有被 Git 纳入版本控制。\n例如你新建一个文件：\nhello.md 然后执行：\ngit status 可能会看到：\nUntracked files: hello.md 这表示 Git 看到了这个文件，但还没有开始管理它。\n如果你想让 Git 管理它，需要执行：\ngit add hello.md 已跟踪文件 # 已跟踪文件指的是：已经被 Git 纳入版本控制的文件。\n比如一个文件曾经被执行过：\ngit add README.md git commit -m \u0026#34;add README\u0026#34; 那么 README.md 就是已跟踪文件。\n以后你再修改 README.md，Git 就能识别它发生了变化。\n已修改文件 # 已修改文件指的是：文件已经被 Git 跟踪，但内容发生了变化，还没有加入暂存区。\n例如你修改了 README.md，执行：\ngit status 可能会看到：\nChanges not staged for commit: modified: README.md 这表示 Git 知道这个文件被改了，但这次修改还没有准备进入下一次提交。\n已暂存文件 # 已暂存文件指的是：文件变化已经通过 git add 加入暂存区，准备进入下一次提交。\n例如：\ngit add README.md 然后执行：\ngit status 可能会看到：\nChanges to be committed: modified: README.md 这表示这次修改已经进入暂存区，下一次执行 git commit 时会被保存到 Git 历史中。\n暂存区是什么？ # 暂存区可以理解为：下一次提交的准备区。\nGit 的提交不是自动保存整个项目，而是保存你放进暂存区的内容。\n基本流程是：\n工作区 ↓ git add 暂存区 ↓ git commit 本地仓库 例如你同时修改了两个文件：\nREADME.md index.html 但你只想先提交 README.md，可以执行：\ngit add README.md git commit -m \u0026#34;update README\u0026#34; 这时只有 README.md 的修改会进入这次提交，index.html 的修改仍然留在工作区。\n这就是暂存区的意义：它允许你选择哪些修改进入下一次提交。\n使用 git status 查看当前状态 # 学习 Git 时，最常用的命令之一就是：\ngit status 它会告诉你：\n哪些文件没有被跟踪 哪些文件被修改了 哪些文件已经暂存 当前分支是否干净 建议你在每次 git add 和 git commit 前后都执行一次：\ngit status 这样可以清楚地知道当前仓库处于什么状态。\n把文件加入 Git 管理 # 如果只想添加某一个文件：\ngit add README.md 如果想添加当前目录下的所有变化：\ngit add . git add . 会把当前目录及其子目录中的新增、修改、删除变化加入暂存区。\n但要注意：git add . 不是提交。\n它只是把变化放进暂存区。\n真正保存到 Git 历史中，还需要执行：\ngit commit -m \u0026#34;提交说明\u0026#34; 哪些文件不应该交给 Git 管理？ # 并不是所有文件都适合提交到 Git 仓库。\n通常不建议提交这些内容：\n系统临时文件 编辑器缓存文件 依赖目录 构建产物 日志文件 环境变量文件 密钥和密码 例如：\n.DS_Store node_modules/ dist/ public/ .env *.log 这些文件要么可以重新生成，要么包含本地环境信息，要么可能包含敏感内容。\n这类文件通常应该使用 .gitignore 忽略。\n.gitignore 是什么？ # .gitignore 是 Git 的忽略规则文件。\n你可以在仓库根目录创建一个文件：\n.gitignore 然后写入需要忽略的文件或目录。\n例如：\n# 依赖目录 node_modules/ # 构建产物 dist/ public/ # 环境变量 .env # 日志文件 *.log # macOS 系统文件 .DS_Store 这样 Git 就不会再把这些未跟踪文件显示到 git status 里。\n.gitignore 的常见写法 # 忽略单个文件：\n.env 忽略某个目录：\nnode_modules/ 忽略所有 .log 文件：\n*.log 忽略某个目录下的文件：\npublic/ dist/ 添加注释：\n# 这里是注释 已经被 Git 跟踪的文件，.gitignore 还生效吗？ # 这是初学者非常容易踩坑的地方。\n如果一个文件已经被 Git 跟踪，那么你后来把它写进 .gitignore，Git 仍然会继续跟踪它。\n例如，假设 .env 已经被提交过：\ngit add .env git commit -m \u0026#34;add env file\u0026#34; 后来你在 .gitignore 里写：\n.env 这并不会让 Git 自动停止跟踪 .env。\n你需要执行：\ngit rm --cached .env 然后提交这次变化：\ngit commit -m \u0026#34;stop tracking env file\u0026#34; 这条命令的意思是：从 Git 版本控制中移除 .env，但保留本地文件。\n如果是目录，例如 public/：\ngit rm -r --cached public/ 然后：\ngit commit -m \u0026#34;stop tracking public directory\u0026#34; 如何判断文件为什么被忽略？ # 如果你发现某个文件没有出现在 git status 中，可以用：\ngit check-ignore -v 文件名 例如：\ngit check-ignore -v .env 如果这个文件被忽略，Git 会告诉你是哪一条规则导致它被忽略。\n这在 .gitignore 规则比较多的时候很有用。\n一个完整示例 # 假设你有一个项目：\nmy-blog/ ├── content/ ├── public/ ├── themes/ ├── .env ├── hugo.toml └── README.md 其中：\ncontent/ themes/ hugo.toml README.md 这些通常应该交给 Git 管理。\n而：\npublic/ .env 通常不应该提交。\n你可以创建 .gitignore：\npublic/ .env .DS_Store 然后执行：\ngit status 确认 Git 不再提示这些被忽略的文件。\n接着添加需要管理的内容：\ngit add content themes hugo.toml README.md .gitignore 提交：\ngit commit -m \u0026#34;initialize blog project\u0026#34; 这样你的仓库就只会管理真正需要保存的内容。\n常见误区 # .gitignore 会删除文件吗？ # 不会。\n.gitignore 只是告诉 Git 不要跟踪某些文件。\n它不会删除本地文件，也不会自动删除远程仓库里已经存在的文件。\ngit add . 会提交文件吗？ # 不会。\ngit add . 只是把变化加入暂存区。\n真正提交需要执行：\ngit commit -m \u0026#34;提交说明\u0026#34; Git 会自动管理所有文件吗？ # 不会。\nGit 只会管理仓库目录里的内容，并且只有被纳入版本控制的文件才是已跟踪文件。\n忽略规则写了为什么没生效？ # 常见原因是文件已经被 Git 跟踪。\n这种情况下需要先执行：\ngit rm --cached 文件名 然后再提交。\n小结 # 理解 Git 的管理范围，关键是分清楚下面几个概念：\n工作区：你正在编辑的项目文件 暂存区：下一次提交的准备区 本地仓库：保存提交历史的地方 未跟踪文件：Git 看到但还没管理的文件 已跟踪文件：已经被 Git 纳入版本控制的文件 .gitignore：告诉 Git 哪些未跟踪文件应该忽略 最常用的检查命令是：\ngit status 最常用的添加命令是：\ngit add 文件名 或者：\ngit add . 如果你能理解“工作区 → 暂存区 → 本地仓库”这个流程，就已经掌握了 Git 文件管理的核心。\n","section":"tutorials","type":"tutorials","date":"2026-06-14","externalUrl":null},{"title":"Git 的核心概念","permalink":"/zh/tutorials/git/core-concepts/","summary":"Git 安装配置教程和常见问题，覆盖 Windows、macOS 和 Linux 平台。","content":"在 Git 的世界里，一个文件要经历三个地方才能完成一次完美的本地存档：\n工作区 (Working Directory)：本地电脑看见的文件夹。你可以在本地文件夹里敲代码、删文件，此时的修改处于“不受保护”的状态。 暂存区 (Staging Area)：一个临时准备区（执行 git add 后的地方）。相当于你在把物品打包进存档箱，但还没按下确认保存。 本地仓库 (Local Repository)：最终的基地（执行 git commit 后的地方）。一旦进入这里，快照就正式永久写入了 Git 的历史中，再也不怕丢失。 ─── 敲代码 ───\u0026gt; ─── 准备好 ───\u0026gt; ─── 封箱存档 ───\u0026gt; [ 工作区 (Workspace) ] ──\u0026gt; [ 暂存区 (Index) ] ──\u0026gt; [ 本地仓库 (Repository) ] 远程仓库 (Remote Repository)：最终同步到云端或服务器的云端存档（如 GitHub / GitLab / Gitee）。通过 git push 上传，通过 git pull 获取更新，是多人协作的核心枢纽。\n工作区 # 工作区就是实际编辑文件的项目目录。\n例如：\nmy-project/ ├── index.html ├── style.css └── app.js 使用编辑器修改 app.js，修改首先发生在工作区。\n暂存区 # 暂存区用于保存即将提交的修改。\n执行：\ngit add app.js 表示把 app.js 当前的修改放入暂存区。\n暂存区的作用是让开发者选择哪些修改进入下一次提交。\n例如，同时修改了三个文件：\nindex.html style.css app.js 但本次只想提交 JavaScript 修改，可以执行：\ngit add app.js git commit -m \u0026#34;修复任务添加逻辑\u0026#34; 其他文件仍然保留在工作区。\n本地仓库 # 执行提交后，暂存区中的内容会进入本地仓库：\ngit commit -m \u0026#34;完成登录功能\u0026#34; 本地仓库保存在项目中的 .git 目录里。\n.git 目录包含：\n提交记录； 分支信息； 标签信息； 仓库配置； Git 对象； 暂存区数据。 警告 不要随意删除 .git 目录。\n远程仓库 # 远程仓库通常托管在：\nGitHub； GitLab； Gitee； 企业内部 Git 服务。 本地提交可以通过下面的命令推送到远程仓库：\ngit push 远程仓库中的更新可以通过下面的命令获取：\ngit pull Git 的四个区域工作流程 # Git 的基本流转过程是：\n工作区 ↓ git add 暂存区 ↓ git commit 本地仓库 ↓ git push 远程仓库 从远程仓库同步到本地：\n远程仓库 ↓ git fetch / git pull 本地仓库和工作区 文件状态 # Git 文件常见状态包括：\nUntracked # 未跟踪文件。\n文件已经存在于工作区，但 Git 还没有开始管理它。\nModified # 文件已经被 Git 跟踪，但内容发生了修改。\nStaged # 文件修改已经通过 git add 放入暂存区。\nCommitted # 文件修改已经通过 git commit 保存到本地仓库。\nCommit # Commit 是 Git 中的提交记录。\n每次提交可以理解为项目的一个历史快照。\n提交通常包含：\n唯一提交哈希； 作者信息； 提交时间； 提交说明； 文件变化； 父提交信息。 查看提交记录：\ngit log HEAD # HEAD 表示当前所在位置。\n通常情况下，HEAD 指向当前分支的最新提交。\n例如：\nHEAD → main → 最新提交 HEAD~1 表示当前提交的上一个提交。\nHEAD~2 表示当前提交向前数两个提交。\n","section":"tutorials","type":"tutorials","date":"2026-06-13","externalUrl":null},{"title":"Git 的安装与配置","permalink":"/zh/tutorials/git/installation-and-configuration/","summary":"理解 Git 的核心数据结构与工作流程：工作区 → 暂存区 → 本地仓库，并掌握文件状态与 HEAD 指针的含义。","content":"Git 是学习版本控制和代码协作时最常用的工具。无论你是管理代码项目、维护个人博客，还是使用 GitHub、GitLab、Gitee 等平台，都需要先在本地电脑安装 Git。\n本文会介绍如何在 Windows、macOS 和 Linux 上安装 Git，并完成安装后的基础配置。\n检查 Git 是否已安装 # 打开终端，执行：\ngit --version 如果 Git 已经安装，会显示类似内容：\ngit version 2.x.x 如果终端提示找不到命令，则需要先安装 Git。\n不同系统的安装方式 # Windows 推荐安装 Git for Windows macOS 可以使用系统自带工具或 Homebrew 安装 Linux 通常使用系统包管理器安装 Windows # Windows 用户推荐安装 Git for Windows。\n安装完成后，你会得到两个常用工具：\nGit Bash Git GUI 其中最常用的是 Git Bash，它提供了一个类似 Linux/macOS 终端的命令行环境。\n下载安装包 # 进入 Git for Windows 下载页面，下载最新版本的 Windows 安装程序。(有意思的是 Windows 版本 Git 安装包也是托管在GitHub)\n下载完成后，双击安装程序。\n安装时推荐选项 # 如果你是初学者，大部分选项保持默认即可。重点注意以下几个地方。\n选择默认编辑器\n安装过程中会让你选择 Git 默认编辑器。\n如果你使用 VS Code，可以选择：\nUse Visual Studio Code as Git\u0026#39;s default editor 如果不确定，也可以保持默认，后续再做更改。默认编辑器修改方法\n配置 PATH 环境变量\n推荐选择：\nGit from the command line and also from 3rd-party software 这样你可以在 PowerShell、CMD、VS Code 终端里直接使用 git 命令。\n配置换行符\nWindows 推荐选择默认选项：\nCheckout Windows-style, commit Unix-style line endings 它对应的配置是：\ngit config --global core.autocrlf true 这个选项可以减少 Windows 和 Linux/macOS 之间换行符不一致的问题。\n安装完成后检查版本： # git --version macOS # macOS 安装 Git 有两种常见方式。\n方法一：使用系统命令安装 # 打开终端，输入：\nxcode-select --install 系统会弹出安装窗口，点击“安装”。Apple 的 Command Line Tools 中包含 Git 等开发工具。\n安装完成后，执行：\ngit --version 如果能看到版本号，就说明 Git 已经安装成功。\n方法二：使用 Homebrew 安装 # 如果你已经安装了 Homebrew，也可以使用：\nbrew install git 安装完成后检查版本： # git --version 提示 如果你希望使用 Homebrew 安装的 Git，建议确认当前 Git 路径：\nwhich git Linux # Linux 一般通过系统包管理器安装 Git。\nUbuntu / Debian # sudo apt update sudo apt install git Fedora # sudo dnf install git CentOS / RHEL # sudo yum install git Arch Linux # sudo pacman -S git 安装完成后检查版本： # git --version 基础配置 # 安装完成后，建议先配置提交记录中使用的用户名和邮箱。Git 会把这两项信息写入每一次提交，用来标识该提交的作者。\n需要注意的是，这里的用户名并不是 GitHub、GitLab 的登录用户名，邮箱也不是用于登录 Git 的账号密码。它们只是提交记录中的作者信息。\n配置用户名和邮箱 # 设置用户名邮箱\n# 设置用户名 git config --global user.name \u0026#34;Evan Wu\u0026#34; # 设置邮箱 git config --global user.email \u0026#34;evanwu@example.com\u0026#34;. --global 表示该配置会应用于当前操作系统用户使用的所有 Git 仓库。\n设置默认分支名称 # 可以把新仓库的默认分支设置为 main：\ngit config --global init.defaultBranch main 之后执行：\ngit init 新仓库的初始分支通常会命名为 main。\n配置默认编辑器 # 设置 Vim：\ngit config --global core.editor \u0026#34;vim\u0026#34; 设置 Visual Studio Code：\ngit config --global core.editor \u0026#34;code --wait\u0026#34; 笔记 Git 在需要填写较长提交信息或处理合并时，可能会打开默认编辑器。\n配置作用域 # Git 的配置并不一定对所有仓库都生效。每项配置都有自己的作用范围，这个范围称为配置作用域。\n例如，你可以设置一个适用于所有个人项目的全局邮箱，也可以在某个公司项目中单独设置工作邮箱。Git 会根据配置所属的作用域，决定当前仓库最终使用哪个值。\nGit 常见的配置作用域包括系统级、全局级和仓库级。\n系统级配置 # 系统级配置对当前电脑上的所有用户和所有 Git 仓库生效。\n配置时使用：\ngit config --system 配置项 配置值 例如：\ngit config --system core.autocrlf true 全局配置 # 全局配置对当前操作系统用户的所有 Git 仓库生效。\n配置时使用 --global：\ngit config --global user.name \u0026#34;Evan Wu\u0026#34; git config --global user.email \u0026#34;evanwu@example.com\u0026#34; 用户名、邮箱、默认分支和默认编辑器通常适合设置为全局配置。\n全局配置文件通常位于：\n~/.gitconfig Windows 中一般对应：\nC:\\Users\\你的用户名\\.gitconfig 当前仓库配置 # 仓库级配置只对当前 Git 仓库生效，也称为本地配置。\n进入仓库目录后，不添加 --global：\ngit config user.name \u0026#34;Evan Work\u0026#34; git config user.email \u0026#34;evanwu@company.example\u0026#34; 这些配置通常保存在当前仓库的：\n.git/config 仓库级配置适合个人项目和工作项目需要使用不同身份信息的情况。 系统级配置通常需要管理员权限，个人用户一般很少直接修改。\n配置优先级 # 当同一个配置项同时存在于多个作用域时，范围更具体的配置通常会覆盖范围更大的配置。\n常见优先级为：\n当前仓库配置 \u0026gt; 用户全局配置 \u0026gt; 系统配置 例如，全局邮箱是：\nevanwu@example.com 而当前仓库配置了：\nevanwu@company.example 那么在当前仓库中提交时，Git 会使用公司邮箱；其他没有单独配置邮箱的仓库仍然使用全局邮箱。\n检查 Git 配置 # 配置完成后，可以通过以下命令确认设置是否生效。\n查看全部配置 # # 全局配置 git config --list # 查看当前用户的全局配置 git config --global --list 查看单个配置项 # # 查看当前生效的用户名和邮箱 git config user.name git config user.email # 如果只想查看全局值 git config --global user.name git config --global user.email 查看配置来源和作用域 # git config --list --show-origin --show-scope 该命令可以显示：\n配置项和值； 配置所属的作用域； 配置来自哪个文件； 同名配置是否在不同作用域中重复出现。 常见问题 # 找不到 git 命令 # 如果终端提示类似：\ngit: command not found 或者：\n\u0026#39;git\u0026#39; 不是内部或外部命令 通常说明 Git 没有安装成功，或者 Git 没有加入系统环境变量。\nWindows 用户可以重新安装 Git，并确认安装时选择了：\nGit from the command line and also from 3rd-party software macOS 和 Linux 用户可以重新执行对应系统的安装命令。\n出现 Author identity unknown # 完整提示通常类似：\nAuthor identity unknown Please tell me who you are. 这表示尚未配置 Git 提交所需的用户名和邮箱。\n执行：\ngit config --global user.name \u0026#34;你的名字\u0026#34; git config --global user.email \u0026#34;你的邮箱\u0026#34; 然后检查配置：\ngit config --global user.name git config --global user.email 配置完成后，重新执行提交命令即可。\n修改全局邮箱后仍使用旧邮箱 # 当前仓库可能设置了本地邮箱，而本地配置会覆盖全局配置。\n执行：\ngit config --list --show-origin --show-scope 如果看到：\nglobal file:/Users/evan/.gitconfig user.email=personal@example.com local file:.git/config user.email=work@example.com 说明当前仓库使用的是本地邮箱：\nwork@example.com 可以在仓库目录中修改：\ngit config user.email \u0026#34;new@example.com\u0026#34; 或者删除当前仓库的邮箱配置，使其重新使用全局邮箱：\ngit config --unset user.email Windows 应该使用哪个终端 # Windows 上推荐初学者使用 Git Bash 或 VS Code 终端。\nGit Bash 对 Git 命令更友好，也更接近 Linux/macOS 的命令行环境。\n如果你已经熟悉 PowerShell，也可以继续使用 PowerShell。只要能正常执行：\ngit --version 就没有问题。\nWindows 出现换行符警告 # Windows 用户可能看到：\nLF will be replaced by CRLF 或者：\nCRLF will be replaced by LF 这是 Git 在处理 Windows 的 CRLF 和 Linux、macOS 的 LF 换行符时给出的提示，通常不代表提交失败。\nWindows 常见配置是：\ngit config --global core.autocrlf true macOS 和 Linux 通常可以使用：\ngit config --global core.autocrlf input 团队项目应优先遵循项目已有的 .gitattributes 配置，不建议仅为了消除提示而随意修改换行符策略。\n用户名和邮箱配置错误怎么办 # 重新执行同一个配置命令即可覆盖旧值：\ngit config --global user.name \u0026#34;新的用户名\u0026#34; git config --global user.email \u0026#34;new@example.com\u0026#34; 删除某项全局配置：\ngit config --global --unset user.name git config --global --unset user.email 删除当前仓库中的配置：\ngit config --unset user.name git config --unset user.email 操作完成后，可以再次检查：\ngit config --list --show-origin --show-scope 确认旧配置是否已经移除\n","section":"tutorials","type":"tutorials","date":"2026-06-12","externalUrl":null},{"title":"Git、GitHub、GitLab 有什么区别","permalink":"/zh/tutorials/git/git-vs-github-vs-gitlab/","summary":"Git、GitHub 和 GitLab 经常同时出现，但它们并不是同一个概念\nGit # Git 是一款免费的、开源的分布式版本控制系统，最初由 Linux 操作系统创始人 林纳斯·托瓦兹 (Linus Torvalds) 于 2005 为了开发 Linux 核心所设计。\n","content":"Git、GitHub 和 GitLab 经常同时出现，但它们并不是同一个概念\nGit # Git 是一款免费的、开源的分布式版本控制系统，最初由 Linux 操作系统创始人 林纳斯·托瓦兹 (Linus Torvalds) 于 2005 为了开发 Linux 核心所设计。\n它安装在开发者的计算机中，通过命令行或图形化客户端运行。\n常见 Git 命令包括：\ngit init git add git commit git branch git merge git push git pull 笔记 Git 本身不要求必须连接互联网，也不依赖 GitHub 或 GitLab。\nGitHub # GitHub 是一个基于 Git 的代码托管和协作平台。该平台于2018年被微软以75亿美元正式收购，在被收购七年后的2025年，GitHub正式结束了独立运营状态，全面并入微软新成立的CoreAI工程集团，成为微软AI时代的关键一环。\n它主要提供：\n远程 Git 仓库 Pull Request Issue Actions 自动化 项目管理 代码评审 开源项目托管 团队权限管理 GitHub 可以理解为一个提供 Git 仓库存储和协作功能的平台。\nGitLab # GitLab 同样是一个基于 Git 的代码托管和研发协作平台。与主要面向个人开发者和开源项目的 GitHub 不同，GitLab 更偏向于完整的 DevOps 生命周期，并且支持企业自建私有化部署。\n它通常提供：\n远程 Git 仓库 Merge Request Issue CI/CD 代码评审 权限控制 项目管理 私有化部署 很多企业会把 GitLab 部署在公司内部服务器中，用于管理内部代码。\n三者的关系 # Git：版本控制工具 GitHub：提供 Git 仓库托管和协作服务的平台 GitLab：提供 Git 仓库托管和研发流程管理的平台\nGit 是基础工具，GitHub 和 GitLab 是建立在 Git 之上的平台。\nGitHub 与 GitLab 常见术语区别 # GitHub 常用：\nPull Request GitLab 常用：\nMerge Request 两者本质相似，都是申请把一个分支的代码合并到另一个分支。\n例如：\nfeature/new ↓ main 开发者完成相应的功能开发后，可以创建 Pull Request 或 Merge Request，请求团队成员进行代码评审并合并。\n","section":"tutorials","type":"tutorials","date":"2026-06-11","externalUrl":null},{"title":"Newsletter","permalink":"/zh/newsletter/","summary":"一个关于 AI、技术实践、效率工具、个人项目和长期学习的个人 Newsletter。","content":"我会在这里分享关于 AI、技术实践、效率工具、个人项目和长期学习 的内容。\n这个 Newsletter 不会追求高频更新，而是更偏向于整理真正值得保存、复盘和反复使用的内容。\n收到下一篇更新 订阅后，你会收到关于 AI 工具、技术实践、效率系统和项目复盘的精选内容。 你可以随时取消订阅 你会收到什么？ # 技术实践 # 关于 Git、Hugo、Cloudflare Pages、静态网站、自动化工具和开发流程的实践记录。\nAI 与工具 # 我实际使用过的 AI 工具、提示词方法、效率工作流和使用体验。\n学习笔记 # 关于编程、写作、项目管理、信息整理和长期学习的阶段性总结。\n项目复盘 # 个人项目、网站建设、内容创作和工具选择过程中的经验记录。\n适合谁订阅？ # 如果你对下面这些内容感兴趣，这个 Newsletter 可能适合你：\n想系统学习 Git、Hugo、部署和个人网站建设 想了解 AI 工具如何真正用于学习和工作 想建立自己的效率系统和长期学习流程 想关注 EVANSAMA 的文章更新和项目进展 更新频率 # 目前暂定为 不定期更新。\n我不会为了发送而发送。只有当内容值得整理成一封邮件时，才会发布。\n隐私说明 # 你的邮箱只会用于接收 EVANSAMA Newsletter，不会被出售、公开或用于无关用途。\n你可以随时取消订阅。\n","section":"","type":"page","date":"2026-06-10","externalUrl":null},{"title":"Git 入门到实操：新手从 0 到会用提交、分支、回退和远程仓库","permalink":"/zh/tutorials/git/","summary":"Git 使用指南合集，包含安装、配置、分支管理、合并、变基等内容。","content":"Git 是现代软件开发中最重要的版本控制工具之一。它可以记录代码变化、保存历史版本，并帮助开发者安全地进行多人协作。\n在 AI 编程时代，代码生成越来越容易，而判断、筛选和管理代码变更，正在成为更重要的能力。Git 可以帮助你检查改动、隔离实验，并在出现问题时恢复到稳定状态。\n本系列将从基础概念开始，逐步介绍 Git 的安装与配置、工作区与暂存区、提交记录、分支管理和远程协作。\n学习路线 # ▼ Git Mastery - 系列专栏 ✦ 1：什么是 Git ✦ 2：Git、GitHub、GitLab 有什么区别 ✦ 3：Git 的安装与配置 ✦ 4：Git 的核心概念 ✦ 5：Git 创建仓库 ✦ 6：Git 基础工作流 ✦ 7：Git 查看仓库状态与提交历史 ✦ 8：Git 撤销与回退 ✦ 9：Git 分支管理 ✦ 10：Git 合并与冲突解决 ✦ 11：Git 远程仓库 建议的学习方式 # 建议先理解 Git 的核心概念，再学习具体命令。不要一开始就死记命令，而是先弄清楚工作区、暂存区、本地仓库和远程仓库之间的关系。\n学习顺序可以按下面这个路径：\n理解 Git 是什么 ↓ 安装和基础配置 ↓ 理解 Git 管理哪些文件 ↓ 学习提交、分支、合并 ↓ 学习远程仓库同步 ↓ 处理冲突和回滚问题 ","section":"tutorials","type":"tutorials","date":"2026-06-07","externalUrl":null},{"title":"什么是 Git","permalink":"/zh/tutorials/git/what-is-git/","summary":"告别原始人式版本控制 # 在软件开发过程中，我们经常需要修改代码、保存历史版本、多人协作以及处理不同功能之间的合并问题。\n","content":" 告别原始人式版本控制 # 在软件开发过程中，我们经常需要修改代码、保存历史版本、多人协作以及处理不同功能之间的合并问题。\n如果没有版本控制工具，项目目录可能会变成这样：\nproject_v1.0 project_v2.0_最终版 project_v2.1_最终绝对不改版 project_v3.0_再改我是狗 这种方式不仅占地方，而且一旦代码崩了，根本不知道是谁在什么时候改了哪一行。而 Git，就是为了彻底终结这个混乱局面而诞生的分布式版本控制系统。\n分布式版本控制系统用于记录文件内容的变化，让开发者能够查看历史版本、比较修改内容、恢复文件状态，并进行多人协作。\nGit 最常用于管理源代码，但它也可以管理：\n技术文档； 配置文件； Markdown 笔记； 脚本文件； 静态网站； 任何适合文本版本管理的项目。 什么是版本控制 # 假设一个项目经历了以下开发过程：\n创建项目 ↓ 完成功能 A ↓ 接入接口 B ↓ 修复异常 C ↓ 增加功能 D 每完成一个阶段，都可以使用 Git 保存一个版本。\n这些版本被称为提交，也就是 Commit。\n每次提交都会记录：\n修改了哪些文件； 增加了哪些内容； 删除了哪些内容； 谁进行了修改； 什么时间进行了修改； 本次修改的说明。 因此，一个 Git 仓库不仅保存当前代码，还保存完整的修改历史。\n笔记 更厉害的是，Git 支持“多分支并行开发”。你可以拉出一个分支去开发测试新功能，如果不喜欢，直接删掉分支读档；如果觉得很棒，就把这条时间线合并回主线。\nGit 的主要功能 # 记录版本历史 # 开发者可以把当前修改保存为一次提交：\ngit commit -m \u0026#34;完成功能 A\u0026#34; 查看代码变化 # 可以查看文件具体修改了什么：\ngit diff 恢复历史版本 # 如果新代码出现问题，可以恢复到之前的状态：\ngit restore 文件名 也可以撤销某次提交：\ngit revert 提交哈希 使用分支并行开发 # 不同功能可以在不同分支中开发：\n# 创建一个名为 feature/login 的新分支，并立即切换到这个分支。 git switch -c feature/login 登录功能不会直接影响主分支中的正式代码。\n支持多人协作 # 团队成员可以从远程仓库获取代码：\ngit pull 也可以把本地提交上传到远程仓库：\ngit push 什么是分布式版本控制系统（分散式版本控制系统） # 传统的集中式版本控制系统通常依赖一个中央服务器。\n如果中央服务器不可用，开发者可能无法查看完整历史或创建版本。\nGit 是分布式版本控制系统。每个开发者克隆仓库后，本地通常都会保存：\n完整的项目文件； 完整的提交历史； 分支信息； 标签信息； 仓库对象。 即使暂时没有网络，也可以在本地执行：\ngit status # 查看工作区和暂存区的当前状态 git add # 将修改添加到暂存区 git commit # 将暂存区内容提交到本地仓库 git log # 查看提交历史 git branch # 查看或管理分支 只有与远程仓库同步时才需要网络。\n更详细的分布式版本控制与集中式版本控制系统的对比可以参考中文维基 分散式版本控制\n","section":"tutorials","type":"tutorials","date":"2026-06-05","externalUrl":null},{"title":"Git 强制同步覆盖本地文件","permalink":"/zh/notes/git-force-sync/","summary":"整理 Git 强制同步远程分支、彻底放弃本地修改的几种常见场景和核心命令。","content":"由于工作生活中使用两台电脑（一台家用PC + 一台随时写作的Macbook）并且本博客的大部分工作都是在PC上面完成的。\n今天在Macbook上写博客写完文章发现机器上的文件夹一塌糊涂。担心产生冲突遂打算放弃Macbook上所有本地文件（包括未提交和已提交的），完全同步为远程状态（当前托管在Github），以下是本次用到的 Git 命令：\n# 1. 下载远程仓库的最新修改和分支信息（但不自动合并） git fetch --all # 2. 把当前分支强制重置到对应远程分支 # 注意：将 main 替换为你当前使用的分支名(如 master or dev) git reset --hard origin/main # 3. (可选)清理本地没有被 Git 追踪的零碎文件或者文件夹 git clean -fd git rest -- hard 操作不可逆。执行后本地所有未提交代码，以及本地的 commit 都会彻底消失，记得注意备份。\n上面是强行使用整个远程仓库覆盖整个本地仓库的方法，下面是一些精细化拓展操作方式：\n只想要远程的某个“特定文件” 如果整体代码没问题，只是把某一个或几个重要文件改乱了，想单独恢复这几个文件，没必要重置整个分支：\ngit checkout origin/\u0026lt;分支名\u0026gt; -- \u0026lt;文件路径/文件名\u0026gt; 强推（Push）反向同步——用本地强制覆盖远程 有时候情况相反，本地的代码才是对的，远程由于历史冲突提交不上去。想让远程听你的，可以使用强制推送：\ngit push origin \u0026lt;分支名\u0026gt; --force # 或者更安全的做法（如果远程在你上次拉取后有新提交，会拒绝执行，避免误杀队友代码） git push origin \u0026lt;分支名\u0026gt; --force-with-lease 多人协作时，执行 git push \u0026ndash;force 前，务必通知其他合作者，否则队友下次 git pull 可能会遭遇代码人生滑铁卢。\n","section":"notes","type":"notes","date":"2026-06-02","externalUrl":null},{"title":"笔记","permalink":"/zh/notes/","summary":"","content":"","section":"notes","type":"notes","date":"2026-06-02","externalUrl":null},{"title":"Python range() 函数基础语法与三种调用方式","permalink":"/zh/notes/python-range-basic/","summary":"range() 函数的核心特点是 左闭右开（包含起点，不包含终点）。\n以下是三种常见的调用方式：\n1. 单独参数： range(stop) # 只指定结束值，默认从 0 开始，步长为 1 。\n","content":"range() 函数的核心特点是 左闭右开（包含起点，不包含终点）。\n以下是三种常见的调用方式：\n1. 单独参数： range(stop) # 只指定结束值，默认从 0 开始，步长为 1 。\n# 生成 0 到 4 的序列 for i in range(5) print(i, end=\u0026#34; \u0026#34;) # 输出：0 1 2 3 4 2. 双参数：range(start, stop) # 指定起点和终点，默认步长为 1 。\n# 生成 2 到 5 的序列 for i in range(2, 6): print(i, end=\u0026#34; \u0026#34;) #输出：2 3 4 5 3. 三参数：range(start, stop, step) # 指定起点、终点和步长（step）。步长可以是正数，也可以是负数。\n# 示例 1：生成 1 到 10 之间的奇数（步长为 2） for i in range(1, 10, 2): print(i, end=\u0026#34; \u0026#34;) # 输出：1 3 5 7 9 # 示例 2：倒序输出（步长为负数） for i in range(5, 0, -1) print(i, end=\u0026#34; \u0026#34;) # 输出：5 4 3 2 1 笔记 需要注意的几个点\n“左闭右开” （包含起点，不包含终点） end=\u0026quot; \u0026quot; 的作用是改变 print() 函数输出结束时的默认行为，让多次输出的结果保持在同一行，并用空格分隔。 ","section":"notes","type":"notes","date":"2026-05-31","externalUrl":null},{"title":"使用 Git 和 Cloudflare 搭建自动化博客发布流","permalink":"/zh/notes/how-i-use-git/","summary":"Git 是一个“版本控制系统”。它可以追踪对代码库所做的每一个更改，并帮助保持多个开发者对同一代码库版本的同步和更新。","content":"Git 是一个“版本控制系统”。它可以追踪对代码库所做的每一个更改，并帮助保持多个开发者对同一代码库版本的同步和更新。 意外地做了一个破坏生产环境的更改？你可以用 Git 进行还原。你和你的同事对同一个文件都做了修改？Git 通常可以自动为你合并它们，或者至少可以明确告知你更改冲突的地方。\nGitHub 是一个 Git 服务器。他是一个远程仓库，你可以把 Git 中的代码托管存储在这里。它还提供问题跟踪功能，以及一个不错的前端用于管理以 pull requests 形式提交到代码库的变更。但 GitHub 并不是唯一的 Git 服务器；还有 GitLab、Gitea、BitBucket、Gogs……这些都有自己的优缺点。GitHub 是日常使用中最常见的，但它绝对不是唯一的，你也不应仅仅围绕某一个 Git 服务器来学习 Git。\n我为什么需要Git？ # 我的博客是使用 Hugo 托管在 GitHub 上面的，当我更新博客的时候，我需要把我本地代码 git push 到 GitHub ，然后Cloudflare Pages会自动帮我编译生成网页\n发布流程是这样\n本地创作： 在电脑上用 Markdown 写文章，运行 hugo server 在本地预览排版。 打包存档（git commit）： 用 Git 给这次的更新拍个“快照”，记录我今天写了啥。 触动机关（git push）： 把代码推送到 GitHub 仓库。 自动接力（Cloudflare Pages）： Cloudflare 就像一个全天候待命的机器人，它盯着我的 GitHub。一旦发现我 Push 了新代码，它就会自动在云端下载源码、运行 Hugo 编译，然后把新网页发布到公网上。 整个过程中，我不需要手动碰任何 HTML 网页文件，只需要专注于“写字”本身。\nGit 基础命令 # git ini 在当前文件夹下初始化一个全新的 Git 本地仓库。 git clone \u0026lt;远程仓库网址\u0026gt; 克隆一个新的远程仓库到本地 git status 查看当前工作区状态（目录修改、跟踪状态） git add \u0026lt;文件名\u0026gt; 或 git add . 把工作区的修改提交到暂存区（Staging Area）。 git commit -m \u0026quot;你的提交信息\u0026quot; 把暂存区的内容正式提交到本地仓库（Local Repository）。 git push origin \u0026lt;分支名\u0026gt; 把本地仓库的提交推送到远程仓库（不同分支可以提交不同代码用于创新实验）。 git pull 从远程仓库拉取最新的代码并自动合并到本地。(在本地已有 Git 仓库执行) 基础命令之外你需要知道的 # 如果你不想某个文件或文件夹加加入 Git 仓库，你需要在项目根目录的 .gitignore 文件内添加该文件路径，这样 Git 就会略该改目录。 Git 不喜欢“套娃”。任何使用git clone下载下来的文件夹内部都自带一个 .git 文件夹。当文件夹包含 .git 就意味着该文件我本身就是一个独立的 Git 仓库。Git 只会管理自己的地盘，不会插手其他独立仓库。 解决办法：使用 Git 子模块，不要用 git clone ，改用 git submodule add 。他会自动创建一个 .gitmodules 文件用于记录主项目中引入的外部子仓库的本地路径和远程仓库地址，从而允许在一个 Git 仓库中嵌套和管理另一个独立的 Git 仓库。 ","section":"notes","type":"notes","date":"2026-05-25","externalUrl":null},{"title":"关于我","permalink":"/zh/about/","summary":"你好，我是Evan\n我正围绕技术、写作、金融和全球商业构建我的人生 —— 一切从零开始，并公开记录这一过程。\n本站既是我的“数字花园”，也是一项长期项目。\n","content":"你好，我是Evan\n我正围绕技术、写作、金融和全球商业构建我的人生 —— 一切从零开始，并公开记录这一过程。\n本站既是我的“数字花园”，也是一项长期项目。\n我的写作内容涵盖：\nAI 与编程 工具构建与自动化 金融与财富积累 在线商业与全球市场 公开学习（Learning in public） 我的目标不仅仅是成为一名更优秀的开发者，更是要建立“杠杆效应”： 通过代码、内容、系统以及长期主义的思维方式来实现。\n本站存在的意义：\n记录我的所学所得 通过写作理清思绪 创造有价值的事物 结识志同道合的同行者 我相信，未来属于那些具备以下能力的人：\n持续学习 高效运用技术 清晰表达思想 独立创造构建 目前，我正专注于：\nAI 工具与自动化 Web 开发 坚持写作输出 构建以“在线”为先导的职业生涯 本网站的内容与形态将随时间不断演进。\n感谢你的阅读。\n","section":"","type":"page","date":"2026-05-20","externalUrl":null},{"title":"我的学习方向 Roadmaps","permalink":"/zh/notes/learning-roadmaps/","summary":"我以前经常会有一种感觉：想学的东西很多，但真正留下来的东西很少。\n今天看一点编程，明天看一点 AI 工具，后天又去查几个 Linux 运维方法。每一次好像都学到了一点东西，但过一段时间回头看，又发现很多内容没有被整理，也没有形成自己的理解。\n","content":"我以前经常会有一种感觉：想学的东西很多，但真正留下来的东西很少。\n今天看一点编程，明天看一点 AI 工具，后天又去查几个 Linux 运维方法。每一次好像都学到了一点东西，但过一段时间回头看，又发现很多内容没有被整理，也没有形成自己的理解。\n所以这个博客对我来说，不只是一个写文章的地方，更像是一个长期学习的记录系统。\n它不是为了证明我已经懂了什么，而是为了记录我从不懂到慢慢理解的过程。\n编程 # 从最基础的 Web开始，也就是 HTML、CSS 和 JavaScript。它们离网页最近，也最容易通过实际项目看到结果。\n之后，我会想继续学习 Python。毕竟那句老话说得好：人生苦短，我用 Python。\n我不想一开始就追求复杂框架，而是先搞清楚一些基础的代码运作原理：\n一个网页是怎么被组织起来的？ HTML 负责什么？ CSS 怎么控制页面样式？ JavaScript 为什么能让页面动起来？ Python 可以用来做些什么？ 一个网站从本地文件到真正上线，中间经历了什么？ 这个博客本身就是我的第一个长期练习项目。\n我会把搭建、配置、修改主题、部署、踩坑和优化过程都记录下来。\nAI 和工具 # 记录实际学习和工作中 AI 的用法与技巧。\n比如：\n如何用 AI 帮我理解一段代码 如何判断 AI 给出的答案是否可靠 哪些工具真的提高效率，哪些只是华而不实 我希望自己不是被工具牵着走，而是慢慢建立一套适合自己的工作流，让 AI 实实在在地提升工作效率。\n英语 # 我不会把这个栏目写成传统英语教程，因为我自己也还在学习过程中。\n我更想记录那些真实遇到、真实搞混、真实查过的问题。\n这些内容可能很小，但它们对我来说很实用。\n如果长期积累下来，也许会变成一套属于自己的英语学习笔记。\n英语不仅是沟通工具，更是获取一手信息的渠道。\n总而言之 # 当下我的第一版 Roadmap 大概是：\n编程：从 HTML / CSS / JavaScript / Python 和个人博客项目开始 AI 工具：记录真实使用场景和工作流 英语：整理日常遇到的表达、单词和句子 我不知道这个博客最后会变成什么样，也不确定自己能坚持多久。\n但至少现在，我想先把它当成一个长期实验。\n慢慢写，慢慢学，慢慢把零散的东西整理成自己的系统。\n","section":"notes","type":"notes","date":"2026-05-19","externalUrl":null},{"title":"项目","permalink":"/zh/projects/","summary":"","content":"","section":"projects","type":"projects","date":"0001-01-01","externalUrl":null}]