Git从入门到精通教程
一、Git简介
Git是一个分布式版本控制系统,由Linus Torvalds于2005年为管理Linux内核开发而创建。它具有以下特点:
- 分布式架构:每个开发者都有完整的代码仓库副本
- 高效性能:大部分操作在本地完成,速度快
- 强大的分支系统:轻量级分支使分支操作几乎瞬间完成
- 数据完整性:使用SHA-1哈希确保代码历史不被篡改
- 灵活性:支持多种工作流程和开发模式
二、Git安装与配置
2.1 安装Git
Windows系统
- 访问Git官网下载安装程序:https://git-scm.com/download/win
- 运行安装程序,按向导完成安装
- 关键配置选项:
- 选择"Git from the command line and also from 3rd-party software"
- 选择默认编辑器(推荐VS Code)
- 换行符处理选择"Checkout Windows-style, commit Unix-style line endings"
验证安装:
bash
git --version
macOS系统
使用Homebrew安装(推荐):
bash
# 安装Homebrew(若未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"# 安装Git
brew install git
Linux系统
Debian/Ubuntu:
bash
sudo apt update && sudo apt install git
CentOS/Fedora:
bash
sudo yum install git # CentOS
sudo dnf install git # Fedora
2.2 Git配置
设置全局用户信息(必做):
bash
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
查看配置:
bash
git config --list
常用配置选项:
bash
# 设置默认编辑器
git config --global core.editor "code --wait" # VS Code
# 设置换行符处理(Windows)
git config --global core.autocrlf true
# 设置换行符处理(macOS/Linux)
git config --global core.autocrlf input
# 启用彩色输出
git config --global color.ui auto
# 设置默认分支名称
git config --global init.defaultBranch main
2.3 SSH密钥配置(推荐)
生成SSH密钥:
bash
ssh-keygen -t ed25519 -C "your.email@example.com"
# 或使用RSA
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
将公钥添加到GitHub/GitLab:
bash
cat ~/.ssh/id_ed25519.pub
# 复制输出内容到GitHub/GitLab的SSH Keys设置中
测试连接:
bash
ssh -T git@github.com
三、Git基础操作
3.1 仓库初始化与克隆
初始化新仓库:
bash
mkdir my_project
cd my_project
git init
克隆远程仓库:
bash
git clone https://github.com/user/repo.git
# 或使用SSH
git clone git@github.com:user/repo.git
3.2 基本工作流程
Git工作流程包括三个主要区域:
- 工作目录:实际编辑文件的地方
- 暂存区:准备提交的文件集合
- 本地仓库:存储提交历史的数据库
基本操作流程:
bash
# 1. 修改文件后查看状态
git status# 2. 将修改添加到暂存区
git add filename.txt # 添加特定文件
git add . # 添加所有修改文件# 3. 提交到本地仓库
git commit -m "Commit message"# 4. 查看提交历史
git log
git log --oneline # 简洁显示
git log --graph --oneline --all # 图形化显示所有分支历史
3.3 常用基础命令
查看文件状态:
bash
git status
git status -s # 简洁输出
查看文件差异:
bash
git diff # 工作区与暂存区差异
git diff --cached # 暂存区与仓库差异
git diff HEAD # 工作区与仓库差异
撤销操作:
bash
# 撤销工作区修改
git checkout -- filename.txt# 撤销暂存区修改
git reset HEAD filename.txt# 回退到上一个版本
git reset --hard HEAD^
# 回退到指定版本
git reset --hard <commit_id># 查看命令历史(用于找回误操作)
git reflog
四、分支管理
4.1 分支基础操作
查看分支:
bash
git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支
创建分支:
bash
git branch feature-branch
切换分支:
bash
git checkout feature-branch
# 或使用新版命令
git switch feature-branch
创建并切换分支:
bash
git checkout -b feature-branch
# 或使用新版命令
git switch -c feature-branch
删除分支:
bash
git branch -d feature-branch # 删除已合并的分支
git branch -D feature-branch # 强制删除未合并的分支
4.2 分支合并
合并分支:
bash
# 切换到目标分支
git checkout main
# 合并feature-branch到当前分支
git merge feature-branch
中止合并:
bash
git merge --abort
4.3 变基操作
变基可以创建更线性的提交历史:
bash
# 在feature-branch上执行,将其变基到main分支
git checkout feature-branch
git rebase main
解决变基冲突:
bash
# 解决冲突后
git add <resolved-file>
git rebase --continue
# 或放弃变基
git rebase --abort
交互式变基(整理提交历史):
bash
# 编辑最近3个提交
git rebase -i HEAD~3
交互式变基操作选项:
pick
:保留提交reword
:修改提交信息edit
:修改提交内容squash
:合并到前一个提交fixup
:合并到前一个提交但不保留提交信息drop
:删除提交
五、远程仓库操作
5.1 远程仓库基础
查看远程仓库:
bash
git remote -v
添加远程仓库:
bash
git remote add origin https://github.com/user/repo.git
修改远程仓库:
bash
git remote set-url origin https://github.com/user/new-repo.git
5.2 拉取与推送
拉取远程更新:
bash
git pull origin main
推送本地分支:
bash
git push origin feature-branch
# 首次推送设置上游分支
git push -u origin feature-branch
删除远程分支:
bash
git push origin --delete feature-branch
5.3 克隆与同步
克隆指定分支:
bash
git clone -b branch-name https://github.com/user/repo.git
同步远程分支列表:
bash
git fetch origin
六、高级操作
6.1 Cherry-pick(选择性合并)
挑选单个提交:
bash
git cherry-pick <commit-hash>
挑选多个提交:
bash
git cherry-pick <hash1> <hash2> <hash3>
挑选连续提交范围:
bash
git cherry-pick <start-hash>^..<end-hash>
6.2 Stash(暂存工作区)
保存当前工作进度:
bash
git stash
# 添加描述信息
git stash save "Work in progress"
# 包含未跟踪文件
git stash -u
查看stash列表:
bash
git stash list
应用stash:
bash
# 应用最近的stash
git stash apply
# 应用指定stash
git stash apply stash@{1}
# 应用并删除stash
git stash pop
删除stash:
bash
# 删除最近的stash
git stash drop
# 删除指定stash
git stash drop stash@{1}
# 清空所有stash
git stash clear
6.3 标签管理
创建轻量标签:
bash
git tag v1.0.0
创建附注标签(推荐):
bash
git tag -a v1.0.0 -m "Initial stable release"
对历史提交打标签:
bash
# 先查找提交哈希
git log --oneline
# 对指定提交打标签
git tag -a v0.9.0 <commit-hash> -m "Previous release"
查看标签:
bash
git tag
git show v1.0.0
推送标签:
bash
# 推送单个标签
git push origin v1.0.0
# 推送所有标签
git push origin --tags
删除标签:
bash
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0
6.4 .gitignore文件
创建.gitignore文件:
bash
touch .gitignore
常用配置示例:
plaintext
# 忽略操作系统文件
.DS_Store
Thumbs.db# 忽略日志文件
*.log# 忽略环境变量文件
.env
.env.local# 忽略依赖文件夹
node_modules/
vendor/
dist/
build/# 忽略IDE配置
.idea/
.vscode/
*.swp
*.swo
如果文件已被跟踪,需要先移除:
bash
git rm --cached filename
七、冲突解决
7.1 冲突产生原因
Git冲突通常在以下情况发生:
- 同一文件的同一部分在不同分支被修改
- 一个分支删除文件,另一个分支修改该文件
- 二进制文件的修改无法自动合并
7.2 解决冲突步骤
-
发现冲突:Git会在合并时提示冲突文件
-
查看冲突文件:
bash
git status
- 编辑冲突文件: 冲突文件中会标记冲突区域:
plaintext
<<<<<<< HEAD
当前分支的内容
=======
待合并分支的内容
>>>>>>> feature-branch
- 解决冲突: 手动编辑文件,保留需要的内容,删除冲突标记
-
标记为已解决:
bash
git add <resolved-file>
- 完成合并:
bash
git commit -m "Resolve merge conflicts"
7.3 冲突解决工具
使用VS Code解决冲突:
bash
git config --global merge.tool vscode
git mergetool
快速选择版本:
bash
# 保留当前分支版本
git checkout --ours <file>
# 采用传入更改
git checkout --theirs <file>
七、Git工作流
7.1 功能分支工作流
适合中小团队协作:
bash
# 1. 确保主分支是最新的
git checkout main
git pull# 2. 创建功能分支
git checkout -b feature/feature-name# 3. 开发并提交
git add .
git commit -m "feat: implement feature"# 4. 定期同步主分支更新
git fetch origin
git rebase origin/main# 5. 推送分支
git push origin feature/feature-name# 6. 合并完成后删除分支
git checkout main
git merge feature/feature-name
git branch -d feature/feature-name
7.2 Git Flow工作流
适合有计划发布周期的项目,定义了多种分支类型:
main
:生产环境代码develop
:开发集成分支feature/*
:功能开发分支release/*
:发布准备分支hotfix/*
:紧急修复分支
基本操作流程:
bash
# 1. 从develop创建功能分支
git checkout develop
git checkout -b feature/new-feature# 2. 功能完成后合并回develop
git checkout develop
git merge --no-ff feature/new-feature
git branch -d feature/new-feature# 3. 创建发布分支
git checkout -b release/1.0.0 develop# 4. 发布完成后合并到main和develop
git checkout main
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "Release 1.0.0"git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0# 5. 紧急修复
git checkout main
git checkout -b hotfix/1.0.1
# 修复完成后合并到main和develop
git checkout main
git merge --no-ff hotfix/1.0.1
git tag -a v1.0.1 -m "Hotfix 1.0.1"git checkout develop
git merge --no-ff hotfix/1.0.1
git branch -d hotfix/1.0.1
7.3 GitHub Flow工作流
适合持续部署的项目,流程简洁:
- 从main分支创建功能分支
- 提交更改并推送到远程
- 创建Pull Request
- 代码审查通过后合并到main
- 自动部署
八、Git最佳实践
8.1 提交规范
采用Conventional Commits规范:
bash
# 格式: type(scope): description
git commit -m "feat(auth): add oauth2 integration"
git commit -m "fix(api): resolve timeout issues"
git commit -m "docs(readme): update installation instructions"
git commit -m "refactor(database): optimize query performance"
常用类型:
feat
: 新功能fix
: 错误修复docs
: 文档更新style
: 代码格式调整refactor
: 代码重构perf
: 性能优化test
: 添加测试chore
: 构建过程或辅助工具变动
8.2 分支命名规范
推荐格式:
plaintext
feature/feature-name
bugfix/bug-description
hotfix/critical-issue
docs/documentation-update
refactor/code-improvement
8.3 代码审查与PR流程
创建审查友好的PR:
bash
# 保持提交粒度适中
git add auth/login.py
git commit -m "feat(auth): implement basic login"
git add auth/logout.py
git commit -m "feat(auth): add logout functionality"
8.4 避免常见错误
不要直接推送到主分支:
bash
# 错误
git push origin main# 正确
git push origin feature/feature-name
# 然后通过PR合并
不要修改已推送的公共历史:
bash
# 危险操作,会重写历史
git rebase -i HEAD~3
git push --force# 安全替代方案
git commit --fixup <commit-hash>
九、Git钩子
Git钩子是在特定Git命令执行前后自动运行的脚本,位于.git/hooks
目录。
常用钩子:
pre-commit
: 提交前执行,可用于代码检查commit-msg
: 验证提交信息格式pre-push
: 推送前执行,可用于运行测试
配置示例(pre-commit钩子):
bash
#!/bin/sh
# 提交前运行代码检查
npm run lint
# 运行测试
npm test
启用钩子:
bash
chmod +x .git/hooks/pre-commit
cp .git/hooks/pre-commit.sample .git/hooks/pre-commit
十、常见问题与解决方案
10.1 撤销已推送的提交
创建恢复提交:
bash
git revert <commit-hash>
git push origin main
10.2 找回丢失的提交
使用reflog查找提交:
bash
git reflog
# 找到需要恢复的提交哈希后
git checkout <commit-hash>
# 创建新分支保留该提交
git checkout -b recover-branch
10.3 处理大型文件
使用Git LFS(Large File Storage):
bash
# 安装Git LFS
git lfs install
# 跟踪大型文件
git lfs track "*.psd"
git add .gitattributes
10.4 减少仓库大小
清理历史中的大文件:
bash
# 查找大文件
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | paste -sd '|' -`# 使用BFG Repo-Cleaner工具清理
bfg --strip-blobs-bigger-than 100M my-repo.git
十一、总结
Git是一个功能强大的版本控制系统,掌握它需要理解其核心概念和工作流程。本教程涵盖了从基础安装配置到高级操作的全部内容,包括:
- Git的核心概念和工作原理
- 本地仓库操作和远程协作
- 分支管理和合并策略
- 高级功能如rebase、cherry-pick和stash
- 冲突解决和工作流设计
- 最佳实践和常见问题处理
通过持续实践这些命令和工作流,你将能够高效地使用Git进行版本控制和团队协作。记住,熟练掌握Git的关键在于理解其设计思想并经常使用。
附录:Git命令速查表
基础操作
git init
: 初始化仓库git add
: 添加文件到暂存区git commit
: 提交暂存区到仓库git status
: 查看工作区状态git log
: 查看提交历史
分支操作
git branch
: 列出/创建分支git checkout
: 切换分支git switch
: 切换分支(新版)git merge
: 合并分支git rebase
: 变基操作
远程操作
git clone
: 克隆远程仓库git pull
: 拉取远程更新git push
: 推送本地分支git remote
: 管理远程仓库
高级操作
git cherry-pick
: 选择性合并提交git stash
: 暂存工作区git tag
: 标签管理git reset
: 重置当前HEADgit revert
: 创建恢复提交
冲突解决
git mergetool
: 使用工具解决冲突git checkout --ours/--theirs
: 选择版本git add
: 标记冲突已解决