From 827ccf0ed1adbf4b3aaca1af41395d811b2befff Mon Sep 17 00:00:00 2001 From: Qiyuanqiii <2297740147@qq.com> Date: Fri, 4 Sep 2026 03:13:48 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=AE=8C=E5=96=84=20Git=20=E5=85=A5?= =?UTF-8?q?=E9=97=A8=E4=B8=8E=E8=B4=A1=E7=8C=AE=E5=8D=8F=E4=BD=9C=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/theme/custom.css | 45 +++ docs/about/contribute.md | 581 ++++++++----------------------- docs/development/git-basics.md | 323 ++++++++++++++++- docs/development/index.md | 4 +- 4 files changed, 505 insertions(+), 448 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 4ef23fa..2d50974 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -1176,6 +1176,51 @@ padding: 12px; } +@media (max-width: 640px) { + .content-meta { + margin-bottom: 20px; + } + + .content-meta__header { + gap: 6px; + padding: 8px 10px; + } + + .content-meta__badge { + font-size: 12px; + padding: 1px 7px; + } + + .content-meta__body { + gap: 8px 12px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + padding: 10px; + } + + .content-meta__item { + font-size: 13px; + line-height: 1.55; + min-width: 0; + overflow-wrap: anywhere; + } + + .content-meta__item strong { + display: inline; + font-size: 12px; + margin-right: 5px; + } + + .content-meta__item--sources { + grid-column: 1 / -1; + } + + .content-meta__warning { + font-size: 13px; + line-height: 1.55; + padding: 8px 10px; + } +} + .material-categories { display: grid; gap: 28px; diff --git a/docs/about/contribute.md b/docs/about/contribute.md index 5b3b730..a36b286 100644 --- a/docs/about/contribute.md +++ b/docs/about/contribute.md @@ -8,480 +8,230 @@ content_type: verified status: active maintainers: - SCSWiki 维护组 -sources: [] +sources: + - name: GitHub Docs:使用 Fork + url: https://docs.github.com/en/pull-requests/how-tos/work-with-forks + - name: GitHub Docs:连接到 GitHub + url: https://docs.github.com/en/get-started/git-basics/set-up-git + - name: GitHub Docs:创建 Pull Request + url: https://docs.github.com/en/pull-requests/how-tos/create-pull-requests/creating-a-pull-request --- # 如何贡献 -你可以通过 Issue 提交内容错误、过期反馈或新内容建议。熟悉 Git 的贡献者可以 Fork 仓库后提交 Pull Request。 +你可以通过 Issue 提交内容错误、过期反馈或新内容建议,也可以通过 Pull Request(PR)直接完善页面。第一次使用 Git 时,建议先阅读 [Git 入门](/development/git-basics)。 -> 下面展示如何提交 Pull Request +:::: tip 选择合适的方式 -## 一、登录Github +- 只想报告问题、暂时不方便修改:提交 Issue,写清页面地址、问题和可核验来源。 +- 已经准备好修改:Fork 仓库,在独立分支完成改动并创建 PR。 +- 涉及学校政策、费用、时间或个人信息:先确认公开来源和时效,不确定时宁可标记待核验。 -Github官网:[官网链接](https://github.com/) +:::: -如果没有账号就注册一个,然后保持你浏览器的Github登录状态。 +## 一、登录 GitHub 并创建 Fork -然后进入项目的首页:[项目链接](https://github.com/pppolf/SCSWiki),你会看到如下页面 +登录 [GitHub](https://github.com/),然后进入 [SCSWiki 官方仓库](https://github.com/CWNU-Open-Source-Community/SCSWiki)。 -![image-20260627152708303](/images/image-20260627152708303.png) +点击页面右上角的 **Fork**,再选择 **Create fork**,在自己的 GitHub 账号下创建一份仓库副本。创建完成后请检查: -然后我们点击 **Fork** 把这个代码克隆到本地。 +- 页面顶部的仓库所有者是你的 GitHub 用户名; +- 页面显示它 Fork 自 `CWNU-Open-Source-Community/SCSWiki`。 -点击后直接点击Creat fork +## 二、安装工具并运行项目 -![image-20260627152858372](/images/image-20260627152858372.png) +### 1. 准备 Git、Node.js 和编辑器 -然后会自动跳转到你仓库的页面,现在你看到的就是Fork之后的仓库了。 +本项目需要: -![image-20260627153009391](/images/image-20260627153009391.png) +- Git,安装和首次设置见 [Git 入门](/development/git-basics); +- Node.js `>=20.11.0`,可从 [Node.js 官方下载页](https://nodejs.org/en/download) 安装; +- 一个文本编辑器,下面以 [VS Code](https://code.visualstudio.com/Download) 为例,也可以使用其他编辑器。 -## 二、把项目跑起来 +安装 Node.js 后请重新打开终端;如果使用 VS Code,也请重启 VS Code,再检查版本: -首先需要我们在本地找一个位置来放置我们的项目,然后去clone这个fork项目。 - -![image-20260627153137419](/images/image-20260627153137419.png) - -这里我使用命令行操作,打开终端,cd到你想保存的位置,随后输入 - -```sh -git clone https://github.com/你的GitHub用户名/SCSWiki.git +```bash +git --version +node --version ``` -![image-20260627153516041](/images/image-20260627153516041.png) - -然后我们使用vscode打开这个项目,这个应该都会吧。!打开之后你会看到如下界面 - -![image-20260627153742216](/images/image-20260627153742216.png) - -然后我们进行下一步安装依赖,首先你需要保证你有node环境 Node.js `>=20.11.0`,如果不知道怎么安装node,可以问AI安装。。。 - -打开自带的终端。 - -![image-20260627153921777](/images/image-20260627153921777.png) - -输入 `node -v` 查看当前的node环境,符合条件即可,接下来就是安装依赖了,输入 `npm install -g pnpm` 我们使用pnpm管理依赖,然后输入 `pnpm install` 安装项目依赖,等几分钟就安装完了! - -安装完成你会看到 - -![image-20260627155331302](/images/image-20260627155331302.png) +### 2. 克隆自己的 Fork -然后把项目启动起来,运行命令 `npm run dev`,然后打开网址 `http://localhost:5173` 你就会看到这个项目了。 +先选择一个不属于其他 Git 仓库的目录,用来保存项目。 -![image-20260627155440890](/images/image-20260627155440890.png) +下面命令中的 `YOUR-USERNAME` 必须替换为你的 GitHub 用户名,不能原样复制: -## 三、配置github信息 - -回到 vscode 中查看当前分支和修改: - -```sh -git status +```bash +git clone https://github.com/YOUR-USERNAME/SCSWiki.git +cd SCSWiki ``` -查看远程仓库: +克隆完成后,使用 VS Code 打开 `SCSWiki` 目录。 -```sh -git remote -v -``` +### 3. 安装依赖 -正常情况下应该至少有: +仓库在 `package.json` 中指定 pnpm `9.15.4`。优先通过 Corepack 启用该版本,再安装依赖: -```sh -origin https://github.com/你的用户名/SCSWiki.git +```bash +corepack enable +corepack prepare pnpm@9.15.4 --activate +pnpm --version +pnpm install ``` -其中: - -- `origin`:你自己的 Fork; -- `upstream`:原始项目仓库。 +如果终端提示找不到 `corepack`,可以改用下面的固定版本安装方式,然后再运行 `pnpm install`: -如果还没有 `upstream`,添加它: - -```sh -git remote add upstream https://github.com/pppolf/SCSWiki.git +```bash +npm install --global pnpm@9.15.4 ``` -再次确认: +两种 pnpm 安装方式选择一种即可。若全局安装提示权限不足,请优先使用 Corepack 或参考 pnpm 官方安装说明,不要切换到 `root` 用户运行项目命令。 -```sh -git remote -v -``` +### 4. 启动本地预览 -应该类似: - -```sh -origin https://github.com/你的用户名/SCSWiki.git (fetch) -origin https://github.com/你的用户名/SCSWiki.git (push) -upstream https://github.com/pppolf/SCSWiki.git (fetch) -upstream https://github.com/pppolf/SCSWiki.git (push) +```bash +pnpm dev ``` -注意:你通常只向 `origin` 推送,不向 `upstream` 推送。 - -同步原项目的最新代码,在开始修改前,先确保本地代码是最新的。 - -切换到主分支: - -```sh -git switch main -``` - -从原项目获取最新提交: - -```sh -git fetch upstream -``` - -把上游最新代码合并到本地主分支: - -```sh -git merge upstream/main -``` - -在同步之前我们要设置SSH才可以,打开终端 - -以当前 `root` 用户执行: - -```sh -ssh-keygen -t ed25519 -C "你的GitHub邮箱" -``` - -出现: - -```sh -Enter file in which to save the key -``` - -直接回车,默认保存到: - -```sh -/root/.ssh/id_ed25519 -``` +打开终端实际显示的本地地址,通常是 `http://localhost:5173`;如果端口被占用,开发服务器会使用其他端口。 -出现密码短语提示时,直接回车两次不设置。看到这个就行了 +开发服务器会持续占用当前终端。预览期间请保持它运行,并在 VS Code 中新建第二个终端执行后续命令;不再需要预览时,可回到该终端按 `Ctrl+C` 停止。 -![image-20260627163744408](/images/image-20260627163744408.png) +## 三、配置远程仓库并同步主分支 -查看公钥 +查看当前远程仓库: -```sh -cat ~/.ssh/id_ed25519.pub -``` - -会输出类似: - -```sh -ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... xxx@xxx.com -``` - -复制完整的一整行。进入 GitHub 网页: - -```text -右上角头像 -→ Settings -→ SSH and GPG keys -→ New SSH key -``` - -填写: - -```yml -Title: SCSWiki -Key type: Authentication Key -Key: 粘贴刚才的完整公钥 -``` - -点击: - -```text -Add SSH key -``` - -回到虚拟机测试连接: - -```sh -ssh -T git@github.com -``` - -第一次可能出现: - -```sh -Are you sure you want to continue connecting (yes/no/[fingerprint])? -``` - -输入: - -```sh -yes -``` - -成功时会看到类似: - -```sh -Hi github账号! You've successfully authenticated, but GitHub does not provide shell access. +```bash +git remote -v ``` -把仓库地址从 HTTPS 改成 SSH,当前你当前的地址是: +刚克隆自己的 Fork 时,输出通常类似: ```text -https://github.com/你的github账号/SCSWiki.git +origin https://github.com/YOUR-USERNAME/SCSWiki.git (fetch) +origin https://github.com/YOUR-USERNAME/SCSWiki.git (push) ``` -改为: +`origin` 指向你自己的 Fork。再添加官方仓库为 `upstream`,这一步只需执行一次: -```sh -git remote set-url origin git@github.com:你的github账号/SCSWiki.git +```bash +git remote add upstream https://github.com/CWNU-Open-Source-Community/SCSWiki.git +git remote -v ``` -检查: +如果出现 `remote upstream already exists`,不要重复添加,先检查现有地址是否正确。 -```sh -git remote -v -``` +### GitHub 认证方式 -应该显示: +同步公开仓库不需要先配置 SSH。向自己的 Fork 推送时,可以使用 HTTPS,也可以自行选择 SSH: -```sh -origin git@github.com:你的github账号/SCSWiki.git (fetch) -origin git@github.com:你的github账号/SCSWiki.git (push) -``` +- 使用 HTTPS 时,GitHub 不接受账户密码进行 Git 操作。首次推送通常会通过浏览器、Git Credential Manager 或令牌完成认证。 +- 使用 SSH 时,请按照 [GitHub 官方说明](https://docs.github.com/en/authentication/connecting-to-github-with-ssh) 生成并添加密钥,不要用 `sudo` 或切换到 `root` 用户操作。 +- 不要把密码、访问令牌或私钥写进远程地址、源码、截图或聊天记录;共用电脑上不要长期保存凭据。 -然后再次推送: +每次开始新任务前,同步官方 `main`: -```sh +```bash +git switch main +git fetch upstream +git merge --ff-only upstream/main git push origin main ``` -## 四、为本次修改创建新分支 +`git fetch` 只获取远程状态;`--ff-only` 可以避免同步时意外产生合并提交。若合并失败,先运行 `git status` 查看原因,不要直接强制推送。 + +## 四、创建任务分支并完成修改 -不要直接在 `main` 分支修改。 +先确认要处理的 Issue、页面错误或内容任务,不要直接把教程中的演示文字提交到仓库。下面假设任务是更新已有的校园网络说明。 -例如,你准备添加一篇校园网教程: +创建并检查任务分支: -```sh -git switch -c docs/add-campus-network-guide +```bash +git switch -c docs/update-campus-network +git branch --show-current ``` -分支名称建议使用: +分支名应简短描述本次任务,例如: ```text -docs/xxx 文档修改 -fix/xxx 修复错误 -feat/xxx 新功能 -refactor/xxx 重构 -chore/xxx 工程配置 +docs/update-campus-network 文档修改 +fix/broken-campus-link 修复错误 +feat/new-search-filter 新功能 +refactor/sidebar-data 重构 +chore/update-tooling 工程配置 ``` -查看当前分支: +然后在编辑器中打开本次任务对应的真实文件,按照 Issue 或核验结果修改并保存。本例对应 `docs/campus/network.md`。 -```sh -git branch -``` +如果要新增页面,还应: -带 `*` 的是当前分支: +1. 先确认目标目录中没有同名文件或相同 URL; +2. 参考同目录页面补全 Front Matter、``、来源和核验状态; +3. 按项目现有结构更新 `docs/.vitepress/sidebar.ts`; +4. 不编造学校政策,不写入账号、联系方式等个人敏感信息; +5. 参考仓库根目录的 [内容贡献规范](https://github.com/CWNU-Open-Source-Community/SCSWiki/blob/main/CONTENT_GUIDE.md)。 -```sh -* docs/add-campus-network-guide - main -``` +回到本地预览地址检查页面内容、链接和侧边栏。若示例中约定更新校园网络页,则访问 `/campus/network`。 -我们回到vscode,打开目录 `/docs/campus/` 新建一个文件名叫 `network.md` 文档可以写成 +## 五、检查、提交并推送 -```markdown ---- -title: 校园网络使用指南 -description: 介绍校园网络的基本使用方法 -category: campus -audience: - - 本科生 -content_type: experience -status: needs-review -maintainers: - - SCSWiki 维护组 -sources: [] ---- +下面仍以“已经修改并保存 `docs/campus/network.md`”为例。其他任务必须把路径和分支名替换为自己的实际内容。 - - -# 校园网络使用指南 - -> 本页面仍在核验中,请以学校最新通知为准。 - -## 使用前准备 - -请先确认已经获得学校统一身份认证账号。 - -## 注意事项 - -不要向任何人泄露账号和密码。 -``` - -请注意,在新添加了某页面,需要在 `/docs/.vitepress/sidebar.ts` 里添加对应的链接。比如现在我们是添加的 `/campus` 下的,所以我们就找对应的区域加,写上 text 和 link 就行了 - -```ts -... -'/campus/': [ - { - text: '校园生活', - items: [ - { text: '总览', link: '/campus/' }, - { text: '校园网络待核验模板', link: '/campus/network-template' }, - { text: '校园网络使用指南', link: '/campus/network'}, - ], - }, - ], -... -``` - -然后我们可以回到浏览器看是否有了,点击链接:`http://localhost:5173/campus/network` 就有了。 - -最后我们去检查一下语法什么的,运行 `pnpm check` 如果通过了就OK! - -## 五、如何提交 - -查看状态: - -```sh +```bash git status +git diff -- docs/campus/network.md +pnpm check +git add docs/campus/network.md +git diff --staged +git commit -m "docs: 更新校园网络说明" +git status +git push -u origin docs/update-campus-network ``` -添加到暂存区: - -```sh -git add . -``` - -检查暂存区内容: - -```sh -git diff --cached -``` - -这一步非常重要。它可以避免把 `.env`、临时文件、密码或无关内容提交进去。检查无误按 `q` 退出。 - -创建 Commit 提交: - -```sh -git commit -m "docs: add campus network guide" -``` - -中文也可以: - -```sh -git commit -m "docs: 添加校园网络使用指南" -``` - -推荐格式: - -```yml -类型: 简短描述 -``` - -常用类型: - -```yml -docs: 文档修改 -fix: 修复问题 -feat: 添加功能 -refactor: 重构 -test: 测试 -chore: 工程配置 -style: 格式调整 -``` - -示例: - -```sh -git commit -m "docs: add freshman registration guide" -git commit -m "fix: correct broken link in campus guide" -git commit -m "feat: add assistant entry component" -``` - -提交后查看记录: - -```sh -git log --oneline -5 -``` - -推送分支到自己的 Fork - -第一次推送当前分支: - -```sh -git push -u origin docs/add-campus-network-guide -``` - -其中: - -```sh -origin -``` - -是你自己的 Fork。 +注意: -后续再修改并提交后,只需要: +- `pnpm check` 包含类型检查、Markdown 检查、格式检查、内容校验、链接检查、测试和生产构建。 +- `git add` 后应写出本次实际修改的一个或多个文件路径;新增页面时通常还要暂存相应的侧边栏文件。 +- 不把 `git add .` 当作默认操作,避免夹带 `.env`、临时文件、密码或无关改动。 +- `git diff --staged` 展示真正会进入提交的内容,务必逐项检查;若进入分页界面,按 `q` 退出。 +- 一组改动只需执行一次 `git commit`。提交信息可使用中文或英文,重点是简短说明“做了什么”。 -```sh -git push -``` +常见提交类型: -如果命令成功,终端一般会提示: +- `docs:` 文档修改; +- `fix:` 修复问题; +- `feat:` 添加功能; +- `refactor:` 重构; +- `test:` 测试; +- `chore:` 工程配置; +- `style:` 格式调整。 -```sh -Create a pull request for 'docs/add-campus-network-guide' -``` +第一次推送使用 `git push -u origin 分支名`;同一个 PR 后续有新提交时,执行普通的 `git push` 即可。 -在 GitHub 创建 **Pull Request** +## 六、创建 Pull Request -打开你 Fork 后的 GitHub 仓库页面。 +打开自己的 GitHub Fork。推送成功后,页面通常会显示 **Compare & pull request**,点击后确认: -通常会看到一个黄色或绿色提示: - -```sh -Compare & pull request -``` - -点击它。 - -确认以下内容: - -```sh -base repository: 原始项目仓库 +```text +base repository: CWNU-Open-Source-Community/SCSWiki base branch: main - head repository: 你的 Fork -compare branch: docs/add-campus-network-guide -``` - -也就是说: - -```sh -你的分支 - ↓ 合并到 -原项目 main 分支 -``` - -PR 标题建议: - -```sh -docs: 添加校园网络使用指南 +compare branch: 本次任务分支 ``` -PR 描述可以使用: +PR 标题应直接说明改动,例如 `docs: 更新校园网络说明`。描述可以参考: ```markdown ## 修改内容 -- 新增校园网络使用指南 -- 添加页面 Front Matter -- 更新校园生活栏目侧边栏 +- 更新校园网络说明 +- 修正过期内容并补充来源 ## 修改原因 -现有 Wiki 缺少校园网络相关说明,新生难以快速找到对应信息。 +说明原页面存在的问题,以及本次修改如何解决。 ## 信息来源 @@ -492,79 +242,42 @@ PR 描述可以使用: ## 本地检查 - [x] `pnpm check` -- [x] `pnpm build` -- [x] 检查移动端页面 -- [x] 未包含个人隐私信息 -- [x] 未包含未经核验的学校政策 +- [x] 检查桌面端和移动端页面 +- [x] 未包含个人隐私或凭据信息 +- [x] 对时效性内容标明来源和核验状态 ## 截图 -如涉及页面样式,请附上截图。 +如涉及页面样式,请附上修改前后截图。 ``` -然后点击: - -```text -Create pull request -``` +只勾选自己实际完成的检查,然后点击 **Create pull request**。PR 创建后可在 SCSWiki 交流群通知维护者审核。 -> 👉👉👉**在通过了PR之后再进行以下的操作,现在可以在SCSWiki交流群通知审核了。** +收到评审意见后,继续在同一分支修改、检查、提交并推送,原 PR 会自动更新,不需要重新创建。 -## 六、PR 合并后清理分支 +## 七、PR 合并后同步与清理 -PR 合并后,先切回主分支: +确认 PR 已合并后,回到本地仓库同步主分支: -```sh +```bash git switch main -``` - -同步上游最新内容: - -```sh git fetch upstream -git merge upstream/main -``` - -推送到自己的 Fork: - -```sh +git merge --ff-only upstream/main git push origin main ``` -删除本地分支: +先尝试删除已经完成的本地任务分支: -```sh -git branch -d docs/add-campus-network-guide +```bash +git branch -d docs/update-campus-network ``` -删除远程 Fork 上的分支: +如果 PR 使用 Squash Merge 合并,`git branch -d` 可能因无法确认合并关系而安全拒绝。先在 GitHub 确认 PR 已合并,并核对分支没有需要保留的提交;不确定时先保留分支。 -```sh -git push origin --delete docs/add-campus-network-guide -``` +确认 PR 已合并且分支内容无需保留后,再删除 Fork 上的远程任务分支: -## 七、以后每次提交 PR 的标准命令 - -每次开始新任务: - -```sh -git switch main -git fetch upstream -git merge upstream/main -git push origin main -git switch -c docs/your-change -``` - -完成修改后: - -```sh -git status -git diff -pnpm check -git add 相关文件 -git diff --cached -git commit -m "docs: describe your change" -git push -u origin docs/your-change +```bash +git push origin --delete docs/update-campus-network ``` -然后去 GitHub 创建 PR。 +以后每次贡献都重复“同步 `main` → 创建任务分支 → 修改和预览 → 检查 → 精确暂存 → 提交并推送 → 创建 PR”这个闭环。 diff --git a/docs/development/git-basics.md b/docs/development/git-basics.md index 4a4ec97..45f9677 100644 --- a/docs/development/git-basics.md +++ b/docs/development/git-basics.md @@ -1,33 +1,332 @@ --- title: Git 入门 -description: Git 的最小可用工作流 +description: 从安装和配置 Git 到完成一次安全提交并创建 Pull Request category: development audience: - 本科生 -content_type: experience + - SCSWiki 贡献者 +content_type: verified status: active maintainers: - SCSWiki 维护组 -sources: [] +sources: + - name: Git 官方安装指南 + url: https://git-scm.com/downloads + - name: Pro Git:初次运行 Git 前的配置 + url: https://git-scm.com/book/zh/v2/起步-初次运行-Git-前的配置 + - name: Pro Git:记录每次更新到仓库 + url: https://git-scm.com/book/zh/v2/Git-基础-记录每次更新到仓库 + - name: GitHub Docs:使用 Fork + url: https://docs.github.com/en/pull-requests/how-tos/work-with-forks --- # Git 入门 -Git 用于记录代码和文档的变更历史。初学阶段先掌握少量命令即可。 +Git 是运行在本机上的版本控制工具,用来记录代码和文档的变更历史。GitHub、Gitee 等则是托管远程仓库和开展协作的平台。 -## 最小工作流 +:::: tip 学完本页,你可以 + +- 安装 Git 并完成首次身份设置; +- 解释工作区、暂存区、本地仓库和远程仓库的区别; +- 在独立分支中检查改动、完成提交并安全撤销暂存; +- 把分支推送到自己的 Fork,并向 SCSWiki 创建 Pull Request。 + +:::: + +## 安装 Git + +先打开终端并运行: + +```bash +git --version +``` + +如果能看到类似 `git version 2.x.x` 的输出,说明 Git 已经安装。若提示找不到命令,请按操作系统选择一种安装方式。 + +### Windows + +可以在 PowerShell 或“命令提示符”中使用 Windows 程序包管理器安装: + +```powershell +winget install --id Git.Git -e --source winget +``` + +如果电脑没有 `winget`,可从 [Git for Windows](https://git-scm.com/install/windows) 下载安装程序。初次使用可以保留安装器的默认选项;安装完成后关闭并重新打开终端。 + +### macOS + +安装 Apple 命令行工具: + +```bash +xcode-select --install +``` + +如果已经安装 Homebrew,也可以运行: + +```bash +brew install git +``` + +### Linux + +Debian 或 Ubuntu: + +```bash +sudo apt update +sudo apt install git +``` + +Fedora: + +```bash +sudo dnf install git +``` + +Arch Linux: + +```bash +sudo pacman -S git +``` + +安装完成后再次运行 `git --version`。`sudo` 只用于安装系统软件,不要在项目目录中使用 `sudo git add` 或 `sudo git commit`。 + +:::: info 命令环境 + +本页的 Git 命令可以在 PowerShell、Git Bash、macOS 终端和常见 Linux Shell 中运行。`touch`、`rm`、`cat` 等普通文件命令在不同终端中的行为可能不同,因此本页不依赖它们创建或删除文件。 + +:::: + +## 首次设置 + +每次提交都会记录作者名和邮箱。请把下面的示例文字替换为自己的信息,不要原样复制: + +```bash +git config --global user.name "你的姓名或公开昵称" +git config --global user.email "你的公开邮箱或 GitHub noreply 邮箱" +git config --global init.defaultBranch main +``` + +- `user.name` 是提交记录中的作者名,不要求与 GitHub 用户名相同。 +- 邮箱会写入提交记录。如果不想公开私人邮箱,可按 [GitHub 的说明](https://docs.github.com/en/account-and-profile/how-tos/email-preferences/setting-your-commit-email-address) 使用平台提供的 `noreply` 邮箱。 +- `--global` 表示作者信息等 Git 配置对当前操作系统账户下的所有仓库生效;进入仓库后可改用 `--local` 只配置当前仓库。 + +作者信息与 GitHub 登录凭据是两回事。在机房或共用电脑上,除了避免留下全局作者信息,还要退出浏览器账号,并单独清除凭据管理器中的登录信息;`--local` 不能代替这些操作。 + +只检查刚才设置的三项,避免在截图或求助时暴露其他自定义配置: + +```bash +git config --global --get user.name +git config --global --get user.email +git config --global --get init.defaultBranch +``` + +## Git 在保存什么 + +Git 的核心流程可以理解为: + +```text +工作区(当前检出的项目文件) + ↓ git add +暂存区(下次提交的选择) + ↓ git commit +本地仓库(本机提交历史) + ↓ git push +远程仓库(GitHub / Gitee) +``` + +- **工作区**:当前实际看到和编辑的整套项目文件;用 `git status` 和 `git diff` 检查其中的变化。 +- **暂存区**:下一次提交将采用的内容快照;用 `git add` 选择,用 `git diff --staged` 检查。 +- **本地仓库**:已经创建的本地提交历史;用 `git commit` 保存,用 `git log` 查看。 +- **远程仓库**:上传到 GitHub 等平台的提交和分支;用 `git fetch` 获取,用 `git push` 推送。 + +`git add` 是“选择下次提交的内容”,`git commit` 只创建本地提交;只有 `git push` 才会把本地提交发送到远程。Pull Request(PR)则是在托管平台上请求把一个分支的改动合并到另一个分支。 + +文件执行 `git add` 后仍然存在于工作区;如果暂存后又继续编辑,同一文件可以同时包含已暂存和未暂存的修改。 + +## 完成第一次本地提交 + +建议先新建一个空的一次性练习目录熟悉流程,不要在已有项目中执行下面的 `git init`,也不要直接拿课程作业或重要文件试验。 + +```bash +mkdir git-practice +cd git-practice +git init +git status +``` + +接着用任意文本编辑器在 `git-practice` 目录中创建 `README.md`,写入一两行学习目标并保存,然后执行: + +```bash +git status +git add README.md +git diff --staged +git commit -m "添加学习说明" +git status +git log -5 --oneline +``` + +完成后应看到: + +1. `git log -5 --oneline` 中出现刚才的提交; +2. `git status` 显示工作区干净; +3. 提交仍只保存在本地,没有自动上传到 GitHub。 + +如果 `git log` 打开了分页界面,按 `q` 退出。 + +## 安全提交工作流 + +下面继续以“再次修改并保存 `README.md`”为例,展示真实项目中的参考流程。处理其他文件时,应把 `README.md` 替换为实际修改的路径: ```bash git status -git add . -git commit -m "docs: update note" -git log --oneline +git diff +git add README.md +git diff --staged +git commit -m "补充 Git 学习笔记" +git status +``` + +- **`git status`**:确认当前分支,以及哪些文件已修改、未跟踪或已暂存。 +- **`git diff`**:阅读尚未暂存的具体改动。 +- **`git add README.md`**:只把指定文件的当前内容放入暂存区。 +- **`git diff --staged`**:提交前再次核对真正会进入提交的内容。 +- **`git commit -m "..."`**:创建一个本地提交,消息应说明“做了什么”。 + +普通 `git diff` 不显示尚未跟踪的新文件内容。先用 `git status` 发现新文件,再精确暂存,并通过 `git diff --staged` 检查它将提交的内容。 + +初学阶段优先暂存明确的文件,不把 `git add .` 当作默认操作。`.` 会递归选择当前目录下的变化,可能夹带无关文件、生成文件或敏感信息。 + +提交前还应做到: + +- 一次提交只处理一件清楚的事情; +- 按项目 README 或贡献指南运行检查命令;SCSWiki 使用 `pnpm check`; +- 用项目的 `.gitignore` 排除依赖、构建产物和本地配置,但仍要用 `git status` 主动核对; +- 不提交 `.env`、密钥、访问令牌、账号、真实个人信息、构建产物或编辑器缓存; +- 密钥一旦进入提交历史,应立即撤销或轮换;只删除文件不能让已经泄露的密钥重新安全。 + +## 使用分支 + +分支让一项修改与稳定的 `main` 分开。创建并切换到新的任务分支: + +```bash +git switch -c docs/improve-git-guide +git branch --show-current ``` -## 建议 +分支名应简短描述任务,建议使用小写英文、斜杠和连字符,不使用空格。为开源项目贡献时,不要直接在 `main` 上完成任务修改。 + +如果已经在 `main` 上修改了文件但还没有提交,通常可以直接运行 `git switch -c 新分支名`,当前修改会一起带到新分支;不要为了“清理”而运行 `git reset --hard`。 + +## 为 SCSWiki 创建 Pull Request + +下面是一条从 Fork 到 PR 的最小路径。完整的项目运行和贡献说明见 [参与贡献](/about/contribute)。 + +请打开一个新终端,或者先离开前面的 `git-practice` 练习仓库并回到普通工作目录。不要把 SCSWiki 克隆到另一个 Git 仓库内部。 + +### 1. Fork 并克隆仓库 + +先在 GitHub 上 Fork [SCSWiki 官方仓库](https://github.com/CWNU-Open-Source-Community/SCSWiki),然后克隆自己的 Fork。请将 `YOUR-USERNAME` 替换为自己的 GitHub 用户名: + +```bash +git clone https://github.com/YOUR-USERNAME/SCSWiki.git +cd SCSWiki +git remote -v +``` + +`origin` 默认指向自己的 Fork。再添加官方仓库为 `upstream`,这一步只需执行一次: + +```bash +git remote add upstream https://github.com/CWNU-Open-Source-Community/SCSWiki.git +git remote -v +``` + +如果看到 `remote upstream already exists`,不要重复添加,先用 `git remote -v` 检查现有地址。 + +### 2. 同步并创建任务分支 + +```bash +git switch main +git fetch upstream +git merge --ff-only upstream/main +git switch -c docs/improve-git-guide +``` + +`git fetch` 只获取远程状态,不会直接覆盖当前文件。`--ff-only` 可以避免在同步时意外产生合并提交;如果命令失败,先运行 `git status` 查明原因,不要强制推送。 + +### 3. 检查、提交并推送 + +创建任务分支后,先按照实际任务修改并保存文件。下面假设本次任务就是完善 `docs/development/git-basics.md`;处理其他任务时,必须换成自己的实际文件路径。 + +以下以已经按照 [参与贡献](/about/contribute) 安装 Node.js、pnpm 和项目依赖为前提。完成修改后,先运行 SCSWiki 的项目检查: + +```bash +pnpm check +``` + +再检查并提交 Git 改动。SCSWiki 示例中的 `docs:` 用来标识文档变更,是项目约定而不是 Git 强制语法;参与其他项目时,应优先遵循该项目的贡献规范。 + +```bash +git status +git diff -- docs/development/git-basics.md +git add docs/development/git-basics.md +git diff --staged +git commit -m "docs: 完善 Git 入门教程" +git push -u origin docs/improve-git-guide +``` + +推送后在 GitHub 创建 PR,并确认: + +- base repository 是 `CWNU-Open-Source-Community/SCSWiki`; +- base branch 是 `main`; +- compare branch 是自己 Fork 中刚推送的任务分支; +- 标题说明改了什么,描述中写清改动内容和检查结果。 + +收到评审意见后,继续在同一分支修改、提交并执行普通的 `git push`,原 PR 会自动更新,不需要重新创建。 + +:::: warning 认证和凭据 + +GitHub 的 HTTPS Git 操作不再使用账户密码。请按 GitHub 提示通过浏览器、Git Credential Manager、令牌或 SSH 完成认证。不要把令牌写进远程地址、源码、截图或聊天记录,在公共电脑上也不要长期保存凭据。 + +:::: + +## 撤销与恢复 + +以下示例以已有至少一次提交的项目为前提。先判断改动处于哪个位置,再选择命令: + +- **文件误加入暂存区**:运行 `git restore --staged README.md`。这只取消暂存,工作区修改仍然保留。 +- **确认要丢弃已跟踪文件的未暂存修改**:运行 `git restore -- README.md`。它会让工作区恢复为当前暂存区版本;若该文件没有已暂存改动,通常就是上次提交版本。被丢弃的修改无法靠 Git 找回;`--` 表示后面开始是文件路径。 +- **已经提交或推送后发现错误**:优先将提交编号代入 `git revert COMMIT-ID` 创建一个撤销提交,再检查并正常推送。不要在共享历史上使用强制推送改写记录。 + +`git restore` 无法找回被删除的未跟踪文件;这类文件只能尝试从编辑器本地历史、回收站或备份中恢复。 + +:::: danger 不要盲目复制危险命令 + +`git reset --hard`、`git clean -fd`、`git restore .`、旧式的 `git checkout -- .` 和 `git push --force` 可能删除本地工作或覆盖远程历史。它们不属于入门排错手段;遇到不确定的状态时,先运行 `git status` 并保留现场,再寻求帮助。 + +:::: + +## 常见报错 + +- **`git: command not found` 或“不是内部或外部命令”**:Git 未安装,或安装后终端尚未重启。重新打开终端并运行 `git --version`。 +- **`fatal: not a git repository`**:当前目录不是 Git 仓库。进入正确目录;不要为了消除报错就在任意目录执行 `git init`。 +- **`Please tell me who you are`**:没有配置提交作者信息。检查 `user.name` 和 `user.email`。 +- **`nothing to commit`**:没有改动,或文件尚未保存。先运行 `git status`。 +- **`remote ... already exists`**:同名远程仓库已经配置。用 `git remote -v` 检查,不要重复添加。 +- **`non-fast-forward` 或 `fetch first`**:远程有本地没有的提交。先获取并查看差异,不要立即使用强制推送。 + +## 完成自查 + +本地 Git: + +- `git --version` 能正确输出版本; +- 能说明 `add`、`commit`、`push` 和 PR 的区别; +- 当前位于自己的任务分支,而不是直接在 `main` 上修改; +- 提交前检查过 `git status` 和 `git diff --staged`; +- `git status` 在提交后显示工作区干净; + +SCSWiki 贡献: -- 每次提交只描述一个清晰变更。 -- 提交前先运行项目检查命令。 -- 不提交密钥、账号、个人隐私或临时文件。 +- `git remote -v` 中能分清自己的 `origin` 和官方 `upstream`; +- PR 的目标仓库、目标分支和来源分支均正确。 diff --git a/docs/development/index.md b/docs/development/index.md index 0813998..86fd13a 100644 --- a/docs/development/index.md +++ b/docs/development/index.md @@ -20,14 +20,14 @@ sources: [] ## 建议掌握 - 基本终端命令,见 [Linux 入门](/development/linux-basics)。 -- Git 提交、分支和远程仓库概念,见 [Git 入门](/development/git-basics)。 +- Git 安装、首次配置、安全提交、分支和远程协作,见 [Git 入门](/development/git-basics)。 - 编译器或解释器的安装检查。 - 错误信息的复制、搜索和归纳。 - 常用 AI 工具的账号、订阅和使用边界,见 [GPT 订阅与支付经验](/development/gpt-subscription)。 ## 相关页面 -- [Git 入门](/development/git-basics):最小可用工作流。 +- [Git 入门](/development/git-basics):安装配置、安全提交、分支协作、撤销恢复与 Pull Request。 - [Linux 入门](/development/linux-basics):路径、文件、权限、进程和包管理基础。 - [传统开发](/development/tradition):待补充。 - [AI 赋能开发](/development/ai):待补充。