> 技术文档 > git 学习

git 学习


Git 简介

Git 是一种分布式版本控制系统(DVCS),其核心优势在于:

  • 去中心化:每个开发者拥有完整的仓库副本(含完整历史记录)
  • 高性能:本地操作(如提交、分支切换)不依赖网络,响应速度快
  • 容灾性强:任意节点损坏均可从其他节点恢复

版本控制

版本控制定义

版本控制是管理系统文件变更历史的工具与流程,其核心特征包括:

  1. 全生命周期跟踪:记录文件从创建到迭代的所有修改状态
  2. 变更溯源机制:每个修改节点包含作者、时间、变更内容等元数据
  3. 多版本共存:支持不同版本文件并行存在并通过标识隔离(如分支/tag)
  4. 协同基础层:提供多人协作冲突解决机制(如合并/回滚)

核心作用解析

全流程追踪能力
  • 变更可视化:

    git log --graph # 查看提交历史拓扑图[^1]git blame file.c # 定位每行代码的最后修改者
  • 差异对比:

    git diff v1.2..v1.3 # 比较两个版本间的代码变更
并行开发支撑
  • 分支隔离:

    #mermaid-svg-DIvgNWrmaJLd1L9D {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D .error-icon{fill:#552222;}#mermaid-svg-DIvgNWrmaJLd1L9D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DIvgNWrmaJLd1L9D .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-DIvgNWrmaJLd1L9D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DIvgNWrmaJLd1L9D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DIvgNWrmaJLd1L9D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DIvgNWrmaJLd1L9D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DIvgNWrmaJLd1L9D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DIvgNWrmaJLd1L9D .marker.cross{stroke:#333333;}#mermaid-svg-DIvgNWrmaJLd1L9D svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DIvgNWrmaJLd1L9D .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D .cluster-label text{fill:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D .cluster-label span{color:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D .label text,#mermaid-svg-DIvgNWrmaJLd1L9D span{fill:#333;color:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D .node rect,#mermaid-svg-DIvgNWrmaJLd1L9D .node circle,#mermaid-svg-DIvgNWrmaJLd1L9D .node ellipse,#mermaid-svg-DIvgNWrmaJLd1L9D .node polygon,#mermaid-svg-DIvgNWrmaJLd1L9D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DIvgNWrmaJLd1L9D .node .label{text-align:center;}#mermaid-svg-DIvgNWrmaJLd1L9D .node.clickable{cursor:pointer;}#mermaid-svg-DIvgNWrmaJLd1L9D .arrowheadPath{fill:#333333;}#mermaid-svg-DIvgNWrmaJLd1L9D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DIvgNWrmaJLd1L9D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DIvgNWrmaJLd1L9D .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-DIvgNWrmaJLd1L9D .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-DIvgNWrmaJLd1L9D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DIvgNWrmaJLd1L9D .cluster text{fill:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D .cluster span{color:#333;}#mermaid-svg-DIvgNWrmaJLd1L9D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DIvgNWrmaJLd1L9D :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}主线分支功能分支1修复分支2合并到主线

  • 多版本共存:生产环境运行 v2.0 时,开发者可同时在 v3.0-beta 分支推进新功能

安全与灾难恢复
  • 错误操作回退:

    git reset --hard HEAD~1 # 撤销最近1次提交git revert C0A1B2D # 创建新提交抵消指定提交
  • 数据冗余存储:分布式系统(如 Git)每个节点含完整历史记录,单点损坏不影响全局

团队协作标准化
  • 冲突解决流程:

    1. 用户A修改文件第10行 → 提交2. 用户B修改同文件第10行 → 提交时提示冲突3. 人工选择保留A/B的修改或融合两者
  • 自动化流程集成:支持 CI/CD 工具(如 Jenkins)在代码提交时自动触发测试

为什么需要版本控制

  1. 避免人为错误导致灾难
  • 典型案例:开发误删关键文件且无备份 → 通过版本历史秒级恢复
  • 数据统计:据 Perforce 调查,未使用版本控制的团队代码丢失率高达37%
  1. 解决协作冲突的必要手段

当多人修改同一文件时,系统自动标识冲突点:

<<<<<<< HEADint api_version = 2; // 当前本地版本=======int api_version = 3; // 他人提交的远程版本>>>>>>> new-feature
  1. 满足合规与审计要求
  • 金融/医疗等行业强制要求代码修改可追溯(如 FDA 21 CFR Part 11)

  • 精确追踪生产环境问题到具体提交:

    git bisect start # 通过二分定位引入Bug的提交
  1. 技术演进的基础设施
  • 支持灰度发布:通过标签控制版本路由

    api.tp5.com/v2/user → 指向v2.3.1标签的代码[^1]
  • 实验性开发:创建临时分支验证新技术方案(失败可直接删除)

Git 核心组件

工作流程依赖四大区域:

区域 作用 操作命令 工作区 用户直接编辑文件的目录 直接修改文件 暂存区 临时存储已修改的文件(准备提交的缓冲区) git add 本地仓库 存储所有提交记录和元数据(在 .git 目录) git commit -m \"msg\" 远程仓库 云端共享仓库(GitHub/Gitee 等) git push / git pull

流程关系图:

graph LR subgraph 用户本地 A[工作区
(Working Directory)] -->|git add| B[暂存区
(Staging Area)] B -->|git commit| C[本地仓库
(Local Repository)] end C -->|git push| D[远程仓库
(Remote Repository)] D -->|git fetch| C D -->|git pull| A

版本管理核心机制

  • 快照存储:每次提交保存项目的完整快照(非差异备份),便于快速回滚

  • 版本树结构:提交形成有向无环图(DAG),分支为指向提交的指针

    #mermaid-svg-Hhib47oKfRM10Adq {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Hhib47oKfRM10Adq .error-icon{fill:#552222;}#mermaid-svg-Hhib47oKfRM10Adq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Hhib47oKfRM10Adq .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Hhib47oKfRM10Adq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Hhib47oKfRM10Adq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Hhib47oKfRM10Adq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Hhib47oKfRM10Adq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Hhib47oKfRM10Adq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Hhib47oKfRM10Adq .marker.cross{stroke:#333333;}#mermaid-svg-Hhib47oKfRM10Adq svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Hhib47oKfRM10Adq .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Hhib47oKfRM10Adq .cluster-label text{fill:#333;}#mermaid-svg-Hhib47oKfRM10Adq .cluster-label span{color:#333;}#mermaid-svg-Hhib47oKfRM10Adq .label text,#mermaid-svg-Hhib47oKfRM10Adq span{fill:#333;color:#333;}#mermaid-svg-Hhib47oKfRM10Adq .node rect,#mermaid-svg-Hhib47oKfRM10Adq .node circle,#mermaid-svg-Hhib47oKfRM10Adq .node ellipse,#mermaid-svg-Hhib47oKfRM10Adq .node polygon,#mermaid-svg-Hhib47oKfRM10Adq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Hhib47oKfRM10Adq .node .label{text-align:center;}#mermaid-svg-Hhib47oKfRM10Adq .node.clickable{cursor:pointer;}#mermaid-svg-Hhib47oKfRM10Adq .arrowheadPath{fill:#333333;}#mermaid-svg-Hhib47oKfRM10Adq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Hhib47oKfRM10Adq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Hhib47oKfRM10Adq .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Hhib47oKfRM10Adq .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Hhib47oKfRM10Adq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Hhib47oKfRM10Adq .cluster text{fill:#333;}#mermaid-svg-Hhib47oKfRM10Adq .cluster span{color:#333;}#mermaid-svg-Hhib47oKfRM10Adq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Hhib47oKfRM10Adq :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}Commit ACommit B新分支指针Commit D

Git 核心功能与用途

核心功能

功能类别 典型场景 命令示例 版本追踪 记录文件修改历史 git log / git diff 分支管理 并行开发不同功能 git branch / git merge 远程协作 多人协作代码共享 git clone / git fetch 错误修复 撤销错误提交或修改 git reset / git revert

核心应用场景

  • 个人开发

    git init # 初始化仓库git add main.py # 添加修改到暂存区git commit -m \"实现登录功能\" # 提交到本地仓库[^2]
  • 团队协作

    git clone https://gitee.com/project.git # 克隆远程仓库git checkout -b feature # 新建分支开发git push origin feature # 推送分支到远程
  • 版本回退(紧急修复)

    git reset --hard HEAD~2 # 回退到前2个提交[警告:慎用]git push -f # 强制覆盖远程(需团队协商)

Git 核心优势

  1. 高效处理大型项目

    文件变更检测算法优化(如 SHA-1 哈希),支持百万级文件管理

  2. 离线工作能力

    本地仓库完整独立,无网络仍可提交/分支切换

  3. 协作流程标准化

    通过 Pull Request 等机制实现代码审查与自动化测试集成

Git 常用命令

初始化和配置

# 初始化新仓库git init# 配置用户信息(全局生效)git config --global user.name \"Your Name\"git config --global user.email \"your@email.com\"# 查看所有配置git config --list

工作区操作

# 查看文件状态(未跟踪/已修改/已暂存)git status# 添加文件到暂存区git add filename.txt # 添加单个文件git add .  # 添加所有修改# 提交更改到本地仓库git commit -m \"提交说明\"# 删除文件(同时从工作区和暂存区删除)git rm filename.txt

版本控制

# 查看提交历史git log  # 完整历史git log --oneline # 简洁历史# 回退到指定版本git reset --hard commit_id# 查看文件差异git diff  # 工作区与暂存区差异git diff --cached # 暂存区与仓库差异

分支管理

# 创建新分支git branch new-feature# 切换分支git checkout new-featuregit checkout -b hotfix # 创建并切换# 合并分支(当前分支合并目标分支)git merge feature-branch# 删除分支git branch -d old-branch

远程仓库

# 添加远程仓库git remote add origin https://github.com/user/repo.git# 推送到远程仓库git push -u origin main# 克隆远程仓库git clone https://github.com/user/repo.git# 获取远程更新git pull origin main

忽略文件配置(.gitignore)

创建 .gitignore 文件指定忽略规则:

# 忽略所有日志文件*.log# 忽略node_modules目录node_modules/# 例外规则(不忽略重要.log文件)!important.log

Git 分支

分支核心概念

  1. 分支本质

    Git 分支是轻量化的移动指针,指向特定的提交对象。创建分支仅增加一个指针文件(约40字节):

    ref: refs/heads/main // 分支指针文件内容
  2. 关键操作

    git branch feature # 创建分支git checkout -b hotfix # 创建并切换分支git branch -d dev # 安全删除分支git branch -D tmp # 强制删除未合并分支 [^1]
  3. 分支合并流程

    #mermaid-svg-foQgA5Te6qR1Siov {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-foQgA5Te6qR1Siov .error-icon{fill:#552222;}#mermaid-svg-foQgA5Te6qR1Siov .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-foQgA5Te6qR1Siov .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-foQgA5Te6qR1Siov .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-foQgA5Te6qR1Siov .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-foQgA5Te6qR1Siov .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-foQgA5Te6qR1Siov .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-foQgA5Te6qR1Siov .marker{fill:#333333;stroke:#333333;}#mermaid-svg-foQgA5Te6qR1Siov .marker.cross{stroke:#333333;}#mermaid-svg-foQgA5Te6qR1Siov svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-foQgA5Te6qR1Siov .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-foQgA5Te6qR1Siov .cluster-label text{fill:#333;}#mermaid-svg-foQgA5Te6qR1Siov .cluster-label span{color:#333;}#mermaid-svg-foQgA5Te6qR1Siov .label text,#mermaid-svg-foQgA5Te6qR1Siov span{fill:#333;color:#333;}#mermaid-svg-foQgA5Te6qR1Siov .node rect,#mermaid-svg-foQgA5Te6qR1Siov .node circle,#mermaid-svg-foQgA5Te6qR1Siov .node ellipse,#mermaid-svg-foQgA5Te6qR1Siov .node polygon,#mermaid-svg-foQgA5Te6qR1Siov .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-foQgA5Te6qR1Siov .node .label{text-align:center;}#mermaid-svg-foQgA5Te6qR1Siov .node.clickable{cursor:pointer;}#mermaid-svg-foQgA5Te6qR1Siov .arrowheadPath{fill:#333333;}#mermaid-svg-foQgA5Te6qR1Siov .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-foQgA5Te6qR1Siov .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-foQgA5Te6qR1Siov .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-foQgA5Te6qR1Siov .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-foQgA5Te6qR1Siov .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-foQgA5Te6qR1Siov .cluster text{fill:#333;}#mermaid-svg-foQgA5Te6qR1Siov .cluster span{color:#333;}#mermaid-svg-foQgA5Te6qR1Siov div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-foQgA5Te6qR1Siov :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}git checkout -b featuregit checkout maingit merge featuremainfeatureCommit ACommit Bmain新合并提交

冲突处理全流程

  1. 冲突触发场景

    当两个分支修改同一文件的相同区域时触发,如:

    <<<<<<>>>>>> feature
  2. 手动解决步骤

    # 1. 定位冲突文件(git status)# 2. 编辑文件删除冲突标记# 3. 标记为已解决git add resolved-file.js# 4. 完成合并git commit -m \"Merge fix\"
  3. 高级工具

    • VS Code内置冲突编辑器
    • git mergetool 调用外部工具
    • git rerere(重用记录的分辨率)自动处理重复冲突

安全的分支协作规范

  1. 分支保护策略

    分支类型 保护规则 操作限制 main 强制代码评审 禁止直接 push release 只允许 hotfix 合并 禁止 rebase feature 定期同步 main 分支 允许强制 push
  2. 实践

    # 更新本地分支避免冲突git checkout featuregit fetch origingit rebase origin/main # 线性化历史# 提交前本地验证git push --force-with-lease # 安全强制推送

Git rebase

功能概述

git rebase 的核心功能是重写提交历史,通过将分支的提交“移植”到新的基础提交上,实现:

  1. 线性化历史:消除不必要的合并提交,生成更清晰的提交链
  2. 分支同步:将特性分支的修改基于目标分支的最新状态重新应用
  3. 提交整理:支持合并(-i)、修改(edit)或删除历史提交

基础语法

git rebase <目标分支> # 将当前分支移植到目标分支最新提交 git rebase -i HEAD~3 # 交互式重写最近3个提交 # 继续或终止操作  git rebase --continue # 继续重写 git rebase --abort # 完全放弃并还原状态 [^1][^2]

与 merge 对比

特性 Rebase Merge 历史记录 线性简洁 保留合并提交 冲突处理 按提交逐一解决 一次性统一解决 适用场景 个人分支/整理历史 公共分支/团队协作 安全性 禁止在公共分支使用 所有场景可用

SSH 秘钥

核心概念

  1. 基本定义

    SSH密钥是一种非对称加密技术的密钥对,由两部分组成:

    • 🔑 私钥(Private Key):存储在用户本地设备(如 ~/.ssh/id_rsa),需严格保密
    • 🔓 公钥(Public Key):可公开分发(如 ~/.ssh/id_rsa.pub),上传至远程服务器
  2. 工作原理图解

    #mermaid-svg-8vWvuiT9vdFsQEWl {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl .error-icon{fill:#552222;}#mermaid-svg-8vWvuiT9vdFsQEWl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8vWvuiT9vdFsQEWl .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-8vWvuiT9vdFsQEWl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8vWvuiT9vdFsQEWl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8vWvuiT9vdFsQEWl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8vWvuiT9vdFsQEWl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8vWvuiT9vdFsQEWl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8vWvuiT9vdFsQEWl .marker.cross{stroke:#333333;}#mermaid-svg-8vWvuiT9vdFsQEWl svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8vWvuiT9vdFsQEWl .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl .cluster-label text{fill:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl .cluster-label span{color:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl .label text,#mermaid-svg-8vWvuiT9vdFsQEWl span{fill:#333;color:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl .node rect,#mermaid-svg-8vWvuiT9vdFsQEWl .node circle,#mermaid-svg-8vWvuiT9vdFsQEWl .node ellipse,#mermaid-svg-8vWvuiT9vdFsQEWl .node polygon,#mermaid-svg-8vWvuiT9vdFsQEWl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8vWvuiT9vdFsQEWl .node .label{text-align:center;}#mermaid-svg-8vWvuiT9vdFsQEWl .node.clickable{cursor:pointer;}#mermaid-svg-8vWvuiT9vdFsQEWl .arrowheadPath{fill:#333333;}#mermaid-svg-8vWvuiT9vdFsQEWl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8vWvuiT9vdFsQEWl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8vWvuiT9vdFsQEWl .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-8vWvuiT9vdFsQEWl .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-8vWvuiT9vdFsQEWl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8vWvuiT9vdFsQEWl .cluster text{fill:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl .cluster span{color:#333;}#mermaid-svg-8vWvuiT9vdFsQEWl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8vWvuiT9vdFsQEWl :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}1. 生成密钥对2. 复制公钥3. 存入authorized_keys4. 连接请求5. 用公钥加密挑战6. 用私钥解密本地设备私钥+公钥远程服务器认证文件SSH服务随机数据

  3. 密钥安全性依据

    算法类型 数学基础 安全强度对比 RSA 大质数分解难题 2048位 ≈ 传统密码100字符 Ed25519 椭圆曲线离散对数问题 256位 ≫ RSA 4096位3
  4. 核心功能场景

    • 免密登录:取代用户名/密码认证(ssh user@host
    • 数据加密:建立安全隧道传输文件(scpsftp
    • 服务认证:Git 操作、服务器自动化运维

密钥核心原理

  1. 非对称加密机制

    • 公钥(id_rsa.pub)存储在 Git 服务器,私钥(id_rsa)保存在本地
  2. 密钥类型对比

    算法类型 安全性 密钥长度 适用场景 RSA ★★★★ 4096 bit 通用兼容 Ed25519 ★★★★★ 256 bit 高性能服务器3

密钥生成与配置流程

  1. 生成密钥(终端操作)
# 检查现有密钥(无.ssh目录需创建)ls -al ~/.ssh # [^2]# 生成Ed25519密钥ssh-keygen -t ed25519 -C \"your_email@example.com\"# 或生成RSA密钥ssh-keygen -t rsa -b 4096 -C \"your_email@example.com\"

参数说明:

  • -t 指定加密算法
  • -b 设置密钥长度(RSA专用)
  • -C 添加注释(通常用邮箱)
  1. 添加公钥到 Git 服务商
    1. 复制公钥内容。
    2. 粘贴到平台:
      • GitHub:Settings → SSH and GPG keys
      • GitLab:Preferences → SSH Keys
      • Gitee:设置 → SSH公钥

密钥使用与验证

连接测试

ssh -T git@github.com # GitHubssh -T git@gitlab.com # GitLab

成功响应示例:
Hi username! You\'ve successfully authenticated...

仓库操作示例

# 克隆SSH协议仓库git clone git@github.com:user/repo.git# 修改远程URL为SSHgit remote set-url origin git@gitlab.com:group/project.git

常见问题

错误信息 解决方案 Permission denied (publickey) 1. 检查 ~/.ssh 权限为700
2. 确认公钥已添加到服务器 Host key verification failed ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts Key is already in use 重新生成密钥并替换旧公钥