1. 首页 > 服务器运维

GitHub初学者超全教程:SSH密钥、个人访问令牌、合并变基、撤销提交与PR审查

GitHub 初学者

“GitHub 初学者” 字面意思就是“刚开始学习使用 GitHub 的新手用户”。但在实际的技术语境中,这个词并不只是一个简单的身份标签,它通常代指正处于“版本控制认知启蒙期”的开发者

具体来说,一个典型的“GitHub 初学者”通常具备以下几个特征:

1. 核心困惑(痛点)

初学者的核心难点不是“写代码”,而是“理解流程”。他们往往:

  • 混淆 Git 和 GitHub:分不清 Git(本地的版本管理工具)和 GitHub(基于 Git 的远程代码托管网站)的区别。

  • 惧怕命令行:对 git pushgit pullgit merge 等命令感到陌生,害怕输入错误指令导致代码丢失。

  • 看不懂报错:遇到 “merge conflict”(合并冲突)或 “failed to push” 时,不知道如何解读红色报错信息,经常想“删库重来”。

2. 必备的认知转变

从“初学者”过渡到“熟练使用者”,需要理解三个关键思维:

  • 从“存代码”到“管历史”:不再把 GitHub 当网盘(只上传压缩包),而是学会用 commit 记录每一次修改的原因和脉络。

  • 从“单打独斗”到“团队协作”:理解分支(Branch)的作用,明白为什么不能直接在 main 分支上改代码,以及如何通过 Pull Request(PR)让别人审查自己的代码。

  • 理解认证逻辑:区分密码、SSH 密钥和个人访问令牌(PAT)的使用场景(这一点正好呼应了上文中我们扩展的内容)。

3. 初学者的标准学习路径

对于 GitHub 初学者,通常会按以下顺序攻克难关:

  • 初始化与克隆:学会 git init 或在网页上点 “Fork” 复制项目。

  • 三板斧:牢牢记住 git add(暂存) -> git commit(提交) -> git push(推送) 的生命周期。

  • 拉取更新:学会 git pull 获取队友的最新代码。

  • 解决冲突:不回避合并冲突,学会在 IDE(如 VSCode)或 GitHub 网页端手动裁决代码去留。

什么是 SSH?如何将 SSH 密钥添加到 GitHub?

SSH 密钥是安全外壳(Secure Shell)协议的密钥文件对。它由计算机上的一对文件组成,分为两个部分:私钥公钥

  • 私钥保留在您的计算机上,相当于您的数字身份“指纹”,绝不能以任何形式分享给他人或上传到网络。一旦泄露,攻击者就能冒充您操作仓库。
  • 公钥则是您与 GitHub、GitLab、Bitbucket 等代码托管平台共享的“锁芯”。当您将公钥上传到 GitHub 后,每次执行 git pushgit pull 操作时,Git 会使用您本地的私钥与服务器上的公钥进行加密“握手”,从而确认您的身份。这种非对称加密机制比密码认证更安全,因为私钥从不经过网络传输。

为什么推荐使用 SSH 而不是 HTTPS + 密码?

  • SSH 无需每次操作都输入用户名和密码(配合 ssh-agent 甚至不用输密码短语)。
  • 密码可能被暴力破解或钓鱼窃取,而 SSH 私钥长度通常为 2048 位以上,破解难度极高。
  • 您可以为不同设备生成不同的密钥对,在 GitHub 上单独管理,设备丢失时只需移除对应的公钥即可。

那么具体该怎么做呢?现在让我们创建一个密钥对并将您的公钥添加到 GitHub。

  • 打开终端(Windows 用户建议使用 Git Bash 或 PowerShell,macOS/Linux 用户使用系统自带终端),输入以下命令。请务必将电子邮件占位符替换为您用于登录 GitHub 的电子邮件地址(该邮箱仅用于标记密钥,不影响认证)。
ssh-keygen –t ed25519 – C YOUREMAIL@DOMAIN.COM

术语解释-t ed25519 指定使用 Ed25519 算法,它是目前公认安全性高且速度快的非对称加密算法,比传统的 RSA 4096 更轻量。如果您的老旧系统不支持 Ed25519,可改用 -t rsa -b 4096

  • 当提示“Enter file in which to save the key”时,按 Enter 接受默认文件路径(通常是 ~/.ssh/id_ed25519)。如果您已有同名密钥,请改名或备份,否则会覆盖。
  • 接着系统会要求您输入密码短语(passphrase)。这不是 GitHub 登录密码,而是给您的私钥额外增加一层本地加密保护。即使有人拿到了您的私钥文件,没有密码短语也无法使用。注意:终端不会显示任何输入字符,因此请小心不要出现拼写错误!建议使用大小写字母、数字和符号组合,长度不少于 8 位。
  • 重新输入一遍密码短语以确认。

创建完成后,您需要将新密钥添加到 ssh-agent 中。 ssh-agent 是一个后台守护程序,它可以安全地存储已解密的私钥,这样您在本次会话中就无需反复输入密码短语。如果您未启动 ssh-agent,可先执行 eval "$(ssh-agent -s)"(macOS/Linux)或手动开启服务(Windows)。

运行以下命令将密钥加入 ssh-agent:

ssh-add ~/.ssh/id_ed25519

出现提示时,输入您刚才设置的密码短语。如果一切正常,您会看到“Identity added”的提示。

现在您已经拥有了 SSH 密钥并配置了 ssh-agent,下一步是将公钥上传到 GitHub。

  • 在终端中运行以下命令,以查看公钥内容:
cat ~/.ssh/id_ed25519.pub
  • 复制终端中显示的整行(以 ssh-ed25519 开头,以您的邮箱结尾),不要多复制空格或换行。
  • 打开浏览器,导航到 github.com 并登录。
  • 单击右上角的个人资料头像,在下拉菜单中选择 “设置”(Settings)
  • 在左侧菜单栏中,选择 “SSH 和 GPG 密钥”(SSH and GPG keys)
  • 在右侧页面中,单击绿色的 “新建 SSH 密钥”(New SSH Key) 按钮。
  • “标题”(Title) 框中为您要添加的密钥指定一个易记的名称,例如“工作笔记本电脑”或“家用台式机”,以便日后管理。
  • 将从终端复制的公钥内容粘贴到 “密钥”(Key) 大文本框中。
  • 单击窗口底部的绿色 “添加 SSH 密钥”(Add SSH Key) 按钮。GitHub 可能会要求您再次输入密码以确认操作。

恭喜! 您的计算机现已配置为通过 SSH 与 GitHub 安全通信。您可以通过运行 ssh -T git@github.com 来测试连接,如果看到 “Hi username! You've successfully authenticated” 即代表成功。

如何将 PAT 添加到 GitHub?什么是 PAT?

PAT 全称 Personal Access Token(个人访问令牌)。它是一个由 GitHub 生成的字符串,类似于“临时密码”,用于替代传统的密码进行 API 调用或命令行认证。与 SSH 密钥不同,PAT 是令牌(token) 形式,您可以精细控制它的权限范围(例如只能读取某个仓库)和有效期(例如 7 天后自动失效)。当您使用 GitHub CLI、第三方工具(如 Jenkins、GitHub Actions)或者需要通过 REST API 访问私有仓库时,PAT 是最常用的认证方式。

目前 GitHub 提供两种类型的 PAT:

类型特点适用场景
细粒度令牌(Fine-grained)可针对特定仓库、特定权限(读/写)进行精细控制,有效期可自定义,安全性更高,推荐使用。需要限制令牌仅访问某几个仓库或特定操作(如仅 issue 管理)。
经典令牌(Classic)权限范围基于“作用域(scope)”(如 repo、workflow),覆盖面较宽,一旦泄露影响较大。兼容旧脚本或工具,或者需要全局访问多个仓库时。

首先,我们一步步创建细粒度的 PAT。

  • 打开浏览器,登录 github.com
  • 点击右上角头像 → “设置”(Settings)
  • 滚动左侧菜单到底部,选择 “开发者设置”(Developer settings)
  • 在左侧列中,展开 “个人访问令牌”(Personal access tokens),然后选择 “细粒度令牌”(Fine-grained tokens)
  • 单击中央的绿色 “生成新令牌”(Generate new token) 按钮。
  • 输入令牌的名称(如 cli-access)和描述(如“用于 Copilot CLI 认证”),这有助于您日后识别。
  • “过期”(Expiration) 下,选择与您需要令牌有效的时间相匹配的日期(建议根据任务长短选择,尽量设置较短有效期,降低风险)。
  • “仓库访问”(Repository access) 下,选择 “仅选择仓库”(Only select repositories) 并勾选具体需要授权的仓库。如果您信任当前环境,也可以选“所有仓库”。
  • “权限”(Permissions) 区域,点击 “添加权限”(Add permissions) 下拉菜单,按需赋予令牌对各类资源(如代码、提交状态、Actions、部署等)的只读(Read-only)读写(Read and write) 权限。原则是最小化权限 —— 只给完成当前任务所必需的最低权限。
  • 确认权限无误后,滚动到底部,单击绿色的 “生成令牌”(Generate token) 按钮。
  • 系统会弹出一个确认窗口,再次核对信息后点击 “生成令牌”
  • 重要:GitHub 将仅这一次显示完整的令牌字符串。请立即复制并保存到安全位置(如密码管理器 1Password、Bitwarden 或本地加密文件)。一旦关闭页面,您将无法再次查看它,只能重新生成。

接下来创建一个经典令牌(Classic Token)。过程类似,但权限控制粒度较粗:

  • 进入 “开发者设置”“个人访问令牌”“令牌(经典)”(Tokens (classic))
  • 点击 “生成新令牌”(Generate new token)“生成新令牌(经典)”(Generate new token (classic))
  • 为令牌指定清晰名称(如 terminal-access)。
  • 选择有效期(与细粒度相同)。
  • “作用域”(Scopes) 区域,勾选所需权限,例如 repo(完全控制私有仓库)、workflow(管理 Actions)、admin:org(管理组织)等。注意:勾选 repo 时会自动附带许多子权限,请仔细评估。
  • 滚动到底部,单击 “生成令牌”
  • 同样,立即复制并保存令牌,因为后续不再显示。

专家建议

  • 日常开发优先使用细粒度 PAT,并设置 30~90 天过期,定期轮换。
  • 绝不要将 PAT 硬编码在代码中或提交到仓库。使用环境变量(如 export GITHUB_TOKEN=xxx)或密钥管理工具。
  • 如果令牌泄露,立即到 GitHub 设置中撤销并重新生成。

下次 Git 或命令行工具要求您输入密码时,您可以粘贴 PAT 作为密码(注意:密码不会回显),即可通过认证。

合并和变基有什么区别,如何解决合并冲突?

当两个分支的修改触达了同一个文件的同一行代码(或者一个修改了文件,另一个删除了该文件),Git 无法自动决定保留哪一方,就会产生合并冲突(merge conflict)。此时需要人工介入,明确最终版本。

解决合并冲突(使用 GitHub UI)

这是最直观的方法,适合不熟悉命令行的开发者:

  • 打开存在合并冲突的拉取请求(Pull Request)。GitHub 会在页面顶部显示红色警告:“This branch has conflicts that must be resolved”。
  • 滚动到底部,点击警告区域内的 “解决冲突”(Resolve conflicts) 按钮。
  • GitHub 会打开内嵌的编辑器,展示有冲突的文件。冲突区域以 <<<<<<<=======>>>>>>> 标记,上方是当前分支的改动,下方是目标分支的改动。
  • 手动编辑,删除标记符号,只保留您希望保留的代码。如果两段都需保留,可以合并整理成新内容。
  • 每解决完一个文件,点击右上角的 “标记为已解决”(Mark as resolved)
  • 对每个冲突文件重复上述操作。
  • 所有文件都解决后,点击窗口顶部的绿色 “提交合并”(Commit merge) 按钮。此时 GitHub 会生成一个合并提交,拉取请求状态变为可合并。

命令行解决冲突的补充:您也可以 git pull 后在本地用 git status 查看冲突文件,手动编辑后 git addgit commit。对于复杂冲突,推荐使用 VS Code 或 IntelliJ 等 IDE 的三方合并工具,图形化对比更清晰。

合并(Merge)与变基(Rebase)的区别

维度合并(Merge)变基(Rebase)
原理创建一个新的“合并提交”(merge commit),将两个分支的历史连接在一起。将当前分支的每个提交“复制”并应用到目标分支的顶部,形成线性历史。
历史记录保留完整的分支分叉和合并轨迹,真实反映开发过程。历史记录被重写,呈现为一条笔直的提交线,更加简洁。
适用场景功能分支合并到主分支(main),尤其是多人协作时,保留上下文便于回溯。在本地更新功能分支以包含主分支的最新改动(例如 git rebase main),避免后续合并时产生大量冲突。
风险安全,不会改动已有提交的哈希值。会改写提交哈希,绝不要在公共共享分支上使用变基,否则会让队友的本地历史混乱。

何时选用哪个?

  • 如果您的分支是私有的(本地或只有您一人使用的远程分支),可以用 rebase 保持干净线性。
  • 如果分支已经推送到共享仓库并有其他人基于它工作,请用 merge,避免破坏他人的历史。
  • 团队规范通常建议:日常开发中,在合并到 main 之前,先 git fetch + git rebase origin/main 更新本地分支,解决冲突后再用 merge --no-ff 合并,既能保持线性又能记录合并节点。

如何撤消上次提交?

您可能误提交了调试代码、敏感信息,或者提交信息写错了,需要撤销。Git 提供多种撤销方式,根据您是否已推送而不同。

场景一:提交已推送到远程分支(GitHub 上可见)

推荐使用 git revert,它会生成一个新的提交,其内容正好与错误提交相反(即撤销改动),但不会删除历史。这种方式安全,因为它不改变已有提交,其他协作者拉取时不会发生冲突。

  • github.com 上打开您要撤消的提交页面(点击提交哈希)。
  • 滚动到提交详情底部,点击 “恢复”(Revert) 按钮。
  • GitHub 会自动创建一个新的 Pull Request 或直接提交(取决于仓库设置),标题通常为 “Revert ...”。您审查后合并即可。

命令行等效git revert ,然后推送 git push

场景二:提交仅存在于本地,尚未推送

此时您有两种选择:

  1. 软重置(soft reset) —— 撤销提交但保留工作区修改(文件改动仍保留在暂存区):

  2. git reset --soft HEAD~1

    适合您想重新修改提交内容或拆分为多个提交。
  3. 硬重置(hard reset) —— 撤销提交并丢弃所有工作区改动,回到上一次提交的干净状态:

  4. git reset --hard HEAD~1

    ⚠️ 警告:此操作会永久删除未提交的本地修改,请务必先确认不需要这些更改,或者提前用 git stash 保存。

专家建议:如果您不确定,优先使用 git revertgit reset --soft,以防数据丢失。对于已推送的提交,永远不要使用 reset(它会改变历史,导致远程拒绝推送),除非您强制推送(--force),但这样会严重影响其他协作者。

如何更新或同步 GitHub 上的分叉存储库?

分叉(Fork) 是在 GitHub 上复制一个他人的仓库到您的账户下,让您可以自由修改而不影响原项目。这在参与开源贡献时非常关键。但原项目(上游)会持续更新,您的分叉很快就会落后,因此需要定期同步。

通过 GitHub 网页同步(最简单)

  • 登录 github.com,进入您的分叉仓库主页。
  • 在仓库顶部,点击 “同步分叉”(Sync fork) 按钮(位于“Code”按钮旁边)。
  • 如果上游有更新,会弹出窗口,点击 “更新分支”(Update branch),GitHub 会自动合并上游的更改到您的分叉。

通过命令行同步(更可控)

  • 打开终端,切换到您的本地仓库目录。
  • 首次需要添加上游仓库(upstream)作为远程地址(只需一次):
  • git remote add upstream https://github.com/原所有者/原仓库.git


    如果您使用的是 SSH,则改为 git@github.com:原所有者/原仓库.git
  • 拉取上游最新变更:
  • git fetch upstream
  • 合并上游分支到您的本地主分支(假设上游默认分支为 main):
  • git merge upstream/main


    如果出现冲突,请按上一节的方法解决。
  • 最后将更新推送回您的 GitHub 分叉:
  • git push origin main

注意事项

  • 如果您在本地创建了新的功能分支,请先切回 main 再同步,然后 git rebase main 更新功能分支。
  • 定期同步(建议每周至少一次)可大幅减少后续合并冲突的复杂度。

如何在 GitHub 上审核拉取请求?

拉取请求(Pull Request,简称 PR)是协作开发中代码审查(Code Review)的核心环节。优秀的审查不仅保证代码质量,还能促进团队知识共享。以下是三个核心实践:

  1. 理解 PR 的上下文和目标

    • 打开 PR,仔细阅读描述(Description),查看是否关联了 Issue(问题)、附带了设计截图、性能测试数据或自测步骤。
    • 了解作者想解决什么问题、为什么这样修改,这能帮助您判断改动是否合理,避免“只看代码不识全局”。
  2. 逐块审查代码改动

    • 切换到 “文件更改”(Files changed) 选项卡,按文件列表从上到下浏览。
    • 对有疑问的行,点击加号(+)添加行内评论。提问时尽量具体(例如“这里循环时间复杂度 O(n²),是否考虑用哈希映射?”)。
    • 如果发现小问题(如拼写错误、命名不规范),可以用 “nit”(nitpick) 标注,表示这是建议而非硬性要求。
    • 对于复杂逻辑,建议在本地 git checkout 该分支实际运行代码,甚至使用 GitHub Codespaces 快速启动环境,亲测功能是否正常。
  3. 给予正面反馈

    • 当看到优雅的代码结构、完善的异常处理或聪明的算法优化时,不要吝啬赞美。积极的评论能提升团队士气,并引导他人学习好习惯。

当您完成审查后,使用 “提交审核”(Submit review) 按钮选择:

  • “Comment”(评论):仅发表意见,不决定能否合并。
  • “Approve”(批准):表示认可,可以合并。
  • “Request changes”(请求更改):表示必须修改后才能合并(一般用于严重问题)。

使用 Copilot 辅助代码审查

GitHub Copilot 现在提供自动代码审查功能(需组织管理员启用)。它可以快速发现潜在的逻辑缺陷、安全漏洞或风格不一致,并给出建议。

  • 在 PR 页面右上角,点击 “审阅者”(Reviewers) 下拉菜单。
  • 从建议列表中选择 “Copilot”
  • 等待 10~30 秒,Copilot 会完成扫描并留下评论。它的评论类型固定为 “评论”(不会阻塞合并),您可以将它的建议作为参考,再结合人工判断决定是否采纳。

未来趋势:AI 审查正在成为代码质量保障的重要补充,但人类审查仍不可替代 —— 因为只有人能理解业务逻辑和团队文化。最佳实践是“AI 初筛 + 人工深度审查”结合。

给初学者的避坑建议(专家视角):

  • 多用图形化工具过渡:如果命令行让你头疼,初期可以先用 GitHub Desktop 或 VSCode 自带的源代码管理面板,看懂图形界面后再去对比命令行,理解会更深刻。

  • 养成写 git status 的习惯:这是初学者最好的“指路明灯”,它随时会告诉你当前分支状态、有哪些文件未提交,按照它的提示去操作就不会迷路。

  • 重视 .gitignore 文件:从第一天起就学会忽略 node_modules.env 等依赖和环境变量文件,避免把大文件或密钥误传到 GitHub 上。

总结

掌握 SSH 密钥、PAT、合并/变基、撤销提交、同步分叉以及 PR 审查,是高效协作开发的基础技能。建议您将本文作为速查手册,并在实际项目中反复实践,逐步形成自己的开发流程。随着 GitHub 不断更新(如细粒度 PAT 和 Copilot 审查的普及),保持学习习惯将使您始终领先一步。

本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/yunwei/9583.html

联系我们

在线咨询:点击这里给我发消息

Q Q:2220678578