Git 完全指南:从入门到精通

Git 完全指南:从入门到精通

本文详细介绍 Git 版本控制系统的使用方法,涵盖基础概念、日常操作、分支管理、团队协作等核心内容。

文章目录

  • [Git 完全指南:从入门到精通](#Git 完全指南:从入门到精通)
    • [1. Git 简介](#1. Git 简介)
      • [1.1 什么是 Git?](#1.1 什么是 Git?)
      • [1.2 Git vs 其他版本控制系统](#1.2 Git vs 其他版本控制系统)
    • [2. 安装与配置](#2. 安装与配置)
      • [2.1 安装 Git](#2.1 安装 Git)
      • [2.2 验证安装](#2.2 验证安装)
      • [2.3 初始配置](#2.3 初始配置)
      • [2.4 查看配置](#2.4 查看配置)
      • [2.5 配置 SSH 密钥](#2.5 配置 SSH 密钥)
    • [3. 基础概念](#3. 基础概念)
      • [3.1 Git 的三个区域](#3.1 Git 的三个区域)
      • [3.2 文件状态](#3.2 文件状态)
      • [3.3 Git 对象](#3.3 Git 对象)
    • [4. 基本操作](#4. 基本操作)
      • [4.1 创建仓库](#4.1 创建仓库)
      • [4.2 查看状态](#4.2 查看状态)
      • [4.3 添加文件到暂存区](#4.3 添加文件到暂存区)
      • [4.4 提交更改](#4.4 提交更改)
      • [4.5 查看历史](#4.5 查看历史)
      • [4.6 查看差异](#4.6 查看差异)
      • [4.7 .gitignore 文件](#4.7 .gitignore 文件)
    • [5. 分支管理](#5. 分支管理)
      • [5.1 分支基础](#5.1 分支基础)
      • [5.2 创建与切换分支](#5.2 创建与切换分支)
      • [5.3 合并分支](#5.3 合并分支)
      • [5.4 变基 (Rebase)](#5.4 变基 (Rebase))
      • [5.5 删除分支](#5.5 删除分支)
      • [5.6 储藏 (Stash)](#5.6 储藏 (Stash))
    • [6. 远程仓库](#6. 远程仓库)
      • [6.1 管理远程仓库](#6.1 管理远程仓库)
      • [6.2 拉取与推送](#6.2 拉取与推送)
      • [6.3 跟踪分支](#6.3 跟踪分支)
    • [7. 撤销与回退](#7. 撤销与回退)
      • [7.1 撤销工作目录的修改](#7.1 撤销工作目录的修改)
      • [7.2 撤销暂存](#7.2 撤销暂存)
      • [7.3 回退提交](#7.3 回退提交)
      • [7.4 创建撤销提交](#7.4 创建撤销提交)
      • [7.5 恢复删除的提交](#7.5 恢复删除的提交)
    • [8. 高级技巧](#8. 高级技巧)
      • [8.1 Cherry-pick](#8.1 Cherry-pick)
      • [8.2 标签管理](#8.2 标签管理)
      • [8.3 子模块](#8.3 子模块)
      • [8.4 Git Bisect](#8.4 Git Bisect)
      • [8.5 Git Blame](#8.5 Git Blame)
      • [8.6 Git Hooks](#8.6 Git Hooks)
      • [8.7 Git Worktree](#8.7 Git Worktree)
    • [9. 团队协作工作流](#9. 团队协作工作流)
      • [9.1 Git Flow](#9.1 Git Flow)
      • [9.2 GitHub Flow](#9.2 GitHub Flow)
      • [9.3 Trunk-Based Development](#9.3 Trunk-Based Development)
      • [9.4 Fork 工作流](#9.4 Fork 工作流)
    • [10. 常见问题解决](#10. 常见问题解决)
      • [10.1 合并冲突](#10.1 合并冲突)
      • [10.2 误删分支恢复](#10.2 误删分支恢复)
      • [10.3 大文件处理](#10.3 大文件处理)
      • [10.4 清理仓库](#10.4 清理仓库)
      • [10.5 修改历史提交](#10.5 修改历史提交)
      • [10.6 统计信息](#10.6 统计信息)
    • 附录:常用命令速查表

1. Git 简介

1.1 什么是 Git?

Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,最初用于管理 Linux 内核开发。它具有以下特点:

  • 分布式架构:每个开发者都拥有完整的代码仓库副本
  • 高性能:几乎所有操作都在本地执行,速度极快
  • 数据完整性:使用 SHA-1 哈希确保数据完整性
  • 支持非线性开发:强大的分支和合并能力

1.2 Git vs 其他版本控制系统

特性 Git SVN CVS
架构 分布式 集中式 集中式
离线工作 ✅ 完全支持 ❌ 需要网络 ❌ 需要网络
分支开销 极低 较高
速度 极快 中等

2. 安装与配置

2.1 安装 Git

Linux (Debian/Ubuntu):

bash 复制代码
sudo apt update
sudo apt install git

Linux (CentOS/RHEL):

bash 复制代码
sudo yum install git
# 或者
sudo dnf install git

macOS:

bash 复制代码
# 使用 Homebrew
brew install git

# 或者安装 Xcode Command Line Tools
xcode-select --install

Windows:

2.2 验证安装

bash 复制代码
git --version
# 输出示例: git version 2.43.0

2.3 初始配置

安装完成后,需要配置用户信息:

bash 复制代码
# 设置用户名(必须)
git config --global user.name "你的名字"

# 设置邮箱(必须)
git config --global user.email "your.email@example.com"

# 设置默认编辑器
git config --global core.editor "vim"
# 或者使用 VS Code
git config --global core.editor "code --wait"

# 设置默认分支名称
git config --global init.defaultBranch main

# 配置换行符处理(跨平台协作时很重要)
# Linux/macOS
git config --global core.autocrlf input
# Windows
git config --global core.autocrlf true

# 启用颜色输出
git config --global color.ui auto

2.4 查看配置

bash 复制代码
# 查看所有配置
git config --list

# 查看特定配置
git config user.name

# 查看配置来源
git config --list --show-origin

2.5 配置 SSH 密钥

bash 复制代码
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your.email@example.com"

# 启动 ssh-agent
eval "$(ssh-agent -s)"

# 添加私钥
ssh-add ~/.ssh/id_ed25519

# 查看公钥(复制到 GitHub/GitLab)
cat ~/.ssh/id_ed25519.pub

3. 基础概念

3.1 Git 的三个区域

复制代码
┌─────────────────────────────────────────────────────────────┐
│                      工作目录 (Working Directory)            │
│                         你编辑文件的地方                      │
└─────────────────────────────────────────────────────────────┘
                              │
                              │ git add
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      暂存区 (Staging Area / Index)           │
│                       准备提交的文件快照                      │
└─────────────────────────────────────────────────────────────┘
                              │
                              │ git commit
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      本地仓库 (Repository / .git)            │
│                       完整的版本历史记录                      │
└─────────────────────────────────────────────────────────────┘

3.2 文件状态

Git 中的文件有四种状态:

  1. 未跟踪 (Untracked):新文件,Git 还不知道它的存在

  2. 未修改 (Unmodified):文件已被跟踪,但没有改动

  3. 已修改 (Modified):文件已修改,但还未暂存

  4. 已暂存 (Staged):文件已添加到暂存区,等待提交

    Untracked ──git add──> Staged
    │ │
    │ │ git commit
    │ ▼
    │ Unmodified
    │ │
    │ │ 编辑文件
    │ ▼
    │ Modified
    │ │
    └─────────────────────┘
    git add

3.3 Git 对象

Git 内部使用三种主要对象:

  • Blob:存储文件内容
  • Tree:存储目录结构
  • Commit:存储提交信息,指向 tree 和父提交

4. 基本操作

4.1 创建仓库

bash 复制代码
# 方式一:初始化新仓库
mkdir my-project
cd my-project
git init

# 方式二:克隆现有仓库
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git  # SSH 方式

# 克隆到指定目录
git clone https://github.com/user/repo.git my-folder

# 浅克隆(只获取最近的历史,适合大型仓库)
git clone --depth 1 https://github.com/user/repo.git

4.2 查看状态

bash 复制代码
# 查看完整状态
git status

# 简洁模式
git status -s
# 输出示例:
#  M README.md      # 已修改,未暂存
# M  src/main.cpp   # 已修改,已暂存
# MM config.json    # 暂存后又修改
# ?? new-file.txt   # 未跟踪
# A  added.txt      # 新添加到暂存区
# D  deleted.txt    # 已删除

4.3 添加文件到暂存区

bash 复制代码
# 添加单个文件
git add filename.txt

# 添加多个文件
git add file1.txt file2.txt

# 添加当前目录所有文件
git add .

# 添加所有已跟踪文件的修改
git add -u

# 添加所有文件(包括未跟踪的)
git add -A

# 交互式添加(可以选择性地暂存文件的部分内容)
git add -p

4.4 提交更改

bash 复制代码
# 基本提交
git commit -m "提交信息"

# 添加并提交(仅限已跟踪文件)
git commit -am "提交信息"

# 打开编辑器编写详细提交信息
git commit

# 修改最后一次提交
git commit --amend -m "新的提交信息"

# 修改最后一次提交(不改变提交信息)
git commit --amend --no-edit

提交信息规范(推荐):

复制代码
<类型>(<范围>): <简短描述>

<详细描述>

<关联的 issue>

常用类型:

  • feat: 新功能
  • fix: 修复 bug
  • docs: 文档更新
  • style: 代码格式(不影响功能)
  • refactor: 重构
  • test: 测试相关
  • chore: 构建/工具相关

示例:

复制代码
feat(logger): 添加异步日志支持

- 实现基于无锁队列的异步写入
- 添加配置选项控制队列大小
- 支持优雅关闭,确保日志不丢失

Closes #123

4.5 查看历史

bash 复制代码
# 查看提交历史
git log

# 简洁模式(一行一个提交)
git log --oneline

# 显示分支图
git log --oneline --graph --all

# 显示最近 n 条
git log -n 5

# 显示文件变更统计
git log --stat

# 显示具体改动
git log -p

# 按作者过滤
git log --author="名字"

# 按日期过滤
git log --since="2024-01-01" --until="2024-12-31"

# 按提交信息搜索
git log --grep="关键词"

# 查看某个文件的历史
git log -- path/to/file

# 美化输出格式
git log --pretty=format:"%h - %an, %ar : %s"

4.6 查看差异

bash 复制代码
# 查看工作目录与暂存区的差异
git diff

# 查看暂存区与最后一次提交的差异
git diff --staged
git diff --cached  # 同上

# 查看工作目录与最后一次提交的差异
git diff HEAD

# 比较两个提交
git diff commit1 commit2

# 比较两个分支
git diff branch1 branch2

# 只查看文件名
git diff --name-only

# 查看统计信息
git diff --stat

4.7 .gitignore 文件

创建 .gitignore 文件来忽略不需要跟踪的文件:

gitignore 复制代码
# 编译输出
build/
*.o
*.a
*.so
*.exe

# IDE 配置
.idea/
.vscode/
*.swp

# 依赖目录
node_modules/
vendor/

# 日志文件
*.log
logs/

# 环境配置
.env
.env.local

# 操作系统文件
.DS_Store
Thumbs.db

# 临时文件
*.tmp
*.bak
*~

常用规则语法:

  • * 匹配任意字符
  • ? 匹配单个字符
  • ** 匹配多级目录
  • ! 取反(不忽略)
  • / 开头表示根目录
  • / 结尾表示目录

5. 分支管理

5.1 分支基础

bash 复制代码
# 查看本地分支
git branch

# 查看所有分支(包括远程)
git branch -a

# 查看分支详情
git branch -v

# 查看已合并/未合并的分支
git branch --merged
git branch --no-merged

5.2 创建与切换分支

bash 复制代码
# 创建新分支
git branch feature-login

# 切换分支
git checkout feature-login
# 或者(Git 2.23+)
git switch feature-login

# 创建并切换
git checkout -b feature-login
# 或者
git switch -c feature-login

# 基于特定提交创建分支
git checkout -b hotfix abc1234

# 基于远程分支创建本地分支
git checkout -b feature origin/feature

5.3 合并分支

bash 复制代码
# 切换到目标分支
git checkout main

# 合并分支
git merge feature-login

# 合并时创建合并提交(即使可以快进)
git merge --no-ff feature-login

# 合并时压缩为一个提交
git merge --squash feature-login
git commit -m "合并 feature-login"

合并冲突处理:

bash 复制代码
# 发生冲突时,文件会包含冲突标记
<<<<<<< HEAD
当前分支的内容
=======
要合并分支的内容
>>>>>>> feature-login

# 手动编辑解决冲突后
git add conflicted-file.txt
git commit
# 或者
git merge --continue

# 放弃合并
git merge --abort

5.4 变基 (Rebase)

bash 复制代码
# 将当前分支变基到 main
git rebase main

# 交互式变基(可以编辑、合并、删除提交)
git rebase -i HEAD~3

# 交互式变基命令:
# pick   = 保留提交
# reword = 保留但修改提交信息
# edit   = 保留但停下来修改
# squash = 合并到前一个提交
# fixup  = 合并但丢弃提交信息
# drop   = 删除提交

# 解决变基冲突后继续
git rebase --continue

# 放弃变基
git rebase --abort

⚠️ 注意:不要对已推送的公共分支进行变基!

5.5 删除分支

bash 复制代码
# 删除已合并的本地分支
git branch -d feature-login

# 强制删除分支(未合并也删除)
git branch -D feature-login

# 删除远程分支
git push origin --delete feature-login
# 或者
git push origin :feature-login

5.6 储藏 (Stash)

临时保存工作进度:

bash 复制代码
# 储藏当前修改
git stash

# 储藏并添加描述
git stash save "正在开发登录功能"
# Git 2.13+ 推荐使用
git stash push -m "正在开发登录功能"

# 包含未跟踪文件
git stash -u

# 查看储藏列表
git stash list

# 恢复最近的储藏(保留储藏记录)
git stash apply

# 恢复最近的储藏(删除储藏记录)
git stash pop

# 恢复指定的储藏
git stash apply stash@{2}

# 查看储藏内容
git stash show -p stash@{0}

# 删除储藏
git stash drop stash@{0}

# 清空所有储藏
git stash clear

# 从储藏创建分支
git stash branch new-branch stash@{0}

6. 远程仓库

6.1 管理远程仓库

bash 复制代码
# 查看远程仓库
git remote -v

# 添加远程仓库
git remote add origin https://github.com/user/repo.git
git remote add upstream https://github.com/original/repo.git

# 修改远程仓库 URL
git remote set-url origin git@github.com:user/repo.git

# 重命名远程仓库
git remote rename origin github

# 删除远程仓库
git remote remove upstream

# 查看远程仓库详情
git remote show origin

6.2 拉取与推送

bash 复制代码
# 获取远程更新(不合并)
git fetch origin

# 获取所有远程仓库的更新
git fetch --all

# 拉取并合并
git pull origin main
# 等同于
git fetch origin
git merge origin/main

# 拉取时使用变基
git pull --rebase origin main

# 推送到远程
git push origin main

# 推送并设置上游分支
git push -u origin main
# 之后可以直接使用
git push

# 推送所有分支
git push --all origin

# 推送标签
git push origin v1.0.0
git push --tags  # 推送所有标签

# 强制推送(谨慎使用!)
git push --force origin main
# 更安全的强制推送
git push --force-with-lease origin main

6.3 跟踪分支

bash 复制代码
# 查看跟踪关系
git branch -vv

# 设置跟踪分支
git branch -u origin/main
git branch --set-upstream-to=origin/main

# 创建跟踪分支
git checkout --track origin/feature

7. 撤销与回退

7.1 撤销工作目录的修改

bash 复制代码
# 撤销单个文件的修改
git checkout -- filename.txt
# Git 2.23+
git restore filename.txt

# 撤销所有修改
git checkout -- .
git restore .

7.2 撤销暂存

bash 复制代码
# 取消暂存单个文件
git reset HEAD filename.txt
# Git 2.23+
git restore --staged filename.txt

# 取消暂存所有文件
git reset HEAD
git restore --staged .

7.3 回退提交

bash 复制代码
# 软回退(保留修改在暂存区)
git reset --soft HEAD~1

# 混合回退(保留修改在工作目录,默认)
git reset HEAD~1
git reset --mixed HEAD~1

# 硬回退(丢弃所有修改)⚠️ 危险操作
git reset --hard HEAD~1

# 回退到指定提交
git reset --hard abc1234

7.4 创建撤销提交

bash 复制代码
# 创建一个新提交来撤销指定提交(安全,保留历史)
git revert abc1234

# 撤销多个提交
git revert abc1234 def5678

# 撤销范围
git revert HEAD~3..HEAD

# 撤销但不自动提交
git revert --no-commit abc1234

7.5 恢复删除的提交

bash 复制代码
# 查看所有操作历史
git reflog

# 恢复到之前的状态
git reset --hard HEAD@{2}

# 从 reflog 恢复分支
git checkout -b recovered-branch abc1234

8. 高级技巧

8.1 Cherry-pick

选择性地应用某个提交:

bash 复制代码
# 应用单个提交
git cherry-pick abc1234

# 应用多个提交
git cherry-pick abc1234 def5678

# 应用但不提交
git cherry-pick --no-commit abc1234

# 解决冲突后继续
git cherry-pick --continue

# 放弃
git cherry-pick --abort

8.2 标签管理

bash 复制代码
# 创建轻量标签
git tag v1.0.0

# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本 1.0.0 发布"

# 给历史提交打标签
git tag -a v0.9.0 abc1234 -m "版本 0.9.0"

# 查看标签
git tag
git tag -l "v1.*"

# 查看标签详情
git show v1.0.0

# 删除本地标签
git tag -d v1.0.0

# 删除远程标签
git push origin --delete v1.0.0

8.3 子模块

bash 复制代码
# 添加子模块
git submodule add https://github.com/user/lib.git libs/lib

# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git
# 或者
git clone https://github.com/user/repo.git
git submodule init
git submodule update

# 更新子模块
git submodule update --remote

# 删除子模块
git submodule deinit libs/lib
git rm libs/lib
rm -rf .git/modules/libs/lib

8.4 Git Bisect

二分查找定位问题提交:

bash 复制代码
# 开始二分查找
git bisect start

# 标记当前版本有问题
git bisect bad

# 标记已知正常的版本
git bisect good v1.0.0

# Git 会自动切换到中间的提交
# 测试后标记结果
git bisect good  # 或 git bisect bad

# 重复直到找到问题提交

# 结束查找
git bisect reset

# 自动化测试
git bisect run ./test.sh

8.5 Git Blame

查看每行代码的最后修改者:

bash 复制代码
# 查看文件每行的作者
git blame filename.txt

# 显示行范围
git blame -L 10,20 filename.txt

# 忽略空白变化
git blame -w filename.txt

# 显示原始提交(跟踪代码移动)
git blame -C filename.txt

8.6 Git Hooks

Git 钩子位于 .git/hooks/ 目录:

常用钩子:

  • pre-commit: 提交前执行
  • commit-msg: 检查提交信息
  • pre-push: 推送前执行
  • post-merge: 合并后执行

示例 pre-commit 钩子:

bash 复制代码
#!/bin/bash
# .git/hooks/pre-commit

# 运行代码格式检查
if ! make lint; then
    echo "代码格式检查失败,请修复后再提交"
    exit 1
fi

# 运行测试
if ! make test; then
    echo "测试失败,请修复后再提交"
    exit 1
fi

8.7 Git Worktree

同时在多个分支工作:

bash 复制代码
# 创建新的工作目录
git worktree add ../hotfix hotfix-branch

# 查看工作目录
git worktree list

# 删除工作目录
git worktree remove ../hotfix

# 清理无效的工作目录
git worktree prune

9. 团队协作工作流

9.1 Git Flow

经典的分支管理策略:

复制代码
main ─────────●─────────────────●─────────────────●────
              │                 │                 │
              │    release/1.0  │                 │
              │    ┌────●───────┤                 │
              │    │            │                 │
develop ──●───┼────┼────●───────●─────●───────────┼────
          │   │    │    │             │           │
          │   │    │    │             │           │
feature/a ├───┘    │    │             │           │
                   │    │             │           │
feature/b ─────────┴────┘             │           │
                                      │           │
hotfix/1.0.1 ─────────────────────────┴───────────┘

主要分支:

  • main: 生产环境代码
  • develop: 开发主分支
  • feature/*: 功能分支
  • release/*: 发布准备分支
  • hotfix/*: 紧急修复分支

9.2 GitHub Flow

更简单的工作流:

bash 复制代码
# 1. 从 main 创建功能分支
git checkout main
git pull origin main
git checkout -b feature-xxx

# 2. 开发并提交
git add .
git commit -m "feat: 添加新功能"

# 3. 推送到远程
git push -u origin feature-xxx

# 4. 创建 Pull Request

# 5. 代码审查通过后合并

# 6. 删除功能分支
git checkout main
git pull origin main
git branch -d feature-xxx

9.3 Trunk-Based Development

主干开发模式:

  • 所有开发者直接向 main 提交
  • 使用功能开关控制未完成功能
  • 频繁集成,快速反馈

9.4 Fork 工作流

开源项目常用:

bash 复制代码
# 1. Fork 项目到自己的账户

# 2. 克隆自己的 fork
git clone git@github.com:your-username/repo.git

# 3. 添加上游仓库
git remote add upstream https://github.com/original/repo.git

# 4. 保持同步
git fetch upstream
git checkout main
git merge upstream/main

# 5. 创建功能分支
git checkout -b feature-xxx

# 6. 开发完成后推送到自己的 fork
git push origin feature-xxx

# 7. 创建 Pull Request 到上游仓库

10. 常见问题解决

10.1 合并冲突

bash 复制代码
# 查看冲突文件
git status

# 使用工具解决冲突
git mergetool

# 选择保留某一方的版本
git checkout --ours filename.txt    # 保留当前分支
git checkout --theirs filename.txt  # 保留合并分支

10.2 误删分支恢复

bash 复制代码
# 查找删除的分支
git reflog

# 恢复分支
git checkout -b recovered-branch abc1234

10.3 大文件处理

bash 复制代码
# 安装 Git LFS
git lfs install

# 跟踪大文件
git lfs track "*.psd"
git lfs track "*.zip"

# 查看跟踪的文件类型
git lfs track

# 确保 .gitattributes 被提交
git add .gitattributes

10.4 清理仓库

bash 复制代码
# 清理未跟踪的文件(预览)
git clean -n

# 清理未跟踪的文件
git clean -f

# 包括目录
git clean -fd

# 包括忽略的文件
git clean -fdx

# 垃圾回收
git gc

# 激进的垃圾回收
git gc --aggressive --prune=now

10.5 修改历史提交

bash 复制代码
# 修改最近一次提交的作者
git commit --amend --author="New Name <new@email.com>"

# 修改历史提交的作者(交互式变基)
git rebase -i HEAD~5
# 将要修改的提交标记为 edit
# 然后
git commit --amend --author="New Name <new@email.com>"
git rebase --continue

10.6 统计信息

bash 复制代码
# 查看贡献者统计
git shortlog -sn

# 查看代码行数变化
git diff --stat HEAD~10

# 查看仓库大小
git count-objects -vH

附录:常用命令速查表

命令 说明
git init 初始化仓库
git clone <url> 克隆仓库
git status 查看状态
git add <file> 添加到暂存区
git commit -m "msg" 提交
git push 推送到远程
git pull 拉取并合并
git fetch 获取远程更新
git branch 查看分支
git checkout <branch> 切换分支
git merge <branch> 合并分支
git rebase <branch> 变基
git stash 储藏修改
git log 查看历史
git diff 查看差异
git reset 回退
git revert 撤销提交
git tag 标签管理
git remote 远程仓库管理
相关推荐
XiaoHu02073 小时前
Linux网络编程套接字
linux·服务器·网络·git
AlexDeng3 小时前
Git 实战:我用 git worktree 一次性拉取多个工作目录
git
import_random3 小时前
[git版本控制]git pull origin main
git
ShallowLin4 小时前
Git 的分支管理
git
chen_2277 小时前
搭建git工作流
git
Rabbit_QL11 小时前
【git reset】个人分支一次精准撤回 git push 的实战记录
git
掘金忠实用户程序员11 小时前
Git多仓库协作场景
git
少年攻城狮11 小时前
Git系列---【git拉代码时报getaddrinfo() thread failed to start】
git
cicada1511 小时前
分享一个git日常开发流程
大数据·git·elasticsearch