Git完全使用指南 - 从入门到入坟
Git完全使用指南
- [Git完全使用指南 - 从入门到入坟](#Git完全使用指南 - 从入门到入坟)
第一部分:Git入门基础
1. Git简介
什么是Git
Git是一个分布式版本控制系统,由Linux之父Linus Torvalds于2005年创建。它可以跟踪文件的变化,协调多人协作,并且能够追踪每一个版本的完整性。
主要特点:
- 分布式架构
- 快速的分支操作
- 完整的版本历史
- 强大的合并能力
为什么要使用Git
-
版本控制:
- 记录文件的历史变化
- 随时可以回退到任意版本
- 清晰地了解代码修改历史
-
多人协作:
- 支持多人同时开发
- 有效避免代码冲突
- 方便的代码评审机制
-
分支管理:
- 支持并行开发
- 功能隔离
- 快速切换任务
-
数据安全:
- 分布式存储,数据不易丢失
- 完整的提交历史
- 文件校验机制
Git与SVN的区别
-
分布式vs集中式:
- Git:
- 每个开发者都有完整的版本历史
- 可以离线工作
- 提交速度快
- SVN:
- 历史版本都放在中央服务器
- 需要网络连接
- 操作相对较慢
- Git:
-
分支管理:
- Git:
- 轻量级分支
- 创建和切换快速
- 鼓励分支工作流
- SVN:
- 完整目录复制
- 操作较重
- 分支使用较少
- Git:
Git工作区域
Git有三个主要的工作区域:
-
工作目录(Working Directory):
- 实际持有文件的目录
- 可以直接编辑的地方
- 文件的最新状态
-
暂存区(Staging Area):
- 临时存储区域
- 通过
git add
添加文件 - 准备提交的文件集合
- 也叫索引(Index)
-
本地仓库(Local Repository):
- 通过
git commit
提交的历史记录 - 包含所有版本信息
.git
目录中的内容
- 通过
-
远程仓库(Remote Repository):
- 位于远程服务器
- 用于团队协作
- 通过push/pull交互
Git文件状态
文件在Git中有四种状态:
-
未跟踪(Untracked):
- 新创建的文件
- Git不知道其存在
- 需要通过
git add
加入版本控制
-
已跟踪(Tracked):
- 已修改(Modified):
- 文件已更改但未暂存
- 显示为红色
- 已暂存(Staged):
- 文件已添加到暂存区
- 显示为绿色
- 已提交(Committed):
- 文件已安全保存在本地仓库
- 有完整的版本记录
- 已修改(Modified):
2. 环境搭建
Windows系统安装Git
-
下载安装:
- 访问官网:https://git-scm.com/download/win
- 选择合适的版本(32/64位)
- 下载安装包
-
安装步骤:
- 运行安装程序
- 选择安装位置
- 选择组件(建议全选)
- 选择默认编辑器
- 选择默认分支名称
- 调整PATH环境
-
验证安装:
bash
git --version
基础配置
- 用户信息配置:
bash
# 设置用户名
git config --global user.name "你的名字"
# 设置邮箱
git config --global user.email "你的邮箱"
- 编辑器配置:
bash
# 设置VS Code为默认编辑器
git config --global core.editor "code --wait"
# 设置换行符处理
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Mac/Linux
配置SSH密钥
- 生成密钥:
bash
# 生成新的SSH密钥
ssh-keygen -t rsa -C "你的邮箱"
# 指定文件名(可选)
ssh-keygen -t rsa -b 4096 -C "你的邮箱" -f ~/.ssh/github_key
- 查看公钥:
bash
# 默认密钥
cat ~/.ssh/id_rsa.pub
# 指定密钥
cat ~/.ssh/github_key.pub
-
添加到平台:
- 复制公钥内容
- 访问GitHub/GitLab设置
- 添加SSH密钥
- 测试连接
-
测试连接:
bash
ssh -T git@github.com
Git配置级别
Git有三个配置级别:
- 系统级(System):
bash
git config --system user.name "名字"
# 配置文件位置:/etc/gitconfig
- 全局级(Global):
bash
git config --global user.name "名字"
# 配置文件位置:~/.gitconfig
- 仓库级(Local):
bash
git config --local user.name "名字"
# 配置文件位置:.git/config
常用配置项
bash
# 设置默认编辑器
git config --global core.editor "vim"
# 设置差异比较工具
git config --global diff.tool vimdiff
# 设置颜色输出
git config --global color.ui true
# 设置别名
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 help.autocorrect 1
# 设置默认推送行为
git config --global push.default current
3. 基本命令
创建仓库
初始化新仓库:
bash
git init
示例:创建一个新的项目
bash
# 创建项目文件夹
mkdir my-project
cd my-project
# 初始化Git仓库
git init
# 查看创建的.git目录
ls -la .git
克隆现有仓库:
bash
git clone <仓库地址>
示例:克隆一个GitHub项目
bash
# 克隆项目到当前目录
git clone https://github.com/vuejs/vue.git
# 克隆项目到指定目录
git clone https://github.com/vuejs/vue.git my-vue-project
文件操作
添加单个文件:
bash
git add 文件名
示例:添加一个新的源代码文件
bash
# 创建一个新文件
echo "console.log('Hello World');" > app.js
# 添加到暂存区
git add app.js
# 查看状态确认添加
git status
添加所有文件:
bash
git add .
示例:添加多个新文件
bash
# 创建多个文件
touch index.html styles.css
echo "# My Project" > README.md
# 添加所有新文件
git add .
# 查看添加的文件
git status
提交更改
bash
git commit -m "提交说明"
示例:提交新功能
bash
# 添加并提交单个文件
git add app.js
git commit -m "添加用户登录功能"
# 添加并提交所有更改
git add .
git commit -m "完成首页界面设计"
# 使用详细的提交信息
git commit -m "feat: 添加用户注册功能
- 添加注册表单
- 实现邮箱验证
- 添加密码强度检查"
状态查看
bash
git status
示例:检查工作目录状态
bash
# 创建和修改一些文件
echo "新内容" > test.txt
echo "测试内容" > demo.js
# 查看状态
git status
# 添加部分文件后再次查看状态
git add test.txt
git status
差异比较
bash
git diff
示例:查看文件修改
bash
# 修改一个文件
echo "新的一行" >> README.md
# 查看未暂存的修改
git diff
# 查看已暂存的修改
git add README.md
git diff --cached
# 查看与特定提交的差异
git diff HEAD~1
历史记录
bash
# 查看提交历史
git log
示例:查看项目历史
bash
# 查看简洁的提交历史
git log --oneline
# 查看最近3条提交
git log -3
# 查看指定作者的提交
git log --author="张三"
# 查看某个文件的修改历史
git log -p README.md
# 查看图形化的分支历史
git log --graph --oneline --all
撤销修改
bash
# 撤销工作区的修改
git checkout -- <文件名>
示例:撤销各种修改
bash
# 撤销未暂存的文件修改
echo "错误的修改" > README.md
git checkout -- README.md
# 撤销暂存区的文件
git add wrong.txt
git reset HEAD wrong.txt
# 修改最后一次提交
git add forgotten-file.txt
git commit --amend -m "更新的提交信息"
# 撤销最近一次提交(保留修改)
git reset --soft HEAD^
# 完全撤销最后一次提交(丢弃修改)
git reset --hard HEAD^
第二部分:Git协作开发
4. 分支管理
分支基础概念
分支是Git中最强大的功能之一,它允许我们在不影响主线开发的情况下进行并行开发。
分支类型
- 主分支(main/master):稳定的生产代码
- 开发分支(develop):日常开发集成
- 功能分支(feature):新功能开发
- 修复分支(hotfix):紧急bug修复
- 发布分支(release):版本发布准备
分支生命周期
- 创建:开始新的开发任务
- 开发:在分支上进行修改
- 测试:确保代码质量
- 合并:将改动整合到主线
- 删除:清理不再需要的分支
基础分支操作
创建分支
bash
# 基于当前分支创建新分支
git branch <分支名>
切换分支
bash
# 切换到指定分支
git checkout <分支名>
查看分支
bash
# 查看本地分支
git branch
分支合并
合并策略
bash
# 快进合并(Fast-forward)
git merge <分支名>
合并冲突处理
bash
# 发生冲突时,查看冲突文件
git status
分支管理进阶
分支重命名
bash
# 重命名当前分支
git branch -m <新名称>
分支删除
bash
# 安全删除(已合并的分支)
git branch -d <分支名>
分支整理
bash
# 清理已合并的本地分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
5. 远程仓库操作
远程仓库基础
常见远程仓库平台
- GitHub:最流行的开源平台
- GitLab:支持自托管的完整DevOps平台
- Bitbucket:适合小团队的免费私有仓库
- Gitee:国内优秀的代码托管平台
远程仓库管理
仓库操作
bash
# 查看远程仓库
git remote -v
远程分支关联
bash
# 设置上游分支
git branch --set-upstream-to=origin/<分支名> <本地分支名>
代码同步
获取更新
bash
# 获取远程更新(不合并)
git fetch origin
拉取更新
bash
# 拉取并合并(fetch + merge)
git pull origin <分支名>
推送更改
bash
# 推送到远程分支
git push origin <分支名>
多远程仓库管理
添加多个远程
bash
# 添加GitHub和GitLab远程仓库
git remote add github https://github.com/user/repo.git
镜像仓库
bash
# 推送到多个远程仓库
git push github main
git push gitlab main
远程协作最佳实践
同步工作流
bash
# 1. 更新本地仓库
git checkout main
git fetch origin
冲突预防
- 定期同步主分支
- 小步提交
- 及时沟通
协作技巧
- 使用描述性的分支名
- 保持提交信息清晰
- 遵循团队规范
安全建议
- 使用SSH密钥认证
- 定期更新密码
- 谨慎使用force push
第三部分:Git高级特性
6. 版本控制进阶
储藏操作
基础储藏
bash
# 储藏当前修改
git stash
示例:临时储藏工作进度
bash
# 正在开发新功能
echo "新功能代码" >> feature.js
git add feature.js
# 突然需要修复bug,储藏当前工作
git stash save "正在开发的登录功能"
# 查看储藏列表
git stash list
# 完成bug修复后,恢复之前的工作
git stash pop
储藏管理
bash
# 查看储藏列表
git stash list
示例:管理多个储藏
bash
# 创建多个储藏
git stash save "功能A的修改"
git stash save "功能B的修改"
git stash save "功能C的修改"
# 查看所有储藏
git stash list
# 输出示例:
# stash@{0}: On feature: 功能C的修改
# stash@{1}: On feature: 功能B的修改
# stash@{2}: On feature: 功能A的修改
# 查看特定储藏的内容
git stash show stash@{1} -p
# 应用特定的储藏
git stash apply stash@{1}
# 删除不需要的储藏
git stash drop stash@{2}
# 清理所有储藏
git stash clear
高级储藏
bash
# 储藏未跟踪的文件
git stash -u
示例:高级储藏操作
bash
# 创建新文件(未跟踪)
echo "新页面代码" > new-page.js
# 储藏包含未跟踪的文件
git stash -u
# 交互式储藏
git stash -p # 可以选择性储藏部分改动
# 从储藏创建分支
git stash branch feature/new-login stash@{0}
# 储藏指定文件
git stash push -m "只储藏配置文件" config.json
历史管理
历史修改
bash
# 修改最近的提交
git commit --amend
示例:修改最后的提交
bash
# 初始提交
echo "console.log('Hello');" > app.js
git add app.js
git commit -m "添加应用入口"
# 发现遗漏了文件
echo "// 配置文件" > config.js
git add config.js
git commit --amend -m "添加应用入口和配置文件"
# 只修改提交信息
git commit --amend -m "更好的提交说明"
# 修改作者信息
git commit --amend --author="张三 <zhangsan@example.com>"
变基操作
bash
# 交互式变基
git rebase -i HEAD~3
示例:整理提交历史
bash
# 查看最近的提交
git log --oneline
# 输出示例:
# a1b2c3d 修复登录按钮样式
# e4f5g6h 调整按钮位置
# i7j8k9l 更新按钮颜色
# m0n1o2p 初始化登录界面
# 开始交互式变基
git rebase -i HEAD~4
# 在编辑器中将显示:
# pick m0n1o2p 初始化登录界面
# pick i7j8k9l 更新按钮颜色
# pick e4f5g6h 调整按钮位置
# pick a1b2c3d 修复登录按钮样式
# 将多个提交合并为一个
# 修改为:
# pick m0n1o2p 初始化登录界面
# squash i7j8k9l 更新按钮颜色
# squash e4f5g6h 调整按钮位置
# squash a1b2c3d 修复登录按钮样式
历史清理
示例:清理大文件历史
bash
# 查找大文件
git rev-list --objects --all | grep -f <(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print $1}')
# 删除大文件历史
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch big-file.zip' HEAD
# 清理并回收空间
git reflog expire --expire=now --all
git gc --prune=now
标签管理
标签操作
示例:版本发布管理
bash
# 创建带注释的发布标签
git tag -a v1.0.0 -m "第一个正式版本"
# 给历史版本打标签
git tag -a v0.9.0 9fceb02 -m "测试版本"
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
标签维护 {#tag_maintenance}
bash
# 删除本地标签
git tag -d v0.9.0
# 删除远程标签
git push origin :refs/tags/v0.9.0
# 检出特定版本
git checkout v1.0.0
# 基于标签创建修复分支
git checkout -b hotfix/v1.0.1 v1.0.0
子模块管理
子模块操作
示例:添加公共组件库作为子模块
bash
# 添加子模块
git submodule add https://github.com/company/common-ui.git src/components
# 克隆包含子模块的项目
git clone --recursive https://github.com/company/main-project.git
子模块更新
bash
# 初始化子模块
git submodule init
git submodule update
# 更新所有子模块到最新版本
git submodule update --remote
# 在所有子模块中执行命令
git submodule foreach git pull origin main
子模块维护
bash
# 删除子模块
# 1. 取消注册子模块
git submodule deinit -f src/components
# 2. 从工作区删除子模块
git rm -f src/components
# 3. 删除.git中的子模块记录
rm -rf .git/modules/src/components
7. 大文件处理
Git LFS使用
Git LFS (Large File Storage) 是Git的一个扩展,用于优化大文件的存储和传输。它通过将大文件存储在单独的服务器上,并在Git仓库中只保留文件的引用来实现。
LFS配置
- 安装Git LFS:
bash
# Windows安装(需要先安装Git)
git lfs install
# macOS安装
brew install git-lfs
git lfs install
# Linux安装
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
- 仓库配置:
bash
# 初始化Git LFS
cd your-repository
git lfs install
# 配置跟踪规则
git lfs track "*.psd" # 跟踪PSD文件
git lfs track "*.zip" # 跟踪ZIP文件
git lfs track "videos/**" # 跟踪videos目录下的所有文件
git lfs track "*.png" "*.jpg" # 跟踪多种文件类型
# 查看当前跟踪规则
git lfs track
# 将.gitattributes加入版本控制
git add .gitattributes
git commit -m "build: 配置Git LFS跟踪规则"
LFS操作
- 基本操作:
bash
# 添加大文件
git add large-file.psd
git commit -m "feat: 添加设计稿"
git push origin main
# 克隆带LFS的仓库
git lfs clone https://github.com/user/repo.git
# 拉取LFS文件
git lfs pull
# 检查LFS文件状态
git lfs status
# 查看所有被跟踪的文件
git lfs ls-files
- 高级操作:
bash
# 手动获取指定文件
git lfs fetch --all
git lfs checkout
# 查看文件指纹
git lfs pointer --file="large-file.psd"
# 迁移现有文件到LFS
git lfs migrate import --include="*.psd"
# 查看LFS对象大小
git lfs ls-files --size
- 团队协作:
bash
# 更新LFS缓存
git lfs prune
# 验证LFS文件
git lfs verify
# 锁定文件(防止并发修改)
git lfs lock "design.psd"
# 解锁文件
git lfs unlock "design.psd"
# 查看锁定状态
git lfs locks
LFS管理
- 存储管理:
bash
# 清理未使用的LFS文件
git lfs prune
# 预取LFS文件(预先下载)
git lfs prefetch
# 查看LFS使用情况
git lfs env
- 性能优化:
bash
# 批量操作
git lfs fetch --recent
git lfs prune --recent
# 并行下载
git config lfs.concurrenttransfers 8
# 设置带宽限制
git config lfs.transfer.maxretries 3
git config lfs.transfer.maxverifies 3
- 最佳实践:
- 合理设置跟踪规则
- 定期清理未使用的文件
- 使用文件锁避免冲突
- 配置合适的并发数
- 监控存储空间使用
- 常见问题处理:
bash
# 修复损坏的LFS文件
git lfs fsck
# 重试失败的传输
git lfs push --all origin
# 强制重新下载
git lfs pull --force
# 诊断问题
git lfs logs last
- 迁移策略:
bash
# 将普通文件转换为LFS
git lfs migrate import --include="*.zip" --include-ref=refs/heads/main
# 导出LFS文件(转回普通文件)
git lfs migrate export --include="*.zip" --include-ref=refs/heads/main
# 重写历史中的LFS文件
git lfs migrate import --everything --include="*.psd"
示例:完整的LFS工作流
bash
# 1. 初始化新项目
git init my-project
cd my-project
git lfs install
# 2. 配置LFS跟踪
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes
git commit -m "build: 初始化Git LFS配置"
# 3. 添加大文件
echo "大文件内容" > large-file.zip
git add large-file.zip
git commit -m "feat: 添加示例大文件"
# 4. 推送到远程
git remote add origin https://github.com/user/repo.git
git push -u origin main
# 5. 团队协作
git lfs lock "large-file.zip"
# 编辑文件...
git add large-file.zip
git commit -m "feat: 更新大文件内容"
git lfs unlock "large-file.zip"
git push origin main
# 6. 维护清理
git lfs prune
git gc
第四部分:Git其他功能
8. 最佳实践
分支命名规范
- master/main:主分支
- develop:开发分支
- feature/*:功能分支
- hotfix/*:紧急修复分支
- release/*:发布分支
提交规范
提交信息应该清晰地描述改动的内容,遵循以下格式:
<类型>(<作用域>): <描述>
[可选的正文]
[可选的脚注]
类型(必填):
- feat:新功能
- fix:修复bug
- docs:文档更新
- style:代码格式(不影响代码运行的变动)
- refactor:重构(既不是新增功能,也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
作用域(可选):
- 用括号包裹
- 表示commit影响的范围
- 例如:模块名称、功能区域等
描述:
- 简短清晰
- 使用动词开头,使用第一人称现在时
- 第一个字母小写
- 结尾不加句号
示例:
bash
# 新功能
feat(auth): 添加用户登录功能
# Bug修复
fix(login): 修复登录按钮在IE11中不可点击的问题
# 文档更新
docs(readme): 更新安装说明和使用示例
# 代码格式调整
style(user): 规范用户模块的代码缩进
# 代码重构
refactor(cart): 重构购物车计算逻辑,提升性能
# 添加测试
test(api): 添加用户注册接口的单元测试
# 构建工具
chore(build): 升级webpack到最新版本
完整提交示例:
bash
feat(user): 实现用户注册功能
- 添加用户注册表单
- 实现邮箱验证功能
- 添加密码强度检查
- 集成短信验证码服务
BREAKING CHANGE: 用户注册接口的请求参数格式已更改
需要更新客户端适配新的接口格式
Closes #123
工作流模型
- Git Flow工作流 :
适合版本发布的项目。
紧急修复 版本发布 功能开发 功能完成 功能完成 版本测试 发布完成 同步回开发 修复完成 同步修复 修复分支
hotfix/1.0.1 发布分支
release/1.0 主分支
main 功能分支1
feature/login 开发分支
develop 功能分支2
feature/pay
bash
# 开发新功能
git checkout develop
git checkout -b feature/login
git commit -m "feat: 添加登录功能"
git checkout develop
git merge feature/login
# 发布版本
git checkout -b release/v1.0
git commit -m "chore: 准备v1.0发布"
git checkout main
git merge release/v1.0
git tag v1.0
- GitHub Flow工作流 :
适合持续部署的项目。
通过 不通过 部署 main feature分支 开发 测试 提交PR Review 生产环境
bash
# 开发功能
git checkout -b feature-cart
git commit -m "feat: 添加购物车"
git push origin feature-cart
# 创建PR并合并
git checkout main
git merge feature-cart
git push origin main
- GitLab Flow工作流 :
适合多环境部署的项目。
生产环境 预生产环境 开发环境 代码评审通过 代码评审通过 测试通过 验证通过 production 生产部署 pre-production 预生产部署 feature/login分支 main分支 feature/pay分支
bash
# 功能开发
git checkout -b feature
git commit -m "feat: 新功能"
git push origin feature
# 环境部署
git checkout pre-production
git merge feature
git checkout production
git merge pre-production
Git工作区域和文件状态
git add git commit git push git fetch git pull 工作区 暂存区 本地仓库 远程仓库
分支管理生命周期
创建分支 开发 测试 合并 删除分支
Code Review流程
通过 不通过 通过 不通过 开发完成 自查 提交PR 修复问题 Code Review 合并代码 修改代码
9. 问题诊断与优化
常见问题
冲突处理
-
预防冲突:
- 定期同步主分支
- 小步提交
- 合理划分任务
- 团队沟通
-
解决冲突:
bash
# 更新分支
git fetch origin
git merge origin/main
# 查看冲突文件
git status
# 解决冲突后标记为已解决
git add <冲突文件>
git commit -m "fix: 解决合并冲突"
- 使用工具 :
- VS Code内置冲突解决
- SourceTree可视化比较
- Beyond Compare详细对比
提交问题
-
常见问题:
- 提交信息不规范
- 提交内容过大
- 误提交敏感信息
- 提交到错误分支
-
解决方案:
bash
# 修改最后一次提交
git commit --amend
# 撤销最近的提交
git reset HEAD^
# 将提交转移到正确分支
git cherry-pick <commit-hash>
# 删除敏感信息
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 敏感文件' HEAD
远程同步
-
同步问题:
- 推送被拒绝
- 分支落后
- 远程分支被删除
- 标签同步失败
-
解决方案:
bash
# 强制更新本地分支
git fetch --all
git reset --hard origin/main
# 清理无效远程分支
git remote prune origin
# 同步所有标签
git fetch --tags
git push --tags
权限问题
-
常见场景:
- 无法推送到远程仓库
- 无法访问私有仓库
- SSH密钥认证失败
- 仓库访问权限不足
-
解决方案:
bash
# 检查远程仓库权限
git remote -v
# 测试SSH连接
ssh -T git@github.com
# 更新SSH密钥
ssh-add ~/.ssh/id_rsa
# 检查仓库访问权限
git ls-remote origin
大文件问题
-
常见情况:
- 提交历史中包含大文件
- 仓库体积过大
- 克隆和拉取速度慢
- 存储空间不足
-
解决方案:
bash
# 查找大文件
git rev-list --objects --all | grep -f \
<(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10)
# 使用Git LFS管理大文件
git lfs install
git lfs track "*.psd"
# 清理大文件历史
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch large-file.zip' HEAD
分支管理问题
-
常见场景:
- 分支混乱
- 合并策略错误
- 分支依赖复杂
- 版本管理混乱
-
解决方案:
bash
# 查看所有分支关系
git log --graph --oneline --all
# 整理本地分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
# 重置分支到特定提交
git reset --hard <commit-hash>
# 修复错误合并
git revert -m 1 <merge-commit-hash>
性能问题
-
常见情况:
- 仓库响应缓慢
- 命令执行时间长
- 内存占用过高
- 磁盘空间不足
-
解决方案:
bash
# 优化仓库
git gc --aggressive
git prune
# 浅克隆加快克隆速度
git clone --depth 1 <repository-url>
# 使用稀疏检出
git sparse-checkout set <directory>
# 清理无用的远程跟踪分支
git remote prune origin
工作区问题
-
常见场景:
- 文件误删除
- 工作区混乱
- 暂存区状态异常
- 未跟踪文件管理
-
解决方案:
bash
# 恢复误删除的文件
git checkout -- <file>
# 清理工作区
git clean -fd
# 重置暂存区
git reset HEAD <file>
# 保存工作现场
git stash save "工作现场"
性能优化
仓库优化
- 大文件处理:
bash
# 查找大文件
git rev-list --objects --all | grep -f \
<(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10)
# 从历史中删除大文件
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 大文件' HEAD
# 压缩仓库
git gc --aggressive
git prune
- 提升克隆速度:
bash
# 浅克隆
git clone --depth 1 <仓库地址>
# 单分支克隆
git clone --single-branch --branch main <仓库地址>
# 稀疏检出
git clone --filter=blob:none <仓库地址>
- 优化提交历史:
bash
# 合并多个提交
git rebase -i HEAD~3
# 压缩提交历史
git checkout --orphan temp_branch
git add -A
git commit -m "压缩历史: 项目初始化"
git branch -D main
git branch -m main
安全管理
身份认证与访问控制
-
认证方式:
-
SSH密钥认证:
bash# 生成SSH密钥 ssh-keygen -t ed25519 -C "your_email@example.com" # 添加到SSH代理 eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 # 测试连接 ssh -T git@github.com
-
双因素认证(2FA):
- 使用身份验证器应用
- 配置备用恢复码
- 设置备用认证方式
-
访问令牌(Token):
bash# 使用token克隆仓库 git clone https://<token>@github.com/username/repo.git # 更新远程URL使用token git remote set-url origin https://<token>@github.com/username/repo.git
-
-
权限管理:
-
仓库级别:
- 设置仓库可见性(公开/私有)
- 配置协作者权限
- 管理组织成员访问
-
分支保护:
bash# 设置分支保护规则 - 限制强制推送(force push) - 要求代码评审 - 要求状态检查通过 - 自动化CI/CD验证
-
提交签名:
bash# 配置GPG密钥 gpg --gen-key gpg --list-secret-keys --keyid-format LONG # 配置Git使用GPG签名 git config --global user.signingkey <GPG-KEY-ID> git config --global commit.gpgsign true # 签名提交 git commit -S -m "签名的提交信息"
-
敏感信息保护
-
预防措施:
-
配置.gitignore:
bash# 创建.gitignore文件 touch .gitignore # 常见敏感文件模式 *.env *.key config/secrets.* credentials/* .DS_Store node_modules/
-
使用环境变量:
bash# 使用环境变量文件 # .env.example(示例配置,可提交) DB_HOST=localhost DB_USER=example DB_PASS=<your-password> # .env(实际配置,不提交) DB_HOST=production-db DB_USER=prod_user DB_PASS=actual_password
-
配置模板:
bash# 创建配置模板 cp config.json config.json.template git add config.json.template git commit -m "chore: 添加配置文件模板"
-
-
安全检查工具:
-
Git Secrets:
bash# 安装Git Secrets brew install git-secrets # macOS git clone https://github.com/awslabs/git-secrets.git && \ cd git-secrets && make install # Linux/Windows # 配置检查规则 git secrets --register-aws # AWS凭证检查 git secrets --add 'private_key' # 自定义规则 git secrets --add 'api_key' # 自定义规则 # 在仓库中安装钩子 git secrets --install # 扫描仓库 git secrets --scan git secrets --scan-history
-
预提交钩子:
bash# 创建pre-commit钩子 cat > .git/hooks/pre-commit << 'EOF' #!/bin/sh # 检查敏感信息 if git diff --cached | grep -i "password\|secret\|key" then echo "警告:可能包含敏感信息!" exit 1 fi EOF chmod +x .git/hooks/pre-commit
-
-
安全最佳实践:
-
定期安全审计:
- 检查访问权限
- 审查团队成员
- 更新安全策略
-
密钥轮换:
- 定期更新访问令牌
- 更换SSH密钥
- 更新GPG签名密钥
-
事件响应:
bash# 如果密钥泄露,立即执行: # 1. 撤销泄露的密钥 git config --global --unset user.signingkey # 2. 更新所有认证信息 ssh-keygen -t ed25519 -C "new_email@example.com" # 3. 检查提交历史中的敏感信息 git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch config/secrets.yml' HEAD
-
10. 工具生态
图形界面工具
-
SourceTree:
- 官方下载:https://www.sourcetreeapp.com/
- Windows版本:https://product-downloads.atlassian.com/software/sourcetree/windows/ga/SourceTreeSetup-3.4.12.exe
- macOS版本:https://product-downloads.atlassian.com/software/sourcetree/ga/Sourcetree_4.2.3_250.zip
- 主要特点:
- 免费专业,可视化强大
- 内置Git Flow工作流
- 分支管理和历史查看
- 冲突解决和远程操作
- 支持自定义工作流和外部工具集成
-
GitKraken:
- 官方下载:https://www.gitkraken.com/download
- Windows版本:https://release.gitkraken.com/win64/GitKrakenSetup.exe
- macOS版本:https://release.gitkraken.com/darwin/GitKraken.dmg
- Linux版本:https://release.gitkraken.com/linux/gitkraken-amd64.deb
- 核心功能:
- 现代化界面和内置编辑器
- 交互式rebase和冲突解决
- 时间线视图和团队看板
- 强大的团队协作功能
- 分支策略和工作区定制
-
GitHub Desktop:
- 官方下载:https://desktop.github.com/
- Windows版本:https://central.github.com/deployments/desktop/desktop/latest/win32
- macOS版本:https://central.github.com/deployments/desktop/desktop/latest/darwin
- 特色功能:
- 简单易用的界面
- 完整的GitHub集成
- 自动化工作流
- 适合个人项目和小团队
- 方便的PR和代码评审
命令行工具
-
Oh My Zsh:
- 官方安装指南:https://ohmyz.sh/
- 通过curl安装:
bashsh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
- 通过wget安装:
bashsh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
- 常用配置:
- Git插件:plugins=(git github gitflow)
- 常用别名:gst(status), gaa(add --all), gcm(commit -m)
- 自定义主题:ZSH_THEME="agnoster"
- 支持丰富的Git命令补全
-
Git Extras:
- GitHub仓库:https://github.com/tj/git-extras
- Windows安装:
bashchoco install git-extras
- macOS安装:
bashbrew install git-extras
- Linux安装:
bash# Debian/Ubuntu sudo apt-get install git-extras # CentOS/RHEL sudo yum install git-extras
- 实用功能:
- 仓库摘要和统计(summary, effort, count)
- 分支管理(feature start/finish)
- 提交历史管理(changelog)
- 作者信息重写和仓库大小查看
如有问题,欢迎各位大佬在评论区指出,你的点赞收藏是对我最大的鼓励!