Git 简介
Git 是一种分布式版本控制系统(DVCS),其核心优势在于:
- 去中心化:每个开发者拥有完整的仓库副本(含完整历史记录)
- 高性能:本地操作(如提交、分支切换)不依赖网络,响应速度快
- 容灾性强:任意节点损坏均可从其他节点恢复
版本控制
版本控制定义
**版本控制是管理系统文件变更历史的工具与流程,其核心特征包括:
- 全生命周期跟踪:记录文件从创建到迭代的所有修改状态
- 变更溯源机制:每个修改节点包含作者、时间、变更内容等元数据
- 多版本共存:支持不同版本文件并行存在并通过标识隔离(如分支/tag)
- 协同基础层:提供多人协作冲突解决机制(如合并/回滚)
核心作用解析
全流程追踪能力
-
变更可视化:
bashgit log --graph # 查看提交历史拓扑图[^1] git blame file.c # 定位每行代码的最后修改者
-
差异对比:
bashgit diff v1.2..v1.3 # 比较两个版本间的代码变更
并行开发支撑
-
分支隔离:
主线分支 功能分支1 修复分支2 合并到主线
-
多版本共存 :生产环境运行
v2.0
时,开发者可同时在v3.0-beta
分支推进新功能
安全与灾难恢复
-
错误操作回退:
bashgit reset --hard HEAD~1 # 撤销最近1次提交 git revert C0A1B2D # 创建新提交抵消指定提交
-
数据冗余存储:分布式系统(如 Git)每个节点含完整历史记录,单点损坏不影响全局
团队协作标准化
-
冲突解决流程:
1. 用户A修改文件第10行 → 提交 2. 用户B修改同文件第10行 → 提交时提示冲突 3. 人工选择保留A/B的修改或融合两者
-
自动化流程集成:支持 CI/CD 工具(如 Jenkins)在代码提交时自动触发测试
为什么需要版本控制
- 避免人为错误导致灾难
- 典型案例:开发误删关键文件且无备份 → 通过版本历史秒级恢复
- 数据统计 :据 Perforce 调查,未使用版本控制的团队代码丢失率高达37%
- 解决协作冲突的必要手段
当多人修改同一文件时,系统自动标识冲突点:
java
<<<<<<< HEAD
int api_version = 2; // 当前本地版本
=======
int api_version = 3; // 他人提交的远程版本
>>>>>>> new-feature
- 满足合规与审计要求
-
金融/医疗等行业强制要求代码修改可追溯(如 FDA 21 CFR Part 11)
-
精确追踪生产环境问题到具体提交:
bashgit bisect start # 通过二分定位引入Bug的提交
- 技术演进的基础设施
-
支持灰度发布:通过标签控制版本路由
api.tp5.com/v2/user → 指向v2.3.1标签的代码[^1]
-
实验性开发:创建临时分支验证新技术方案(失败可直接删除)
Git 核心组件
工作流程依赖四大区域:
区域 | 作用 | 操作命令 |
---|---|---|
工作区 | 用户直接编辑文件的目录 | 直接修改文件 |
暂存区 | 临时存储已修改的文件(准备提交的缓冲区) | git add <file> |
本地仓库 | 存储所有提交记录和元数据(在 .git 目录) |
git commit -m "msg" |
远程仓库 | 云端共享仓库(GitHub/Gitee 等) | git push / git pull |
流程关系图:
(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),分支为指向提交的指针
Commit A Commit B 新分支指针 Commit D
Git 核心功能与用途
核心功能
功能类别 | 典型场景 | 命令示例 |
---|---|---|
版本追踪 | 记录文件修改历史 | git log / git diff |
分支管理 | 并行开发不同功能 | git branch / git merge |
远程协作 | 多人协作代码共享 | git clone / git fetch |
错误修复 | 撤销错误提交或修改 | git reset / git revert |
核心应用场景
-
个人开发:
bashgit init # 初始化仓库 git add main.py # 添加修改到暂存区 git commit -m "实现登录功能" # 提交到本地仓库[^2]
-
团队协作:
bashgit clone https://gitee.com/project.git # 克隆远程仓库 git checkout -b feature # 新建分支开发 git push origin feature # 推送分支到远程
-
版本回退(紧急修复):
bashgit reset --hard HEAD~2 # 回退到前2个提交[警告:慎用] git push -f # 强制覆盖远程(需团队协商)
Git 核心优势
-
高效处理大型项目
文件变更检测算法优化(如 SHA-1 哈希),支持百万级文件管理
-
离线工作能力
本地仓库完整独立,无网络仍可提交/分支切换
-
协作流程标准化
通过 Pull Request 等机制实现代码审查与自动化测试集成
Git 常用命令
初始化和配置
bash
# 初始化新仓库
git init
# 配置用户信息(全局生效)
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# 查看所有配置
git config --list
工作区操作
bash
# 查看文件状态(未跟踪/已修改/已暂存)
git status
# 添加文件到暂存区
git add filename.txt # 添加单个文件
git add . # 添加所有修改
# 提交更改到本地仓库
git commit -m "提交说明"
# 删除文件(同时从工作区和暂存区删除)
git rm filename.txt
版本控制
bash
# 查看提交历史
git log # 完整历史
git log --oneline # 简洁历史
# 回退到指定版本
git reset --hard commit_id
# 查看文件差异
git diff # 工作区与暂存区差异
git diff --cached # 暂存区与仓库差异
分支管理
bash
# 创建新分支
git branch new-feature
# 切换分支
git checkout new-feature
git checkout -b hotfix # 创建并切换
# 合并分支(当前分支合并目标分支)
git merge feature-branch
# 删除分支
git branch -d old-branch
远程仓库
bash
# 添加远程仓库
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
文件指定忽略规则:
gitignore
# 忽略所有日志文件
*.log
# 忽略node_modules目录
node_modules/
# 例外规则(不忽略重要.log文件)
!important.log
Git 分支
分支核心概念
-
分支本质
Git 分支是轻量化的移动指针,指向特定的提交对象。创建分支仅增加一个指针文件(约40字节):
ref: refs/heads/main // 分支指针文件内容
-
关键操作
bashgit branch feature # 创建分支 git checkout -b hotfix # 创建并切换分支 git branch -d dev # 安全删除分支 git branch -D tmp # 强制删除未合并分支 [^1]
-
分支合并流程
git checkout -b feature git checkout main git merge feature main feature Commit A Commit B main 新合并提交
冲突处理全流程
-
冲突触发场景
当两个分支修改同一文件的相同区域时触发,如:
diff<<<<<<< HEAD main分支修改内容 ======= feature分支修改内容 >>>>>>> feature
-
手动解决步骤
bash# 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 -
实践
bash# 更新本地分支避免冲突 git checkout feature git fetch origin git rebase origin/main # 线性化历史 # 提交前本地验证 git push --force-with-lease # 安全强制推送
Git rebase
功能概述
git rebase
的核心功能是重写提交历史,通过将分支的提交"移植"到新的基础提交上,实现:
- 线性化历史:消除不必要的合并提交,生成更清晰的提交链
- 分支同步:将特性分支的修改基于目标分支的最新状态重新应用
- 提交整理 :支持合并(
-i
)、修改(edit
)或删除历史提交
基础语法
bash
git rebase <目标分支> # 将当前分支移植到目标分支最新提交
git rebase -i HEAD~3 # 交互式重写最近3个提交
# 继续或终止操作
git rebase --continue # 继续重写
git rebase --abort # 完全放弃并还原状态 [^1][^2]
与 merge 对比
特性 | Rebase | Merge |
---|---|---|
历史记录 | 线性简洁 | 保留合并提交 |
冲突处理 | 按提交逐一解决 | 一次性统一解决 |
适用场景 | 个人分支/整理历史 | 公共分支/团队协作 |
安全性 | 禁止在公共分支使用 | 所有场景可用 |
SSH 秘钥
核心概念
-
基本定义
SSH密钥是一种非对称加密技术的密钥对,由两部分组成:
- 🔑 私钥(Private Key) :存储在用户本地设备(如
~/.ssh/id_rsa
),需严格保密 - 🔓 公钥(Public Key) :可公开分发(如
~/.ssh/id_rsa.pub
),上传至远程服务器
- 🔑 私钥(Private Key) :存储在用户本地设备(如
-
工作原理图解
- 生成密钥对 2. 复制公钥 3. 存入authorized_keys 4. 连接请求 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
密钥生成与配置流程
- 生成密钥(终端操作)
bash
# 检查现有密钥(无.ssh目录需创建)
ls -al ~/.ssh # [^2]
# 生成Ed25519密钥
ssh-keygen -t ed25519 -C "[email protected]"
# 或生成RSA密钥
ssh-keygen -t rsa -b 4096 -C "[email protected]"
参数说明:
-t
指定加密算法-b
设置密钥长度(RSA专用)-C
添加注释(通常用邮箱)
- 添加公钥到 Git 服务商
- 复制公钥内容。
- 粘贴到平台:
- GitHub:
Settings → SSH and GPG keys
- GitLab:
Preferences → SSH Keys
- Gitee:
设置 → SSH公钥
- GitHub:
密钥使用与验证
连接测试
bash
ssh -T [email protected] # GitHub
ssh -T [email protected] # GitLab
成功响应示例:
Hi username! You've successfully authenticated...
仓库操作示例
bash
# 克隆SSH协议仓库
git clone [email protected]:user/repo.git
# 修改远程URL为SSH
git remote set-url origin [email protected]: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 |
重新生成密钥并替换旧公钥 |