🎯 1. Git 简介
Git 是一个分布式版本控制系统,由 Linus Torvalds 开发,主要用于追踪文件和目录的变化。它允许开发者在本地仓库中记录变更历史,同时支持与远程仓库的协作开发。
🌟 Git 的核心优势
- 分布式:每个开发者都有完整的代码仓库副本
- 快速:大多数操作在本地执行,速度极快
- 安全:数据完整性保证,使用 SHA-1 哈希算法
- 灵活:支持多种工作流和协作模式
- 离线工作:本地操作无需网络连接
Git 工作原理
Git 通过维护一个包含文件和目录状态的快照系统来工作。每次提交时,Git 都会创建一个快照并保存。
graph TD
A[工作目录 Working Directory] -->|git add| B[暂存区 Staging Area]
B -->|git commit| C[本地仓库 Local Repository]
C -->|git push| D[远程仓库 Remote Repository]
D -->|git pull| C
C -->|git checkout| A
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
style D fill:#fff3e0
⚙️ 2. Git 安装与配置
2.1 安装 Git
Windows 系统
# 下载并安装 Git for Windows
https://git-scm.com/download/win
macOS 系统
# 使用 Homebrew 安装
brew install git
# 或从官方下载安装包
https://git-scm.com/download/mac
Linux 系统 (Ubuntu/Debian)
sudo apt update
sudo apt install git
2.2 初始配置
安装完成后,需要进行基本的用户信息配置:
# 配置用户名
git config --global user.name "你的姓名"
# 配置邮箱
git config --global user.email "[email protected]"
# 设置默认分支名
git config --global init.defaultBranch main
# 查看配置
git config --list
💡 提示: 使用 `<code>--global</code>` 参数会配置全局设置,对所有项目生效。如果想要为特定项目配置不同的用户信息,可以在项目目录中移除 `<code>--global</code>` 参数。
🔧 3. Git 基础操作
3.1 创建仓库
在现有目录中初始化仓库
git init
克隆远程仓库
git clone https://github.com/username/repository.git
# 或指定目录名
git clone https://github.com/username/repository.git my-project
3.2 基本工作流程
* 当前状态示例:
📁 my-project/
├── 📄 README.md
├── 📄 index.html
├── 📁 src/
└── 📁 .git/
检查文件状态
# 查看工作目录和暂存区的状态
git status
# 详细显示_changes be committed_区域中的变更
git status --porcelain
添加文件到暂存区
# 添加指定文件
git add filename.txt
# 添加所有变更的文件
git add .
# 添加当前目录及其子目录的所有文件
git add -A
# 交互式添加
git add -i
📝 git status 状态说明
- Untracked:新文件,尚未被 Git 跟踪
- Modified:已修改的文件
- Staged:已添加到暂存区的文件
- Committed:已提交到仓库的文件
提交变更
# 提交暂存区中的所有变更
git commit -m "提交信息"
# 将暂存区中的文件提交并自动添加已修改的文件
git commit -am "提交信息"
# 修改最后一次提交
git commit --amend -m "新的提交信息"
3.3 查看历史
查看提交历史
# 查看详细的提交历史
git log
# 简化显示,每个提交一行
git log --oneline
# 查看最近的 n 次提交
git log -n 3
# 显示提交历史的统计信息
git log --stat
# 图形化显示分支和合并历史
git log --graph --oneline --all
查看文件变更
# 查看工作目录和暂存区的差异
git diff
# 查看暂存区和最新提交的差异
git diff --staged
# 查看两个提交之间的差异
git diff commit1 commit2
# 查看特定文件的变更
git diff filename.txt
💡 实用技巧: 使用 `<code>git log --pretty=format:"%h - %an, %ar : %s"</code>` 可以自定义日志输出格式。
🌿 4. 分支管理
分支是 Git 的强大特性之一,它允许你在不影响主代码的情况下进行功能开发或bug修复。
4.1 分支基本操作
创建分支
# 创建新分支
git branch feature-login
# 创建并切换到新分支
git checkout -b feature-login
# 使用 switch 命令(Git 2.23+)
git switch -c feature-login
切换分支
# 切换到指定分支
git checkout main
git switch main
# 切换到上一个分支
git checkout -
查看分支
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看分支的最后提交
git branch -v
删除分支
# 删除已合并的分支
git branch -d feature-login
# 强制删除分支(即使未合并)
git branch -D feature-login
4.2 分支合并
合并分支
# 切换到要合并的目标分支
git checkout main
# 将 feature-login 分支合并到当前分支
git merge feature-login
🔄 合并类型
- Fast-forward:分支线性,无冲突
- Merge commit:分支有提交历史
- Conflict:同一文件被同时修改
解决合并冲突
# 查看冲突文件
git status
# 编辑冲突文件,保留需要的代码
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的代码
# =======
# 要合并分支的代码
# >>>>>>> feature-branch
# 标记为已解决
git add filename.txt
# 完成合并
git commit
4.3 变基 (Rebase)
变基是另一种整合分支的方法,它可以将一个分支的修改应用到另一个分支上。
# 变基当前分支到 main 分支
git rebase main
# 交互式变基(修改提交历史)
git rebase -i HEAD~3
# 变基冲突解决后继续
git rebase --continue
# 取消变基
git rebase --abort
⚠️ 注意: 不要对已经推送到远程仓库的提交进行变基,这会改变历史,可能导致其他人的工作出现问题。
graph LR
A[main 分支] --> C[合并前]
B[feature 分支] --> C
C --> D[git merge]
D --> E[产生合并提交]
F[main 分支] --> G[变基前]
B --> H[git rebase main]
G --> I[变基后 - 线性的提交历史]
style C fill:#ffebee
style D fill:#e8f5e8
style E fill:#fff3e0
style G fill:#ffebee
style I fill:#e8f5e8
🌐 5. 远程仓库操作
远程仓库是存储在网络上的代码仓库,通常用于团队协作和代码备份。
5.1 远程仓库管理
查看远程仓库
# 查看远程仓库列表
git remote
# 查看远程仓库详细信息
git remote -v
# 查看某个远程仓库的信息
git remote show origin
添加远程仓库
# 添加远程仓库
git remote add origin https://github.com/username/repository.git
# 添加带名称的远程仓库
git remote add upstream https://github.com/original/repository.git
修改远程仓库
# 修改远程仓库 URL
git remote set-url origin https://github.com/username/new-repository.git
# 重命名远程仓库
git remote rename origin upstream
删除远程仓库
# 删除远程仓库
git remote remove origin
5.2 推送和拉取
推送代码
# 推送到远程仓库
git push origin main
# 推送当前分支到远程
git push
# 推送到远程并设置上游分支
git push -u origin main
# 强制推送(谨慎使用)
git push --force
# 推送所有分支
git push --all
拉取代码
# 拉取远程更新
git pull origin main
# 拉取当前分支的远程更新
git pull
# 获取远程更新但不合并
git fetch
# 获取远程更新并清理已删除的远程分支
git pull --prune
💡 建议: 在推送代码前,先拉取远程更新以减少冲突:
`<code>git pull --rebase</code>`
`<code>git pull --rebase</code>`
5.3 跟踪分支
跟踪分支是与远程分支关联的本地分支。
# 查看跟踪分支
git branch -vv
# 创建跟踪分支
git checkout --track origin/feature-branch
# 设置现有分支跟踪远程分支
git branch --set-upstream-to=origin/feature-branch
# 取消分支的跟踪
git branch --unset-upstream
⚡ 6. 高级技巧
6.1 储藏 (Stash)
储藏可以临时保存工作目录的变更,让你可以切换到其他分支工作。
# 储藏当前工作目录的变更
git stash
# 储藏并添加描述信息
git stash push -m "临时保存修复bug的工作"
# 查看储藏列表
git stash list
# 应用最新的储藏
git stash pop
# 应用特定的储藏
git stash apply stash@{2}
# 删除储藏
git stash drop stash@{1}
# 清空所有储藏
git stash clear
6.2 标签 (Tags)
标签用于标记特定的提交,通常用于发布版本。
# 创建轻量级标签
git tag v1.0.0
# 创建带注释的标签
git tag -a v1.0.0 -m "Version 1.0.0 release"
# 查看标签列表
git tag
# 查看标签详细信息
git show v1.0.0
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push --tags
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin :refs/tags/v1.0.0
6.3 子模块 (Submodules)
子模块允许你将一个 Git 仓库作为另一个仓库的子目录。
# 添加子模块
git submodule add https://github.com/username/library.git libs/library
# 初始化并更新子模块
git submodule update --init --recursive
# 克隆包含子模块的仓库
git clone --recursive repository.git
6.4 重写历史
修改最近的提交
# 修改最后一次提交的描述
git commit --amend
# 修改最后一次提交并添加文件
git add forgotten-file.txt
git commit --amend
交互式变基
# 编辑最近3个提交的提交信息或合并、拆分提交
git rebase -i HEAD~3
# 在交互式变基中选择操作:
# p, pick <commit> = 使用提交
# r, reword <commit> = 编辑提交信息
# e, edit <commit> = 编辑提交
# s, squash <commit> = 合并到前一个提交
# f, fixup <commit> = 合并到前一个提交(丢弃提交信息)
⚠️ 重要: 只对尚未推送到远程仓库的提交进行历史重写。已推送的提交历史更改可能导致团队协作问题。
👥 7. 团队协作工作流
7.1 Git Flow
Git Flow 是一种成熟的工作流,适用于有定期发布周期的项目。
# 初始化 Git Flow
git flow init
# 开始新功能
git flow feature start feature-name
# 完成功能开发
git flow feature finish feature-name
# 开始发布
git flow release start 1.0.0
# 完成发布
git flow release finish 1.0.0
# 开始热修复
git flow hotfix start hotfix-name
# 完成热修复
git flow hotfix finish hotfix-name
graph TD
A[main] --> B[release 1.0.0]
B --> C[main 1.0.0 tag]
A --> D[develop]
D --> E[feature-login]
E --> D
D --> B
C --> F[hotfix]
F --> G[main 1.0.1 tag]
style A fill:#e1f5fe
style D fill:#e8f5e8
style B fill:#fff3e0
style C fill:#f3e5f5
style E fill:#ffebee
style F fill:#ffecb3
style G fill:#c8e6c9
7.2 GitHub Flow
GitHub Flow 是更适合持续部署的简单工作流。
- 从 `<code>main</code>` 分支创建功能分支
- 在功能分支上进行开发和提交
- 创建 Pull Request 请求代码审查
- 代码审查通过后合并到 `<code>main</code>` 分支
- 部署到生产环境
# 创建功能分支
git checkout -b feature/user-authentication
# 推送功能分支
git push origin feature/user-authentication
# 在 GitHub 上创建 Pull Request
# ... 代码审查 ...
# 审查通过后合并 Pull Request
7.3 Pull Request 工作流程
本地准备
# 1. 更新本地 main 分支
git checkout main
git pull origin main
# 2. 创建功能分支
git checkout -b feature/new-feature
# 3. 开发和提交
# ... 编写代码 ...
git add .
git commit -m "添加新功能"
# 4. 推送到远程
git push origin feature/new-feature
代码审查和合并
- 在 GitHub/GitLab 上创建 Pull Request
- 团队成员进行代码审查
- 根据反馈修改代码
- 测试通过后合并到目标分支
💡 最佳实践:
- 保持 Pull Request 小而专注
- 提供清晰的描述和测试说明
- 及时响应审查反馈
- 自动化测试和代码质量检查
🔧 8. 常见问题解决
8.1 合并冲突解决
识别冲突
# 查看冲突文件
git status
# 查看冲突详情
git diff
冲突标记示例
<<<<<<< HEAD
// 当前分支的代码
const userName = "Alice";
=======
// 要合并分支的代码
const userName = "Bob";
>>>>>>> feature-branch
解决冲突步骤
- 打开冲突文件,编辑代码
- 删除冲突标记 (<<<<<<, =======, >>>>>>>)
- 保存文件并测试
- 标记冲突已解决
- 完成合并
# 标记冲突已解决
git add filename.txt
# 完成合并
git commit
8.2 撤销操作
撤销工作目录的修改
# 撤销文件的修改(回到最近一次提交状态)
git checkout -- filename.txt
# 或者使用较新的语法
git restore filename.txt
撤销暂存区的修改
# 将文件从暂存区移回工作目录
git reset HEAD filename.txt
# 或者使用较新的语法
git restore --staged filename.txt
撤销提交
# 撤销最后一次提交(保留修改)
git reset --soft HEAD^
# 撤销最后一次提交(丢弃修改)
git reset --hard HEAD^
# 使用 revert 创建新的提交来撤销修改
git revert HEAD
8.3 恢复删除的提交
# 查看所有操作历史
git reflog
# 通过 reflog 恢复删除的提交
git checkout -b recovery-branch <sha-of-deleted-commit>
8.4 清理工作
# 清理未跟踪的文件和目录
git clean -fd
# 查看将要清理的内容(不实际删除)
git clean -n
# 清理忽略的文件
git clean -fdX
8.5 分支问题
恢复误删的分支
# 查看分支的删除记录
git reflog
# 通过提交哈希恢复分支
git checkout -b restored-branch <commit-hash>
切换分支时未提交冲突
# 储藏当前工作
git stash
# 切换分支
git checkout other-branch
# 回到原分支并恢复工作
git checkout original-branch
git stash pop
| 问题 | 解决方案 | 命令 |
|---|---|---|
| 提交了错误的文件 | 使用 amend 修改最后一次提交 | `git commit --amend` |
| 推送被拒绝 | 先拉取远程更新 | `git pull --rebase` |
| 想要撤销最后一次提交 | 使用 revert 创建反向提交 | `git revert HEAD` |
| 想要回到某个历史状态 | 创建新分支指向那个提交 | `git checkout -b new-branch <commit-hash>` |
🎯 总结
Git 是一个功能强大的版本控制系统,掌握它需要时间和实践。这份教程涵盖了 Git 的核心概念和常用操作,希望能帮助你更好地使用 Git 进行代码管理。
🔑 关键要点
- 理解 Git 的三个工作区域:工作目录、暂存区、仓库
- 掌握基本的 add、commit、push、pull 操作
- 学会使用分支进行功能开发和团队协作
- 了解不同的协作工作流
- 熟悉常见的冲突解决和错误恢复方法
📚 进一步学习
- 练习 Git 图形化工具(如 GitKraken、SourceTree)
- 学习 Git Hooks 和自动化流程
- 探索 Git 的高级功能和内部原理
- 参与开源项目获取实际经验