Git 使用指南

一、Git 基础概念

1.1 Git 简介

Git 是一个分布式版本控制系统,由 Linus Torvalds 于2005年创建,用于管理 Linux 内核开发。它旨在处理从小型到大型项目的快速和高效版本控制。

1.2 Git 的核心特点

  1. 分布式:这是 Git 与旧系统(如 SVN)最大的不同。
    • 集中式(如 SVN):所有人的代码都保存在中央服务器。没有网络或服务器挂了,就无法提交。
    • 分布式(Git):每个开发者的电脑上都有一个完整的仓库克隆,包含全部历史记录。你可以在本地提交、创建分支,等有网时再同步到远程服务器(如 GitHub、GitLab)。这更安全、更灵活。
  2. 速度快:绝大多数操作在本地完成,无需连接网络,因此极其迅速。
  3. 分支管理强大:分支是 Git 的"杀手级"功能。
    • 可以瞬间创建一个新的分支(想象成一条平行时间线),在新分支上尝试新功能或修复 Bug,而不会影响主线(main 或 master 分支)。
    • 完成后,可以轻松地将分支合并回主线。这种模式支撑了现代高效的工作流(如 Git Flow)。
  4. 保证完整性:Git 中所有数据在存储前都会计算一个唯一的"哈希值"(如 40位16进制数)。任何文件的细微改动都会导致哈希值巨变。这意味着历史记录不可被篡改,一旦提交,数据丢失的可能性极低。

1.3 Git 基础概念

  1. 仓库(Repository):仓库是 Git 存储项目文件和历史记录的地方。分为本地仓库和远程仓库。
  2. 工作区(Working Directory):本地目录,包含项目的实际文件。
  3. 暂存区(Staging Area / Index):一个中间区域,用于准备提交。只有添加到暂存区的更改才会被包含在下次提交中。
  4. 提交(Commit):提交是项目在某个时间点的快照。每个提交都有一个唯一的 SHA-1 哈希标识。
  5. 分支(Branch):分支是开发线,允许并行开发。默认分支通常是 master 或 main。
  6. 标签(Tag):标签是特定提交的静态引用,常用于版本发布。
  7. 远程(Remote):远程仓库是托管在服务器上的仓库,用于团队协作。

1.4 Git 工作流程

Git 的整个工作流程主要分布在四个区域,其流程只要有以下几步:

  1. 从中央仓库克隆代码到本地工作区。
  2. 在本地工作区进行修改的文件,会临时存放在暂存区 。
  3. 通过git commit命令将暂存区存放的改动过的文件提交到本地仓库中。
  4. 最后再通过git push命令将本地仓库中的改动文件推送到远程仓库中。
bash 复制代码
工作区 (Working Directory)
     ↓ 修改文件
暂存区 (Staging Area)
     ↓ git commit
本地仓库 (Local Repository)
     ↓ git push
远程仓库 (Remote Repository)

对应的基本流程和命令:

bash 复制代码
# 1. 初始化仓库或克隆远程仓库
git init                        # 在当前文件夹新建一个Git仓库
git clone <远程仓库地址>         # 下载一个远程仓库到本地

# 2. 查看状态
git status                      # 查看哪些文件被修改、哪些已暂存

# 3. 添加改动到暂存区
git add <文件名>                # 添加某个特定文件
git add .                       # 添加所有改动过的文件

# 4. 提交到本地仓库
git commit -m "提交的描述信息"   # 提交暂存区的内容,并附上说明

# 5. 同步远程仓库
git push                        # 将本地提交推送到远程服务器
git pull                        # 从远程服务器拉取最新更新并合并到本地
git fetch                       # 仅从远程获取最新信息,但不自动合并

# 6. 分支操作
git branch                      # 查看所有分支
git branch <分支名>             # 创建新分支
git checkout <分支名>           # 切换到某个分支 (旧命令)
git switch <分支名>             # 切换到某个分支 (新推荐命令)
git merge <分支名>              # 将指定分支合并到当前分支

# 7. 查看历史
git log                         # 查看提交历史
git log --oneline --graph       # 以简洁图形化方式查看历史

二、Git 基本配置

2.1 基础配置

bash 复制代码
# 1. 用户身份配置(必须)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

# 2. 编辑器配置
git config --global core.editor "code --wait"  # VS Code
git config --global core.editor "vim"          # Vim

# 3. 行尾符配置(跨平台协作重要!)
git config --global core.autocrlf true         # Windows
git config --global core.autocrlf input        # Linux/Mac

# 4. 别名配置(提高效率)
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# 5. 查看所有配置
git config --list --show-origin

# 6. 配置文件位置
# 系统级: /etc/gitconfig
# 用户级: ~/.gitconfig 或 ~/.config/git/config
# 仓库级: .git/config

2.2 SSH 密钥配置(GitHub/GitLab)

bash 复制代码
# 1. 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或使用 RSA:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 2. 启动 SSH 代理
eval "$(ssh-agent -s)"

# 3. 添加私钥到代理
ssh-add ~/.ssh/id_ed25519

# 4. 复制公钥
cat ~/.ssh/id_ed25519.pub

# 5. 添加到 GitHub/GitLab
# GitHub: Settings → SSH and GPG keys → New SSH key
# GitLab: Preferences → SSH Keys

# 6. 测试连接
ssh -T git@github.com
ssh -T git@gitlab.com

三、Git 核心操作详解

3.1 仓库创建与克隆

bash 复制代码
# 创建新仓库
mkdir my-project
cd my-project
git init                      # 初始化仓库
git init --bare              # 创建裸仓库(服务器用)

# 克隆现有仓库
git clone <repository-url>          # 克隆到当前目录
git clone <url> my-project          # 克隆到指定目录
git clone --depth 1 <url>           # 浅克隆(只克隆最新提交)
git clone --branch develop <url>    # 克隆指定分支
git clone --recursive <url>         # 递归克隆子模块

# 查看远程仓库
git remote -v                       # 查看远程仓库地址
git remote show origin              # 查看远程仓库详细信息

3.2 文件状态与基础操作

bash 复制代码
# 检查状态
git status                          # 详细状态
git status -s                       # 简洁状态
git status --ignored               # 显示被忽略的文件

# 添加文件到暂存区
git add README.md                   # 添加单个文件
git add src/                        # 添加目录
git add .                          # 添加所有文件
git add -A                         # 添加所有文件(包括删除的)
git add -u                         # 添加已跟踪文件
git add -p                         # 交互式添加(选择部分修改)

# 提交更改
git commit -m "提交信息"            # 简单提交
git commit -m "标题" -m "详细描述"  # 多行提交信息
git commit -a -m "信息"            # 跳过暂存,提交所有已跟踪文件
git commit --amend                 # 修改上次提交(可改信息或添加文件)
git commit --allow-empty          # 允许空提交

# 查看提交历史
git log                            # 详细日志
git log --oneline                  # 单行显示
git log --graph                    # 图形化显示分支
git log --stat                     # 显示文件变更统计
git log -p                         # 显示具体修改内容
git log --since="2023-01-01"      # 按时间筛选
git log --author="名字"            # 按作者筛选
git log --grep="关键词"            # 按提交信息筛选
git log -S "functionName"         # 搜索代码变更
git log --follow <file>           # 跟踪文件历史(包括重命名)

# 比较差异
git diff                           # 工作区与暂存区差异
git diff --staged                  # 暂存区与上次提交差异
git diff HEAD                      # 工作区与最新提交差异
git diff <commit1> <commit2>      # 两个提交间的差异
git diff --cached                 # 同 --staged
git diff --word-diff              # 单词级差异显示
git diff --color-words           # 彩色单词差异

3.3 分支管理

bash 复制代码
# 查看分支
git branch                         # 查看本地分支
git branch -r                      # 查看远程分支
git branch -a                      # 查看所有分支
git branch -v                      # 查看分支最后提交
git branch --merged               # 查看已合并的分支
git branch --no-merged            # 查看未合并的分支

# 创建分支
git branch feature-branch          # 创建分支
git branch -m old-name new-name   # 重命名分支
git branch -d branch-name         # 删除已合并分支
git branch -D branch-name         # 强制删除分支

# 切换分支
git checkout develop               # 切换到已有分支
git checkout -b feature-branch    # 创建并切换到新分支
git checkout --track origin/develop  # 跟踪远程分支
git switch develop                # Git 2.23+ 推荐方式
git switch -c feature-branch      # 创建并切换(推荐)

# 合并分支
git merge feature-branch           # 合并到当前分支
git merge --no-ff feature-branch  # 禁用 fast-forward,保留合并记录
git merge --squash feature-branch # 压缩合并为单个提交
git merge --abort                 # 中止合并(有冲突时)

# 变基(Rebase)
git rebase develop                 # 将当前分支变基到develop
git rebase -i HEAD~3              # 交互式变基(最近3个提交)
git rebase --continue             # 继续变基(解决冲突后)
git rebase --abort                # 中止变基
git rebase --skip                 # 跳过当前提交

# 标签管理
git tag v1.0.0                    # 创建轻量标签
git tag -a v1.0.0 -m "版本1.0.0"  # 创建附注标签
git tag -d v1.0.0                 # 删除标签
git push origin v1.0.0            # 推送标签到远程
git push origin --tags            # 推送所有标签
git push origin :refs/tags/v1.0.0 # 删除远程标签
git checkout v1.0.0               # 切换到标签
git show v1.0.0                   # 查看标签信息

3.4 远程仓库操作

bash 复制代码
# 添加远程仓库
git remote add origin <url>        # 添加远程仓库
git remote set-url origin <new-url> # 修改远程仓库地址
git remote remove origin          # 删除远程仓库

# 拉取代码
git pull                          # 拉取并合并(相当于 fetch + merge)
git pull origin develop           # 拉取指定分支
git pull --rebase                # 拉取并使用 rebase
git fetch                        # 仅获取,不合并
git fetch --prune                # 获取并清理已删除的远程分支
git fetch --all                  # 获取所有远程仓库

# 推送代码
git push                          # 推送到默认分支
git push origin develop           # 推送到指定分支
git push -u origin develop       # 推送并设置 upstream
git push --force                 # 强制推送(谨慎使用!)
git push --force-with-lease      # 安全强制推送(推荐)
git push --delete origin branch-name  # 删除远程分支
git push origin --tags           # 推送所有标签

# 跟踪分支
git branch -u origin/develop     # 设置当前分支跟踪远程分支
git branch -vv                   # 查看跟踪关系

四、高级操作与技巧

4.1 撤销与重置

bash 复制代码
# 撤销工作区的修改
git checkout -- file.txt          # 丢弃工作区修改
git checkout .                   # 丢弃所有修改
git clean -fd                    # 删除未跟踪的文件和目录
git clean -n                     # 预览将要删除的文件

# 撤销暂存区的修改
git reset HEAD file.txt          # 从暂存区移除文件
git reset .                     # 从暂存区移除所有文件

# 撤销提交
git reset --soft HEAD~1         # 撤销提交,保留修改到暂存区
git reset --mixed HEAD~1        # 撤销提交,保留修改到工作区(默认)
git reset --hard HEAD~1         # 彻底丢弃提交和修改(危险!)
git revert <commit-hash>        # 创建新的提交来撤销之前的提交(安全)

# 恢复删除的文件
git checkout HEAD -- file.txt    # 恢复已删除的文件
git checkout <commit> -- file.txt # 从特定提交恢复文件

4.2 暂存和恢复

bash 复制代码
# 暂存当前工作(临时保存修改)
git stash                        # 暂存所有修改
git stash save "message"         # 暂存并添加描述
git stash -u                     # 暂存包括未跟踪的文件
git stash -a                     # 暂存所有文件(包括忽略的文件)

# 查看和应用暂存
git stash list                   # 查看所有暂存
git stash show stash@{0}         # 查看某个暂存的内容
git stash apply stash@{0}        # 应用某个暂存(不删除)
git stash pop                    # 应用最新暂存并删除
git stash drop stash@{0}         # 删除某个暂存
git stash clear                  # 清除所有暂存

4.3 子模块

bash 复制代码
# 添加子模块
git submodule add <repository-url> path/to/submodule
git submodule add --name custom-name <url> <path>

# 克隆包含子模块的项目
git clone <repository-url>
git submodule init              # 初始化子模块
git submodule update            # 更新子模块
# 或一步完成:git clone --recursive <url>

# 子模块操作
git submodule update --remote   # 更新子模块到最新提交
git submodule foreach 'git pull origin main'  # 批量操作子模块
git submodule deinit path/to/submodule  # 反初始化子模块
git submodule sync             # 同步子模块URL

# 子模块更新提交
cd submodule-directory
git checkout main
git pull
cd ..
git add submodule-directory
git commit -m "更新子模块"

4.4 钩子

bash 复制代码
# 客户端钩子位置:.git/hooks/
# 常用钩子:
# pre-commit        提交前执行(代码检查)
# prepare-commit-msg 准备提交信息时
# commit-msg        提交信息保存后
# post-commit       提交完成后
# pre-push          推送前执行

# 示例:pre-commit 钩子
#!/bin/sh
# .git/hooks/pre-commit
echo "Running pre-commit checks..."

# 运行代码检查
npm run lint
if [ $? -ne 0 ]; then
    echo "Lint检查失败!"
    exit 1
fi

# 运行测试
npm test
if [ $? -ne 0 ]; then
    echo "测试失败!"
    exit 1
fi

echo "所有检查通过!"

# 使钩子可执行
chmod +x .git/hooks/pre-commit

# 使用预提交框架(推荐)
# https://pre-commit.com/
pip install pre-commit
pre-commit install

五、实用工作流示例

5.1 日常开发流程

bash 复制代码
# 1. 开始新功能开发
git switch main                  # 切换到主分支
git pull origin main             # 获取最新代码
git switch -c feature/new-login  # 创建并切换到新功能分支

# 2. 日常开发
git add .                        # 添加修改
git commit -m "实现登录功能"      # 提交修改
# ... 重复多次

# 3. 完成功能,准备合并
git switch main                  # 切换到主分支
git pull origin main             # 再次更新
git switch feature/new-login     # 回到功能分支
git rebase main                  # 变基到主分支(保持历史线性)
# 或使用 merge
git merge main                   # 合并主分支到功能分支

# 4. 推送到远程并创建PR
git push -u origin feature/new-login
# 然后在GitHub/GitLab上创建Pull Request

5.2 修复线上Bug

bash 复制代码
# 1. 基于主分支创建热修复分支
git switch main
git pull origin main
git switch -c hotfix/critical-bug

# 2. 修复并提交
# ... 修复代码 ...
git add .
git commit -m "修复XX问题"

# 3. 测试后合并
git switch main
git merge --no-ff hotfix/critical-bug
git tag -a v1.0.1 -m "修复版本1.0.1"
git push origin main --tags

# 4. 同步到开发分支
git switch develop
git merge main

5.3 清理本地分支

bash 复制代码
# 删除已合并的本地分支
git branch --merged | grep -v "\*" | grep -v "main" | xargs -n 1 git branch -d

# 删除远程已删除分支的本地引用
git fetch --prune

5.4 最佳实践建议

  1. 提交规范
    • 使用有意义的提交信息
    • 遵循约定式提交(Conventional Commits)
    • 单次提交只做一件事
  2. 分支策略
    • main/master:生产代码
    • develop:开发主分支
    • feature/*:功能开发分支
    • hotfix/*:紧急修复分支
    • release/*:发布分支
  3. 工作习惯
    • 频繁提交,小步快跑
    • 提交前先拉取最新代码
    • 使用Pull Request进行代码审查
    • 定期清理无用分支
  4. 安全注意
    • 慎用 git push --force
    • 重要分支设置保护规则
    • 备份重要分支的提交哈希值

六、Git 配置优化

6.1 .gitconfig 配置文件示例

bash 复制代码
[user]
    name = Your Name
    email = your.email@example.com
    
[core]
    editor = code --wait
    autocrlf = input  # Mac/Linux
    # autocrlf = true  # Windows
    
[alias]
    co = checkout
    ci = commit
    st = status
    br = branch
    hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
    type = cat-file -t
    dump = cat-file -p
    
[pull]
    rebase = false  # 设置pull的默认行为
    
[push]
    default = simple
    
[color]
    ui = auto

6.2 .gitignore 文件示例

bash 复制代码
# 系统文件
.DS_Store
Thumbs.db

# 依赖目录
node_modules/
vendor/
dist/
build/

# 环境文件
.env
.env.local
.env.production

# 编辑器
.vscode/
.idea/
*.swp
*.swo

# 日志
*.log
npm-debug.log*

# 系统特定
*.exe
*.dll
*.so
*.dylib
相关推荐
XiaoHu02079 小时前
Linux多线程(详细全解)
linux·运维·服务器·开发语言·c++·git
*才华有限公司*10 小时前
RTSP视频流播放系统
java·git·websocket·网络协议·信息与通信
juelianhuayao11 小时前
Git错误提交后如何快速删除本次commit
git
chen<>11 小时前
Git原理与应用
大数据·git·elasticsearch·svn
小兔崽子去哪了12 小时前
Git 专题
git
金米kk12 小时前
git pull时报错Your local changes to the following files would…的解决办法
git
超级罗伯特12 小时前
git一次性完成仓库下载及所有分支获取
git·git仓库拉取
BUTCHER513 小时前
Git 基础命令
git
M malloc13 小时前
当你有两个git账号时,此时你gitpush冲突后如何解决push问题
git