1. Git基础概念与安装配置
Git作为目前最流行的分布式版本控制系统,已经成为开发者日常工作中不可或缺的工具。它最初由Linux之父Linus Torvalds开发,用于管理Linux内核源代码。与传统的集中式版本控制系统(如SVN)不同,Git的分布式架构让每个开发者都拥有完整的代码仓库副本,这大大提高了开发效率和灵活性。
1.1 Git核心工作原理
Git的核心是一个内容寻址文件系统,它本质上是一个键值存储数据库。当你提交文件到Git仓库时,Git会为这些内容计算SHA-1哈希值作为唯一标识。这种设计带来了几个重要特性:
- 数据完整性:所有数据在存储前都会计算校验和,任何微小的修改都会导致哈希值变化
- 不可变性:一旦数据存入Git数据库,就无法更改
- 高效分支管理:Git的分支实际上只是指向某个提交的可变指针,创建和切换分支几乎不消耗资源
1.2 Git安装与基础配置
对于Windows用户,建议直接从Git官网下载安装包。安装过程中有几个关键选项需要注意:
- 选择默认编辑器:建议选择VS Code或你熟悉的代码编辑器
- 调整PATH环境:选择"Git from the command line and also from 3rd-party software"
- 行尾转换:选择"Checkout as-is, commit Unix-style line endings"以避免跨平台行尾问题
安装完成后,首先需要配置用户信息:
git config --global user.name "Your Name" git config --global user.email "your.email@example.com"提示:使用
--global选项会将这些配置写入~/.gitconfig文件,对所有项目生效。如果需要对特定项目使用不同身份,可以在项目目录下运行不带--global的命令。
常用的其他配置包括:
# 设置默认分支名为main git config --global init.defaultBranch main # 设置彩色输出 git config --global color.ui auto # 设置默认编辑器为VS Code git config --global core.editor "code --wait"验证配置是否生效:
git config --list2. Git仓库基础操作
2.1 创建和克隆仓库
初始化新仓库:
git init project-name cd project-name克隆现有仓库:
git clone https://github.com/user/repo.git实际经验:克隆大型仓库时,可以使用
--depth 1选项只克隆最新版本,节省时间和空间:git clone --depth 1 https://github.com/user/repo.git
2.2 文件状态与基本工作流
Git文件有四种主要状态:
- Untracked:未跟踪,Git不知道它的存在
- Modified:已修改但未暂存
- Staged:已暂存,准备提交
- Committed:已提交到本地仓库
查看文件状态:
git status添加文件到暂存区:
git add filename.txt # 添加单个文件 git add . # 添加所有修改和新文件 git add -u # 只添加已跟踪文件的修改提交更改:
git commit -m "描述性提交信息"提交信息规范:第一行不超过50字符的简要说明,空一行后可以添加详细描述。好的提交信息应该说明"为什么"修改,而不仅仅是"做了什么"。
2.3 查看提交历史
基本日志查看:
git log常用选项:
git log --oneline # 简洁单行显示 git log --graph # 显示分支图 git log -p # 显示差异 git log --stat # 显示修改统计 git log --since="1 week ago" git log --author="name"查看特定文件的修改历史:
git log -p filename.txt3. Git分支与合并
3.1 分支基础操作
查看分支:
git branch # 本地分支 git branch -a # 所有分支(包括远程)创建分支:
git branch new-feature git checkout new-feature # 或者简写为 git checkout -b new-feature切换分支:
git checkout main删除分支:
git branch -d old-branch # 安全删除(已合并) git branch -D old-branch # 强制删除(未合并)3.2 合并与解决冲突
合并分支:
git checkout main git merge new-feature当发生冲突时,Git会标记冲突文件。解决冲突的步骤:
- 打开冲突文件,查找
<<<<<<<,=======,>>>>>>>标记 - 手动编辑文件,保留需要的更改
- 删除冲突标记
- 添加解决后的文件并提交
使用图形化工具解决冲突:
git mergetool实际经验:在大型团队中,推荐使用rebase而不是merge来保持提交历史的线性。但要注意:不要在公共分支上rebase已经推送的提交!
3.3 变基(rebase)操作
变基可以将一个分支的修改"重放"到另一个分支上:
git checkout feature git rebase main交互式变基(修改提交历史):
git rebase -i HEAD~3 # 修改最近3次提交在交互式变基中,你可以:
- 重新排序提交
- 合并提交(squash)
- 修改提交信息(reword)
- 编辑提交内容(edit)
- 拆分提交
4. 远程仓库协作
4.1 远程仓库基础
查看远程仓库:
git remote -v添加远程仓库:
git remote add origin https://github.com/user/repo.git从远程获取更新:
git fetch origin推送本地更改:
git push origin main实际经验:首次推送时使用
-u选项设置上游分支:git push -u origin main之后就可以直接使用
git push而不需要指定远程和分支
4.2 处理远程分支
跟踪远程分支:
git checkout --track origin/feature删除远程分支:
git push origin --delete old-branch4.3 协作工作流
常见的Git协作工作流包括:
- 集中式工作流:所有人直接向主分支提交
- 功能分支工作流:每个功能在独立分支开发,通过PR/MR合并
- Git Flow:严格的分支模型,有develop、feature、release、hotfix等分支
- GitHub Flow:简化版的Git Flow,只有main分支和功能分支
5. 高级Git技巧
5.1 撤销更改
撤销工作区修改:
git checkout -- filename.txt撤销暂存区修改:
git reset HEAD filename.txt修改最后一次提交:
git commit --amend回退到特定提交:
git reset --hard commit_hash # 彻底回退 git reset --soft commit_hash # 保留修改到暂存区5.2 储藏(stash)临时修改
储藏当前修改:
git stash查看储藏列表:
git stash list恢复储藏:
git stash apply stash@{0}删除储藏:
git stash drop stash@{0}5.3 子模块与子仓库
添加子模块:
git submodule add https://github.com/user/repo.git path/to/submodule初始化子模块:
git submodule init git submodule update实际经验:克隆包含子模块的仓库时,可以使用:
git clone --recurse-submodules https://github.com/user/repo.git
6. Git疑难问题解决
6.1 常见错误与修复
问题1:提交了错误内容需要修改
git commit --amend # 修改最后一次提交 git rebase -i HEAD~3 # 修改多个提交问题2:误删分支
git reflog # 查找删除前的提交 git branch new-branch commit_hash # 从提交重建分支问题3:合并错误的分支
git reset --hard ORIG_HEAD # 恢复到合并前状态6.2 清理仓库
删除未跟踪文件:
git clean -n # 预览将被删除的文件 git clean -f # 实际删除压缩仓库历史:
git gc6.3 性能优化
部分克隆(只获取最近历史):
git clone --depth 1 https://github.com/user/repo.git稀疏检出(只检出部分目录):
git clone --filter=blob:none --no-checkout https://github.com/user/repo.git cd repo git sparse-checkout init --cone git sparse-checkout set dir1 dir2 git checkout main7. Git钩子与自动化
Git钩子是存储在.git/hooks目录下的脚本,可以在特定Git事件发生时自动执行。常用的钩子包括:
- pre-commit:提交前运行,常用于代码风格检查
- post-commit:提交后运行,可用于通知等
- pre-push:推送前运行,常用于运行测试
示例pre-commit钩子(检查是否有TODO注释):
#!/bin/sh if git grep -n "TODO" -- ':!*.md'; then echo "Error: TODO comments found" exit 1 fi提示:可以使用Husky等工具更简单地管理Git钩子,特别是与npm项目集成时。
8. Git图形化工具推荐
虽然命令行是使用Git最强大的方式,但图形化工具在某些场景下更方便:
- GitHub Desktop:适合GitHub用户,界面简洁
- Sourcetree:功能全面,支持Git Flow
- GitKraken:跨平台,优秀的可视化界面
- VS Code Git集成:内置支持,适合开发者
我个人在实际工作中发现,结合命令行和图形化工具使用效率最高。命令行用于日常操作,图形化工具用于查看复杂的历史记录和解决冲突。