Git基础知识
目录
- 一、Git简介
- 1.1 什么是Git?
- 1.2 基本概念
- 1.3 Git与其他版本控制系统的区别
- 二、Git安装与配置
- 2.1 安装Git
- 2.2 基础配置
- 2.3 高级配置
- 2.4 多账户配置
- 三、基本操作
- 3.1 创建仓库
- 3.2 基本工作流
- 3.3 分支操作
- 3.4 查看历史
- 四、高级操作
- 4.1 撤销修改
- 4.2 暂存操作
- 4.3 远程操作
- 4.4 标签操作
- 五、Git工作流
- 5.1 功能分支工作流
- 5.2 Git Flow工作流
- 5.3 Forking工作流
- 5.4 Trunk-Based开发
- 六、Git高级特性
- 6.1 Cherry Pick
- 6.2 变基操作
- 6.3 子模块
- 6.4 子树合并
- 6.5 钩子(Hooks)
- 七、Git配置与优化
- 7.1 常用配置
- 7.2 性能优化
- 7.3 安全配置
- 八、最佳实践
- 8.1 提交规范
- 8.2 分支管理
- 8.3 安全实践
- 8.4 大型仓库管理
- 九、常见问题与解决方案
- 9.1 合并冲突
- 9.2 撤销错误操作
- 9.3 找回丢失的提交
- 9.4 清理仓库
- 9.5 处理大文件
- 十、Git与其他工具集成
- 10.1 Git与IDE集成
- 10.2 Git与CI/CD集成
- 10.3 Git与项目管理工具集成
- 10.4 Git与代码审查工具
- 十一、Git进阶技巧
- 11.1 交互式暂存
- 11.2 高级日志查看
- 11.3 高级搜索
- 11.4 高级分支操作
- 11.5 高级合并策略
- 十二、Git工作流最佳实践
- 12.1 小型团队工作流
- 12.2 大型团队工作流
- 12.3 开源项目工作流
- 12.4 企业项目工作流
一、Git简介
1.1 什么是Git?
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何大小的项目。其特点是:
- 分布式系统
- 数据完整性
- 快速分支
- 完整性能
- 多工作流支持
1.2 基本概念
- 仓库(Repository):存储项目的地方
- 分支(Branch):独立的开发线
- 提交(Commit):代码修改的快照
- 远程(Remote):远程仓库
- 工作区(Working Directory):实际工作的目录
- 暂存区(Staging Area):临时存储修改的区域
- 本地仓库(Local Repository):本地的Git仓库
- HEAD:指向当前分支的最新提交
- 标签(Tag):为特定提交创建的有意义名称
- 合并(Merge):将两个分支的历史合并到一起
- 变基(Rebase):重新应用一系列提交
- 冲突(Conflict):两个分支修改了同一文件的同一部分
1.3 Git与其他版本控制系统的区别
- 集中式vs分布式:Git是分布式的,每个开发者都有完整的代码历史
- 分支管理:Git的分支创建和切换非常快速和轻量
- 数据完整性:Git使用SHA-1哈希确保数据完整性
- 性能:Git在大型项目上性能优异
- 工作流灵活性:Git支持多种工作流程
二、Git安装与配置
2.1 安装Git
# Windows
# 下载Git安装包并安装# Linux
sudo apt-get update
sudo apt-get install git# Mac
brew install git
2.2 基础配置
# 配置用户信息
git config --global user.name "Your Name"
git config --global user.email "email@example.com"# 配置默认编辑器
git config --global core.editor vim# 查看配置
git config --list# 配置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
2.3 高级配置
# 配置凭证缓存
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'# 配置换行符处理
git config --global core.autocrlf input # Mac/Linux
git config --global core.autocrlf true # Windows# 配置颜色输出
git config --global color.ui auto# 配置默认分支名
git config --global init.defaultBranch main# 配置提交模板
git config --global commit.template ~/.gitmessage
2.4 多账户配置
# 为不同项目配置不同用户
# 在项目目录中执行
git config user.name "Work Name"
git config user.email "work@example.com"# 使用SSH密钥区分不同账户
# 在~/.ssh/config中配置
Host github-workHostName github.comUser gitIdentityFile ~/.ssh/id_rsa_workIdentitiesOnly yesHost github-personalHostName github.comUser gitIdentityFile ~/.ssh/id_rsa_personalIdentitiesOnly yes
三、基本操作
3.1 创建仓库
# 初始化新仓库
git init# 克隆远程仓库
git clone https://github.com/username/repository.git# 克隆指定分支
git clone -b branch_name https://github.com/username/repository.git# 浅克隆(只获取最近的提交)
git clone --depth 1 https://github.com/username/repository.git# 克隆子模块
git clone --recursive https://github.com/username/repository.git
3.2 基本工作流
# 查看状态
git status# 添加文件到暂存区
git add file.txt
git add . # 添加所有文件# 提交更改
git commit -m "提交说明"# 推送到远程
git push origin master# 拉取远程更新
git pull origin master
3.3 分支操作
# 查看分支
git branch# 创建分支
git branch branch_name# 切换分支
git checkout branch_name# 创建并切换分支
git checkout -b branch_name# 合并分支
git merge branch_name# 删除分支
git branch -d branch_name# 强制删除分支
git branch -D branch_name# 查看所有分支(包括远程)
git branch -a# 查看远程分支
git branch -r# 跟踪远程分支
git checkout -b local_branch origin/remote_branch
3.4 查看历史
# 查看提交历史
git log# 查看简洁历史
git log --oneline# 查看图形化历史
git log --graph --oneline --all# 查看特定文件历史
git log -- path/to/file# 查看特定作者历史
git log --author="username"# 查看特定时间段历史
git log --since="2 weeks ago"# 查看特定提交的详细信息
git show commit_id
四、高级操作
4.1 撤销修改
# 撤销工作区修改
git checkout -- file.txt# 撤销暂存区修改
git reset HEAD file.txt# 撤销提交
git revert commit_id# 重置到指定提交
git reset --hard commit_id# 软重置(保留修改)
git reset --soft commit_id# 混合重置(默认)
git reset --mixed commit_id
4.2 暂存操作
# 暂存当前修改
git stash# 查看暂存列表
git stash list# 应用暂存
git stash apply# 删除暂存
git stash drop# 应用并删除暂存
git stash pop# 暂存特定文件
git stash push -m "message" path/to/file# 创建分支并应用暂存
git stash branch new_branch_name
4.3 远程操作
# 查看远程仓库
git remote -v# 添加远程仓库
git remote add origin https://github.com/username/repository.git# 删除远程仓库
git remote remove origin# 重命名远程仓库
git remote rename old_name new_name# 获取远程更新
git fetch origin# 拉取并合并远程更新
git pull origin master# 推送到远程
git push origin master# 强制推送
git push -f origin master# 推送所有分支
git push --all origin# 推送标签
git push --tags origin
4.4 标签操作
# 创建轻量标签
git tag v1.0.0# 创建带注释的标签
git tag -a v1.0.0 -m "版本1.0.0发布"# 为特定提交创建标签
git tag -a v1.0.0 commit_id# 查看所有标签
git tag# 查看标签详情
git show v1.0.0# 推送标签到远程
git push origin v1.0.0# 推送所有标签
git push origin --tags
五、Git工作流
5.1 功能分支工作流
# 创建功能分支
git checkout -b feature/new-feature# 开发完成后合并到主分支
git checkout main
git merge feature/new-feature# 删除功能分支
git branch -d feature/new-feature
5.2 Git Flow工作流
# 初始化Git Flow
git flow init# 开始新功能
git flow feature start new-feature# 完成功能
git flow feature finish new-feature# 开始发布
git flow release start 1.0.0# 完成发布
git flow release finish 1.0.0# 开始热修复
git flow hotfix start 1.0.1# 完成热修复
git flow hotfix finish 1.0.1
5.3 Forking工作流
# 1. Fork远程仓库# 2. 克隆自己的Fork
git clone https://github.com/your-username/repository.git# 3. 添加上游仓库
git remote add upstream https://github.com/original-username/repository.git# 4. 同步上游更新
git fetch upstream
git merge upstream/main# 5. 创建功能分支
git checkout -b feature/new-feature# 6. 推送到自己的Fork
git push origin feature/new-feature# 7. 创建Pull Request
5.4 Trunk-Based开发
# 1. 从主分支创建短生命周期分支
git checkout -b feature/new-feature# 2. 频繁提交到主分支
git checkout main
git merge feature/new-feature# 3. 删除功能分支
git branch -d feature/new-feature
六、Git高级特性
6.1 Cherry Pick
# 选择指定提交应用到当前分支
git cherry-pick commit_id# 选择多个提交
git cherry-pick commit_id1 commit_id2# 解决冲突后继续
git cherry-pick --continue# 取消cherry-pick
git cherry-pick --abort
6.2 变基操作
# 变基到指定分支
git rebase master# 交互式变基
git rebase -i HEAD~3# 解决冲突后继续
git rebase --continue# 取消变基
git rebase --abort# 变基特定范围
git rebase --onto new_base old_base branch
6.3 子模块
# 添加子模块
git submodule add https://github.com/username/repository.git# 初始化子模块
git submodule init# 更新子模块
git submodule update# 递归克隆包含子模块的项目
git clone --recursive https://github.com/username/repository.git# 更新所有子模块
git submodule update --remote# 在子模块中工作
cd submodule
git checkout master
git pull
cd ..
git add submodule
git commit -m "更新子模块"
6.4 子树合并
# 添加远程仓库作为子树
git remote add -f external https://github.com/username/external-repo.git
git subtree add --prefix=external external master# 更新子树
git subtree pull --prefix=external external master# 推送子树更改
git subtree push --prefix=external external master
6.5 钩子(Hooks)
# 客户端钩子
# pre-commit: 提交前运行
# commit-msg: 提交消息验证
# pre-rebase: 变基前运行
# post-checkout: 检出后运行# 服务器端钩子
# pre-receive: 接收推送前运行
# update: 更新引用前运行
# post-receive: 接收推送后运行# 示例:pre-commit钩子
#!/bin/sh
# .git/hooks/pre-commit
echo "Running tests..."
npm test
七、Git配置与优化
7.1 常用配置
# 设置默认推送行为
git config --global push.default simple# 设置自动转换换行符
git config --global core.autocrlf true# 设置忽略文件权限变化
git config --global core.fileMode false# 设置差异比较工具
git config --global diff.tool vimdiff# 设置合并工具
git config --global merge.tool vimdiff# 设置日志格式
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"
7.2 性能优化
# 开启压缩
git config --global core.compression 9# 启用文件系统缓存
git config --global core.fscache true# 设置打包限制
git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"# 启用并行获取
git config --global fetch.parallel 4# 启用部分克隆
git clone --filter=blob:none https://github.com/username/repository.git# 启用稀疏检出
git sparse-checkout init
git sparse-checkout set path/to/directory
7.3 安全配置
# 设置签名验证
git config --global commit.gpgsign true
git config --global user.signingkey YOUR_GPG_KEY_ID# 设置SSH密钥
# 生成SSH密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 添加到SSH代理
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519# 设置凭证存储
git config --global credential.helper store
# 或使用更安全的方式
git config --global credential.helper cache
八、最佳实践
8.1 提交规范
-
提交信息格式
type(scope): subjectbodyfooter
-
类型说明
- feat: 新功能
- fix: 修复bug
- docs: 文档更新
- style: 代码格式
- refactor: 重构
- test: 测试
- chore: 构建过程或辅助工具的变动
-
提交示例
feat(auth): 添加用户登录功能- 实现用户名密码登录 - 添加记住我功能 - 集成第三方登录Closes #123
8.2 分支管理
-
分支命名
- master/main: 主分支
- develop: 开发分支
- feature/*: 功能分支
- hotfix/*: 紧急修复分支
- release/*: 发布分支
-
合并策略
- 使用Pull Request
- 进行Code Review
- 保持分支整洁
- 使用合并提交而非快进合并
- 定期合并主分支到功能分支
-
分支保护
- 保护主分支
- 要求代码审查
- 要求状态检查通过
- 限制直接推送
8.3 安全实践
-
敏感信息
- 使用.gitignore
- 避免提交密码
- 使用环境变量
- 使用git-secrets工具
-
权限控制
- 设置分支保护
- 使用签名验证
- 定期备份
- 限制直接推送到主分支
-
清理历史
- 使用git filter-branch清理敏感信息
- 使用BFG Repo-Cleaner工具
- 强制推送清理后的历史
8.4 大型仓库管理
-
模块化
- 使用子模块
- 使用子树合并
- 使用monorepo工具
-
性能优化
- 使用浅克隆
- 使用部分克隆
- 使用稀疏检出
- 定期进行垃圾回收
-
工作流优化
- 使用功能标志
- 使用特性分支
- 使用持续集成
- 使用自动化测试
九、常见问题与解决方案
9.1 合并冲突
# 查看冲突文件
git status# 解决冲突
# 手动编辑冲突文件
# 或使用合并工具
git mergetool# 标记为已解决
git add resolved_file.txt# 完成合并
git commit -m "解决合并冲突"
9.2 撤销错误操作
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1# 撤销最后一次提交(丢弃修改)
git reset --hard HEAD~1# 撤销已推送的提交
git revert commit_id
git push origin master# 修改最后一次提交
git commit --amend
9.3 找回丢失的提交
# 查看操作历史
git reflog# 恢复丢失的提交
git checkout -b recovery_branch commit_id# 或直接重置
git reset --hard commit_id
9.4 清理仓库
# 清理未跟踪的文件
git clean -n # 预览
git clean -f # 执行# 清理已忽略的文件
git clean -X# 清理所有未跟踪的文件和目录
git clean -fd# 压缩仓库
git gc# 深度压缩
git gc --aggressive
9.5 处理大文件
# 使用Git LFS
# 安装Git LFS
git lfs install# 跟踪大文件
git lfs track "*.psd"
git add .gitattributes# 正常添加和提交
git add file.psd
git commit -m "添加大文件"# 查看跟踪的文件
git lfs ls-files
十、Git与其他工具集成
10.1 Git与IDE集成
- VS Code:内置Git支持
- IntelliJ IDEA:强大的Git集成
- Eclipse:EGit插件
- Visual Studio:Git集成
- Sublime Text:Git插件
10.2 Git与CI/CD集成
- GitHub Actions
- GitLab CI
- Jenkins
- CircleCI
- Travis CI
10.3 Git与项目管理工具集成
- GitHub Issues
- GitLab Issues
- Jira
- Trello
- Asana
10.4 Git与代码审查工具
- GitHub Pull Requests
- GitLab Merge Requests
- Gerrit
- Phabricator
- Review Board
十一、Git进阶技巧
11.1 交互式暂存
# 交互式添加文件
git add -i# 交互式暂存补丁
git add -p
11.2 高级日志查看
# 查看特定作者的提交
git log --author="username"# 查看特定时间段的提交
git log --since="2 weeks ago" --until="1 week ago"# 查看特定文件的修改历史
git log -p path/to/file# 查看特定提交的统计信息
git show --stat commit_id
11.3 高级搜索
# 搜索提交信息
git log --grep="关键词"# 搜索代码内容
git log -S "代码片段"# 搜索特定行
git log -L 10,20:path/to/file
11.4 高级分支操作
# 重命名分支
git branch -m old_name new_name# 移动分支到新的提交
git branch -f branch_name commit_id# 删除已合并的分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
11.5 高级合并策略
# 使用ours策略
git merge -X ours branch_name# 使用theirs策略
git merge -X theirs branch_name# 使用patience策略
git merge -X patience branch_name
十二、Git工作流最佳实践
12.1 小型团队工作流
- 主分支(main)用于生产环境
- 开发分支(develop)用于开发
- 功能分支(feature/*)用于新功能
- 发布分支(release/*)用于准备发布
- 热修复分支(hotfix/*)用于紧急修复
12.2 大型团队工作流
- 使用Git Flow或类似工作流
- 实施代码审查流程
- 使用持续集成/持续部署
- 实施自动化测试
- 使用功能标志管理功能发布
12.3 开源项目工作流
- 使用Forking工作流
- 维护清晰的贡献指南
- 使用Issue跟踪问题
- 使用Pull Request进行代码审查
- 维护更新日志
12.4 企业项目工作流
- 实施严格的代码审查
- 使用环境分支(dev, staging, prod)
- 实施自动化测试和部署
- 使用版本控制和语义化版本
- 实施安全扫描和合规检查