git 学习

发布于:2025-06-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

Git 简介

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

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

版本控制

版本控制定义

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

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

核心作用解析

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

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

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

    主线分支
    功能分支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. 解决协作冲突的必要手段

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

<<<<<<< HEAD
int 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 <file>
本地仓库 存储所有提交记录和元数据(在 .git 目录) git commit -m "msg"
远程仓库 云端共享仓库(GitHub/Gitee 等) git push / git pull

流程关系图:

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

核心应用场景

  • 个人开发

    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-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)

创建 .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. 分支合并流程

    git checkout -b feature
    git checkout main
    git merge feature
    main
    feature
    Commit A
    Commit B
    main
    新合并提交

冲突处理全流程

  1. 冲突触发场景

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

    <<<<<<< HEAD
    main分支修改内容
    =======
    feature分支修改内容
    >>>>>>> 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 feature
    git fetch origin
    git 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. 工作原理图解

    1. 生成密钥对
    2. 复制公钥
    3. 存入authorized_keys
    4. 连接请求
    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        # GitHub
ssh -T git@gitlab.com        # GitLab

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

仓库操作示例

# 克隆SSH协议仓库
git clone git@github.com:user/repo.git

# 修改远程URL为SSH
git 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 重新生成密钥并替换旧公钥