1. Git基础概念与安装配置
Git作为目前最流行的分布式版本控制系统,已经成为开发者日常工作中不可或缺的工具。它由Linus Torvalds在2005年开发,最初是为了更好地管理Linux内核开发而创建。与传统的集中式版本控制系统(如SVN)不同,Git的分布式架构让每个开发者都拥有完整的代码仓库副本,这使得离线工作和分支操作变得异常高效。
1.1 Git核心工作原理
Git的核心是一个内容寻址文件系统,这意味着它本质上是一个键值对数据库。当你向Git仓库提交数据时,Git会计算这些数据的校验和(SHA-1哈希值),然后以该校验和为索引存储数据。这种设计带来了几个关键优势:
- 数据完整性:所有数据在存储前都会计算校验和,任何对数据的修改都会被Git检测到
- 不可变性:一旦数据被存储到Git数据库中,就无法再更改
- 高效的分支管理:Git的分支实际上只是指向某个提交对象的可变指针,创建和切换分支几乎不消耗资源
1.2 Git安装与基础配置
Windows系统安装
对于Windows用户,推荐从Git官网下载最新的安装包。安装过程中有几个关键选项需要注意:
- 选择默认编辑器:建议选择VS Code或你熟悉的代码编辑器
- 调整PATH环境:选择"Git from the command line and also from 3rd-party software",这样可以在任何地方使用Git命令
- 行尾转换:选择"Checkout as-is, commit Unix-style line endings",避免跨平台协作时的行尾问题
安装完成后,打开命令提示符或Git Bash,运行以下命令验证安装:
git --versionmacOS系统安装
macOS用户可以通过Homebrew安装最新版Git:
brew install git或者直接从官网下载安装包。安装后同样需要验证版本。
Linux系统安装
在基于Debian的系统(如Ubuntu)上:
sudo apt-get update sudo apt-get install git在基于RPM的系统(如CentOS)上:
sudo yum install git1.3 基础配置
安装完成后,第一件事是配置你的用户信息,这些信息会包含在你的每次提交中:
git config --global user.name "Your Name" git config --global user.email "your.email@example.com"其他有用的全局配置:
# 设置默认编辑器为VS Code git config --global core.editor "code --wait" # 设置自动转换CRLF(适合跨平台开发) git config --global core.autocrlf true # 设置默认分支名为main git config --global init.defaultBranch main # 启用彩色输出 git config --global color.ui auto # 设置别名简化常用命令 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 --list可以查看所有配置项。配置信息默认存储在用户主目录的.gitconfig文件中。
2. Git基础操作命令详解
2.1 仓库创建与克隆
初始化新仓库
要开始一个新项目,可以在项目目录中运行:
git init这会在当前目录创建一个名为.git的子目录,包含所有必要的仓库文件。
克隆现有仓库
要获取现有仓库的副本,使用git clone命令:
git clone https://github.com/user/repo.git这会创建一个名为repo的目录,并初始化其中的.git目录,然后拉取所有数据并检出工作副本。
克隆时可以指定新目录名:
git clone https://github.com/user/repo.git myproject对于大型仓库,可以使用--depth参数进行浅克隆:
git clone --depth 1 https://github.com/user/repo.git2.2 文件状态与基本工作流
Git文件有四种主要状态:
- Untracked:未跟踪的文件,Git之前没有记录过
- Modified:已修改但尚未暂存
- Staged:已暂存,准备下次提交
- Committed:已提交到本地数据库
查看文件状态:
git status精简状态查看:
git status -s添加文件到暂存区
git add <file> # 添加特定文件 git add . # 添加所有修改和新增文件 git add -A # 添加所有修改、新增和删除的文件 git add -u # 添加所有修改和删除的文件,不包括新增提交更改
git commit -m "提交信息"提交时直接跳过暂存区:
git commit -a -m "提交信息"修改最后一次提交:
git commit --amend2.3 查看历史与差异
查看提交历史:
git log常用log选项:
git log -p # 显示每次提交的差异 git log -2 # 显示最近2次提交 git log --stat # 显示简略统计信息 git log --pretty=oneline # 单行显示 git log --graph # 显示分支图 git log --since=2.weeks # 显示两周内的提交查看工作区与暂存区的差异:
git diff查看暂存区与最后一次提交的差异:
git diff --cached2.4 撤销操作
撤销工作区的修改:
git checkout -- <file>取消暂存的文件:
git reset HEAD <file>修改最后一次提交:
git commit --amend回退到特定提交:
git reset --hard <commit>警告:
git reset --hard会丢弃所有未提交的更改,使用前请确保已备份重要修改。
3. 分支管理与协作开发
3.1 分支基础操作
查看分支:
git branch # 查看本地分支 git branch -a # 查看所有分支(包括远程)创建分支:
git branch <branch-name>切换分支:
git checkout <branch-name>创建并切换分支:
git checkout -b <branch-name>删除分支:
git branch -d <branch-name> # 安全删除(已合并) git branch -D <branch-name> # 强制删除(未合并)3.2 合并与解决冲突
合并分支:
git merge <branch-name>变基操作:
git rebase <branch-name>解决冲突后标记为已解决:
git add <file> git rebase --continue3.3 远程协作
查看远程仓库:
git remote -v添加远程仓库:
git remote add <name> <url>获取远程更新:
git fetch <remote>拉取并合并远程更新:
git pull <remote> <branch>推送本地更新:
git push <remote> <branch>删除远程分支:
git push <remote> --delete <branch>3.4 标签管理
创建标签:
git tag <tag-name> # 轻量标签 git tag -a <tag-name> -m "msg" # 附注标签查看标签:
git tag推送标签:
git push <remote> <tag-name> git push <remote> --tags # 推送所有标签删除标签:
git tag -d <tag-name> git push <remote> :refs/tags/<tag-name>4. 高级Git操作与技巧
4.1 储藏与清理
储藏当前修改:
git stash git stash save "message"查看储藏列表:
git stash list应用储藏:
git stash apply stash@{n}删除储藏:
git stash drop stash@{n}清理未跟踪文件:
git clean -n # 预览将被删除的文件 git clean -f # 删除未跟踪文件 git clean -fd # 删除未跟踪文件和目录4.2 重写历史
交互式变基:
git rebase -i <commit>修改多个提交信息:
git rebase -i HEAD~3使用filter-branch批量修改:
git filter-branch --tree-filter 'rm -f password.txt' HEAD4.3 子模块与工作树
添加子模块:
git submodule add <repository> <path>初始化子模块:
git submodule init git submodule update使用工作树:
git worktree add <path> <branch>4.4 二分查找与调试
使用二分查找定位问题提交:
git bisect start git bisect bad git bisect good <commit>4.5 钩子与自定义
Git钩子位于.git/hooks目录,常用的客户端钩子包括:
pre-commit:在提交前运行,可用于代码风格检查prepare-commit-msg:在提交信息编辑器启动前运行post-commit:在提交完成后运行
示例pre-commit钩子(检查是否有TODO标记):
#!/bin/sh if git diff --cached --name-only | xargs grep -q 'TODO'; then echo "Error: Commit contains TODO markers" exit 1 fi5. Git常见问题与解决方案
5.1 常见错误处理
问题1:fatal: refusing to merge unrelated histories
解决方案:
git pull origin master --allow-unrelated-histories问题2:error: failed to push some refs
解决方案:
git pull --rebase origin master git push origin master问题3:warning: LF will be replaced by CRLF
解决方案:
git config --global core.autocrlf true # Windows git config --global core.autocrlf input # Linux/macOS5.2 恢复丢失的提交
查看丢失的提交:
git fsck --lost-found使用reflog恢复:
git reflog git reset --hard HEAD@{n}5.3 大型文件处理
使用Git LFS(Large File Storage):
git lfs install git lfs track "*.psd" git add .gitattributes5.4 性能优化
部分克隆:
git clone --filter=blob:none <repo>稀疏检出:
git clone --sparse <repo> git sparse-checkout set dir1 dir25.5 安全注意事项
- 不要提交敏感信息(密码、API密钥等)
- 使用
.gitignore文件排除不必要的文件 - 定期检查历史记录中的敏感信息:
git log -p | grep "password" - 如需移除已提交的敏感信息,使用
filter-branch或BFG Repo-Cleaner
6. Git最佳实践与工作流
6.1 提交信息规范
良好的提交信息应包含:
- 标题行:简明扼要,不超过50字符
- 空一行
- 详细说明:解释为什么修改,而不是如何修改
示例:
修复用户登录失败问题 当用户密码包含特殊字符时,后端API返回500错误。 修改了密码验证逻辑,现在可以正确处理所有ASCII字符。6.2 分支策略
Git Flow:
master:生产环境代码develop:开发主线feature/*:功能分支release/*:发布分支hotfix/*:热修复分支
GitHub Flow(简化版):
- 从
main创建分支 - 提交更改
- 创建Pull Request
- 讨论和审查代码
- 部署和测试
- 合并到
main
6.3 代码审查与Pull Request
- 保持PR小而专注
- 提供清晰的描述和上下文
- 使用@mention请求特定人员审查
- 讨论时引用代码具体行
- 解决所有评论后再合并
6.4 持续集成集成
在.github/workflows中添加CI配置示例:
name: CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - run: npm install - run: npm test6.5 项目初始化清单
新项目应包含:
.gitignore文件README.md项目说明LICENSE许可证文件CONTRIBUTING.md贡献指南- 清晰的目录结构
创建全面的.gitignore:
# 操作系统文件 .DS_Store Thumbs.db # 编辑器文件 .idea .vscode *.swp # 依赖目录 node_modules/ vendor/ # 构建产物 dist/ build/ *.exe *.dll