Git 是一种分布式版本控制系统(DVCS),其核心优势在于:
**版本控制是管理系统文件变更历史的工具与流程,其核心特征包括:
变更可视化:
git log --graph # 查看提交历史拓扑图[^1]
git blame file.c # 定位每行代码的最后修改者
差异对比:
git diff v1.2..v1.3 # 比较两个版本间的代码变更
分支隔离:
多版本共存:生产环境运行 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)在代码提交时自动触发测试
当多人修改同一文件时,系统自动标识冲突点:
<<<<<<< HEAD
int 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 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),分支为指向提交的指针
功能类别 | 典型场景 | 命令示例 |
---|---|---|
版本追踪 | 记录文件修改历史 | 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 # 强制覆盖远程(需团队协商)
高效处理大型项目
文件变更检测算法优化(如 SHA-1 哈希),支持百万级文件管理
离线工作能力
本地仓库完整独立,无网络仍可提交/分支切换
协作流程标准化
通过 Pull Request 等机制实现代码审查与自动化测试集成
# 初始化新仓库
git init
# 配置用户信息(全局生效)
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# 查看所有配置
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-feature
git 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
文件指定忽略规则:
# 忽略所有日志文件
*.log
# 忽略node_modules目录
node_modules/
# 例外规则(不忽略重要.log文件)
!important.log
分支本质
Git 分支是轻量化的移动指针,指向特定的提交对象。创建分支仅增加一个指针文件(约40字节):
ref: refs/heads/main // 分支指针文件内容
关键操作
git branch feature # 创建分支
git checkout -b hotfix # 创建并切换分支
git branch -d dev # 安全删除分支
git branch -D tmp # 强制删除未合并分支 [^1]
分支合并流程
冲突触发场景
当两个分支修改同一文件的相同区域时触发,如:
<<<<<<< HEAD
main分支修改内容
=======
feature分支修改内容
>>>>>>> feature
手动解决步骤
# 1. 定位冲突文件(git status)
# 2. 编辑文件删除冲突标记
# 3. 标记为已解决
git add resolved-file.js
# 4. 完成合并
git commit -m "Merge fix"
高级工具
git mergetool
调用外部工具git rerere
(重用记录的分辨率)自动处理重复冲突分支保护策略
分支类型 | 保护规则 | 操作限制 |
---|---|---|
main | 强制代码评审 | 禁止直接 push |
release | 只允许 hotfix 合并 | 禁止 rebase |
feature | 定期同步 main 分支 | 允许强制 push |
实践
# 更新本地分支避免冲突
git checkout feature
git fetch origin
git rebase origin/main # 线性化历史
# 提交前本地验证
git push --force-with-lease # 安全强制推送
git rebase
的核心功能是重写提交历史,通过将分支的提交“移植”到新的基础提交上,实现:
-i
)、修改(edit
)或删除历史提交git rebase <目标分支> # 将当前分支移植到目标分支最新提交
git rebase -i HEAD~3 # 交互式重写最近3个提交
# 继续或终止操作
git rebase --continue # 继续重写
git rebase --abort # 完全放弃并还原状态 [^1][^2]
特性 | Rebase | Merge |
---|---|---|
历史记录 | 线性简洁 | 保留合并提交 |
冲突处理 | 按提交逐一解决 | 一次性统一解决 |
适用场景 | 个人分支/整理历史 | 公共分支/团队协作 |
安全性 | 禁止在公共分支使用 | 所有场景可用 |
基本定义
SSH密钥是一种非对称加密技术的密钥对,由两部分组成:
~/.ssh/id_rsa
),需严格保密~/.ssh/id_rsa.pub
),上传至远程服务器工作原理图解
密钥安全性依据
算法类型 | 数学基础 | 安全强度对比 |
---|---|---|
RSA | 大质数分解难题 | 2048位 ≈ 传统密码100字符 |
Ed25519 | 椭圆曲线离散对数问题 | 256位 ≫ RSA 4096位3 |
核心功能场景
ssh user@host
)scp
,sftp
)非对称加密机制
id_rsa.pub
)存储在 Git 服务器,私钥(id_rsa
)保存在本地密钥类型对比
算法类型 | 安全性 | 密钥长度 | 适用场景 |
---|---|---|---|
RSA | ★★★★ | 4096 bit | 通用兼容 |
Ed25519 | ★★★★★ | 256 bit | 高性能服务器3 |
# 检查现有密钥(无.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
添加注释(通常用邮箱)Settings → SSH and GPG keys
Preferences → SSH Keys
设置 → SSH公钥
ssh -T [email protected] # GitHub
ssh -T [email protected] # GitLab
成功响应示例:
Hi username! You've successfully authenticated...
# 克隆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 权限为7002. 确认公钥已添加到服务器 |
Host key verification failed |
ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts |
Key is already in use |
重新生成密钥并替换旧公钥 |