git 学习
Git 简介
Git 是一种分布式版本控制系统(DVCS),其核心优势在于:
- 去中心化:每个开发者拥有完整的仓库副本(含完整历史记录)
- 高性能:本地操作(如提交、分支切换)不依赖网络,响应速度快
- 容灾性强:任意节点损坏均可从其他节点恢复
版本控制
版本控制定义
版本控制是管理系统文件变更历史的工具与流程,其核心特征包括:
- 全生命周期跟踪:记录文件从创建到迭代的所有修改状态
- 变更溯源机制:每个修改节点包含作者、时间、变更内容等元数据
- 多版本共存:支持不同版本文件并行存在并通过标识隔离(如分支/tag)
- 协同基础层:提供多人协作冲突解决机制(如合并/回滚)
核心作用解析
全流程追踪能力
-
变更可视化:
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)在代码提交时自动触发测试
为什么需要版本控制
- 避免人为错误导致灾难
- 典型案例:开发误删关键文件且无备份 → 通过版本历史秒级恢复
- 数据统计:据 Perforce 调查,未使用版本控制的团队代码丢失率高达37%
- 解决协作冲突的必要手段
当多人修改同一文件时,系统自动标识冲突点:
<<<<<<< HEADint api_version = 2; // 当前本地版本=======int api_version = 3; // 他人提交的远程版本>>>>>>> new-feature
- 满足合规与审计要求
-
金融/医疗等行业强制要求代码修改可追溯(如 FDA 21 CFR Part 11)
-
精确追踪生产环境问题到具体提交:
git bisect start # 通过二分定位引入Bug的提交
- 技术演进的基础设施
-
支持灰度发布:通过标签控制版本路由
api.tp5.com/v2/user → 指向v2.3.1标签的代码[^1]
-
实验性开发:创建临时分支验证新技术方案(失败可直接删除)
Git 核心组件
工作流程依赖四大区域:
git add
.git
目录)git commit -m \"msg\"
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 核心优势
-
高效处理大型项目
文件变更检测算法优化(如 SHA-1 哈希),支持百万级文件管理
-
离线工作能力
本地仓库完整独立,无网络仍可提交/分支切换
-
协作流程标准化
通过 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 分支
分支核心概念
-
分支本质
Git 分支是轻量化的移动指针,指向特定的提交对象。创建分支仅增加一个指针文件(约40字节):
ref: refs/heads/main // 分支指针文件内容
-
关键操作
git branch feature # 创建分支git checkout -b hotfix # 创建并切换分支git branch -d dev # 安全删除分支git branch -D tmp # 强制删除未合并分支 [^1]
-
分支合并流程
#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新合并提交
冲突处理全流程
-
冲突触发场景
当两个分支修改同一文件的相同区域时触发,如:
<<<<<<>>>>>> feature
-
手动解决步骤
# 1. 定位冲突文件(git status)# 2. 编辑文件删除冲突标记# 3. 标记为已解决git add resolved-file.js# 4. 完成合并git commit -m \"Merge fix\"
-
高级工具
- VS Code内置冲突编辑器
git mergetool
调用外部工具git rerere
(重用记录的分辨率)自动处理重复冲突
安全的分支协作规范
-
分支保护策略
分支类型 保护规则 操作限制 main 强制代码评审 禁止直接 push release 只允许 hotfix 合并 禁止 rebase feature 定期同步 main 分支 允许强制 push -
实践
# 更新本地分支避免冲突git checkout featuregit fetch origingit rebase origin/main # 线性化历史# 提交前本地验证git push --force-with-lease # 安全强制推送
Git rebase
功能概述
git rebase
的核心功能是重写提交历史,通过将分支的提交“移植”到新的基础提交上,实现:
- 线性化历史:消除不必要的合并提交,生成更清晰的提交链
- 分支同步:将特性分支的修改基于目标分支的最新状态重新应用
- 提交整理:支持合并(
-i
)、修改(edit
)或删除历史提交
基础语法
git rebase <目标分支> # 将当前分支移植到目标分支最新提交 git rebase -i HEAD~3 # 交互式重写最近3个提交 # 继续或终止操作 git rebase --continue # 继续重写 git rebase --abort # 完全放弃并还原状态 [^1][^2]
与 merge 对比
SSH 秘钥
核心概念
-
基本定义
SSH密钥是一种非对称加密技术的密钥对,由两部分组成:
- 🔑 私钥(Private Key):存储在用户本地设备(如
~/.ssh/id_rsa
),需严格保密 - 🔓 公钥(Public Key):可公开分发(如
~/.ssh/id_rsa.pub
),上传至远程服务器
- 🔑 私钥(Private Key):存储在用户本地设备(如
-
工作原理图解
#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服务随机数据
-
密钥安全性依据
算法类型 数学基础 安全强度对比 RSA 大质数分解难题 2048位 ≈ 传统密码100字符 Ed25519 椭圆曲线离散对数问题 256位 ≫ RSA 4096位3 -
核心功能场景
- 免密登录:取代用户名/密码认证(
ssh user@host
) - 数据加密:建立安全隧道传输文件(
scp
,sftp
) - 服务认证:Git 操作、服务器自动化运维
- 免密登录:取代用户名/密码认证(
密钥核心原理
-
非对称加密机制
- 公钥(
id_rsa.pub
)存储在 Git 服务器,私钥(id_rsa
)保存在本地
- 公钥(
-
密钥类型对比
算法类型 安全性 密钥长度 适用场景 RSA ★★★★ 4096 bit 通用兼容 Ed25519 ★★★★★ 256 bit 高性能服务器3
密钥生成与配置流程
- 生成密钥(终端操作)
# 检查现有密钥(无.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
添加注释(通常用邮箱)
- 添加公钥到 Git 服务商
- 复制公钥内容。
- 粘贴到平台:
- GitHub:
Settings → SSH and GPG keys
- GitLab:
Preferences → SSH Keys
- Gitee:
设置 → SSH公钥
- GitHub:
密钥使用与验证
连接测试
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)
~/.ssh
权限为7002. 确认公钥已添加到服务器
Host key verification failed
ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts
Key is already in use